”
システム開発入門[Altera偏]を試してみる4(2.4アップダウン・カウンタのシミュレーション1) ”の続き。
今回は、btn_in.vの修正点と新たに作成したテストベンチ、updown_tb.v について説明する。
最初にbtn_in.v の変更点から説明する。
btn_in.v の50MHzを1250000分周して40Hzを作るen40hzの書き方をparameterを使用した書き方に変更させていただいた。
元のbtn_in.v の一部を下に示す。
reg [20:0] cnt; wire en40hz = (cnt==1250000-1);
下にparameterを使用した書き方を示す。
parameter DIV_VAL = 1250000; reg [20:0] cnt; wire en40hz = (cnt==DIV_VAL-1);
これで、テストベンチから、DIV_VALの値を変更することができる。
updown.v とbtn_in.v を通常にシミュレーションしたのでは、en40hzが1になるまでに、1250000クロックかかってしまう。これではシミュレーション時間がとても長くなってしまう。そこで、シミュレーションの時だけ、DIV_VALを2に設定して、2クロック間スイッチに1を入れておけば動作するようにした。このテクニックはVerilogだけ使えて、VHDLは使用できない。でも、シミュレーション時に再上位のテストベンチからシミュレーションしやすいようにのみ使うのが妥当だ。通常の論理合成可能な記述で使うと、何処でオーバーライトされているかわからずにバグの温床を抱えることになってしまう。
(注1:ちなみに、ModelSimであれば、
VHDLでもinit_signal_spyを使用して、VHDLの他の階層のsignalをミラーする 事ができる)
(注2:
VHDLの共有変数を使用すると、似たようなことが書ける )
次に、updown_tb.v を下に示す。
// UPDOWN.v用テストベンチ `default_nettype none `timescale 1ns/100ps module UPDOWN_tb; reg clk = 1'b0; reg rst = 1'b1; reg [2:0] nBUTTON = 3'b000; wire [6:0] nHEX0; integer j; // nBUTTON と押しボタンスイッチの対応 parameter RESET_SW_ENABLE = 3'b100; parameter DOWN_SW_ENALBE = 3'b010; parameter UP_SW_ENABLE = 3'b001; parameter SW_DISABLE = 3'b000; // スイッチのチャタリング防止用のイネーブルの間隔(シミュレーション用) parameter CHATTERING_INTR = 2; // クロック用のパラメータとクロック生成 parameter PERIOD = 20; parameter real DUTY_CYCLE = 0.5; parameter OFFSET = 0; initial begin #OFFSET; forever begin clk = 1'b0; #(PERIOD-(PERIOD*DUTY_CYCLE)) clk = 1'b1; #(PERIOD*DUTY_CYCLE); end end // UPDOWNモジュールのインスタンス UPDOWN UPDOWN_inst ( .CLK(clk), .RST(rst), .nBUTTON(nBUTTON), .nHEX0(nHEX0) ); // btn_in.vのDIV_VALの値をシミュレーションに都合が良いように変更する defparam UPDOWN_inst.BTN_IN.DIV_VAL = CHATTERING_INTR; // テストベンチ部分、各taskを呼び出してテストを行う initial begin #(PERIOD*2); // 2クロック待ってリセットを0にする rst = 1'b0; #1; // 遅延 @(posedge clk); // 次のクロックへ #1; // 遅延 UP_SW(4'd10); // 10回、UPスイッチを押す DOWN_SW(4'd7); // 7回、DOWNスイッチを押す RESET_SW; // RESETスイッチを押す #(PERIOD*5); // 5クロック待つ $stop; end // i回、UP_SWを押すtask (i < 16) task UP_SW; input [3:0] i; // バースト回数 begin @(posedge clk); // 次のクロックへ #1; // 遅延 while (i>0) begin nBUTTON = UP_SW_ENABLE; CHATTERING_WAIT; // チャタリング防止用の期間待つ nBUTTON = SW_DISABLE; CHATTERING_WAIT; // チャタリング防止用の期間待つ i=i-4'd1; end end endtask // i回、DOWN_SWを押すtask (i < 16) task DOWN_SW; input [3:0] i; // バースト回数 begin @(posedge clk); // 次のクロックへ #1; // 遅延 while (i>0) begin nBUTTON = DOWN_SW_ENALBE; CHATTERING_WAIT; // チャタリング防止用の期間待つ nBUTTON = SW_DISABLE; CHATTERING_WAIT; // チャタリング防止用の期間待つ i=i-4'd1; end end endtask // RESET_SW を押すtask task RESET_SW; begin @(posedge clk); // 次のクロックへ #1; // 遅延 nBUTTON = RESET_SW_ENABLE; CHATTERING_WAIT; // チャタリング防止用の期間待つ nBUTTON = SW_DISABLE; CHATTERING_WAIT; // チャタリング防止用の期間待つ end endtask // チャタリング防止用の期間Waitするtask task CHATTERING_WAIT; begin for (j=CHATTERING_INTR; j>0; j=j-1) begin // チャタリング防止用の期間、値を保持する @(posedge clk); // 次のクロックへ #1; // 遅延 end end endtask endmodule `default_nettype wire
部分的な解説 // クロック用のパラメータとクロック生成 parameter PERIOD = 20; parameter real DUTY_CYCLE = 0.5; parameter OFFSET = 0; initial begin #OFFSET; forever begin clk = 1'b0; #(PERIOD-(PERIOD*DUTY_CYCLE)) clk = 1'b1; #(PERIOD*DUTY_CYCLE); end end
上の部分はクロックを生成する記述だ。確か、何処かで見て、参考にさせていただいている。
これだと、クロックサイクル、デューテー・サイクル、オフセットを指定することができる。注意が必用なのは、時間分解能がns だとしたら、きちんと割り切れる値にする必要が有ることだ。上の場合は例えば、PERIODを奇数にしてしまうと、小数点が出てしまい切り捨てられるので、思った波形にならない。その場合は時間分解能を100ps などに変更する。
下の部分で、defparamを使用して、btn_in.vのDIV_VALに2を代入している。
// btn_in.vのDIV_VALの値をシミュレーションに都合が良いように変更する defparam UPDOWN_inst.BTN_IN.DIV_VAL = CHATTERING_INTR;
テストベンチの主な部分を下に示す。
// テストベンチ部分、各taskを呼び出してテストを行う initial begin #(PERIOD*2); // 2クロック待ってリセットを0にする rst = 1'b0; #1; // 遅延 @(posedge clk); // 次のクロックへ #1; // 遅延 UP_SW(4'd10); // 10回、UPスイッチを押す DOWN_SW(4'd7); // 7回、DOWNスイッチを押す RESET_SW; // RESETスイッチを押す #(PERIOD*5); // 5クロック待つ $stop; end
@(posedge clk); は、次のクロックの立ち上がりまで待つ記述となる。その後の#1の遅延は、現在、クロックの立ち上がりの瞬間にいるので、時刻を少しでもずらすために入れてある。デルタ時間も0では、次の@(posedge clk); がうまく動作しない可能性があるからだ。
UP_SWタスクは4ビット幅の引数を1つ持つ。引数にはUP_SWを押す回数を設定する。今回は10を設定している。
DOWN_SWタスクは4ビット幅の引数を1つ持つ。引数にはDOWN_SWを押す回数を設定する。今回は7を設定している。
RESE_SWタスクは引数を持たない。RESE_SWタスクを呼び出すと、RSETスイッチが1回押される。
UP_SWタスクを下に示す。
// i回、UP_SWを押すtask (i < 16) task UP_SW; input [3:0] i; // バースト回数 begin @(posedge clk); // 次のクロックへ #1; // 遅延 while (i>0) begin nBUTTON = UP_SW_ENABLE; CHATTERING_WAIT; // チャタリング防止用の期間待つ nBUTTON = SW_DISABLE; CHATTERING_WAIT; // チャタリング防止用の期間待つ i=i-4'd1; end end endtask
クロックの立ち上がりまで待って、遅延する。
UP_SWを1にしている。CHATTERING_WAITタスクを呼び出して、チャタリングが収まるまで待ってから、UP_SWを0にして、またCHATTERING_WAITタスクを呼び出す。これをi回繰り返している。
疲れてきたので、後の説明は省略する。
2011年10月30日 05:08 |
FPGAボードで学ぶ組込みシステム開発入門[Altera偏]
| トラックバック:0
| コメント:0
今日は、10時からFPGA-CAFEでAltium Designerの講習会に参加しました。やはり機能的にはDesignSpark PCBよりも上だと感じました。そりゃそうですよね。お高いソフトとフリーウェアの差です。
DesignSpark PCBも、PCBデザインでネット名が見えてると、配線の最後に拡大したときに繋ぎやすいんですがね。。。後、クリアランスを表示するときに移動すると、計測値が消えちゃうのが難点だと思います。でもフリーウェアとして立派な凄いソフトだと思います。
Altiumは、C to HDL機能もあるし、FPGA対応機能もあるので、使ってみたいと思っていました。仕事ではそういうニーズがないので、購入できません。なので、6万円くらいでしたら個人的に買ってみたいです。
セミナの後は、奥さんとイーアスで待ち合わせて、映画、”
三銃士/王妃の首飾りとダ・ヴィンチの飛行船 ”に行ってきました。3Dです。痛快でなかなか面白かったです。多分、続編があると思います。
最後に、ガス展に行きました。17年もガス台使っているので、そろそろ新しいのが欲しいとのことです。最近のガス台は機能満載です。温度調整、タイマー、ガラストップ、至れり尽くせりです。どうやら、買うことになりそう。約15万円。
私のAltium Designerの運命やいかに。。。
2011年10月29日 21:19 |
日記
| トラックバック:0
| コメント:0
FPGAボードで学ぶ組込みシステム開発入門[Altera偏] の第4弾は、2.4章のアップダウン・カウンタをシミュレーションしてみようと思う。
ダウンロードしたDE0用のプロジェクト では、dai2sho\updownだ。
Quartus IIでコンパイルして実機で確かめてみたが、問題なく動作した。
次にModelSimでシミュレーションを行う。ModelSimのバージョンは6.6d、Quartus II 11.0用。久しぶりのModelSimだ。
プロジェクトを作成して、Verilogファイルを追加し、シミュレーションを行う。なお、OKボタンをクリックするのは省略してある。
1.最初に、dai2sho\updownフォルダにSimulationフォルダを新規作成して、テストベンチファイル、updown_tb.vを入れておく。
2.ModelSimで、FileメニューからNew -> Project...を選択して、新規プロジェクトを生成する。
3.Create Projectダイアログが開く。Project Nameをupdownとして、Project Locationを1.で作成したSimulationフォルダに設定する。
4.Add item to the Projectダイアログが開く。Add Existing Fileをクリックして、ファイルをプロジェクトに追加する。
5.Add file to Projectダイアログが開く。File NameのBrowse...ボタンをクリックする。
6.Select files to add to projectダイアログが開く。btn_in.v, updown.v を選択して、開くボタンをクリックする。(btn_in.vはオリジナルのファイルから少し書き換えた。どう書き換えたかは後で述べる)
7.Add file to ProjectダイアログのFile Nameに2つのファイル名が入った。OKボタンをクリックする。
8.btn_in.v, updown.v がModelSimのProjectウインドウに追加された。
9.もう一度、Add item to the Projectダイアログで、Add Existing Fileをクリックして、Simulationフォルダのupdown_tb.v もProjectウインドウに追加する。Add item to the ProjectダイアログをCloseボタンをクリックして閉じる。
10.CompileメニューからCompile Order...を選択する。Compile Orderダイアログが開く。Auto Generateをクリックする。
11.updown_tb.v にバグがあったので修正したが、コンパイルが成功すると、ダイアログが表示される。これでコンパイルは終了した。
12.Compile OrderダイアログをOKボタンで閉じる。
13.シミュレーションを開始する。SimulatonメニューからStart Simulation...を選択する。
14.Start Simulationダイアログが開く。Designタブのworkを展開して、UPDOWN_tbを選択し、OKボタンをクリックする。(今回はAlteraのライブラリは使わないので、その他のタブはそのままとする)
15.シミュレーション画面に変更された。Objectsウインドウのclk, rst, nBUTTON, nHEX0を選択して、Waveウインドウにドラック&ドロップした。
16.InstanceウインドウでUPDOWN_instを選択すると、updown.vの信号がObjectsウインドウに表示される。
17.これらの信号をWaveウインドウに追加する前に、目印にDividerをWaveウインドウに挿入しよう。Waveウインドウで右クリックメニューからInsert Dividerを選択する。
18.Wave Divider Propertiesダイアログが開く。Divider NameにUPDOWNと入力して、OKボタンをクリックする。
19.updown.vの信号をすべて、Waveウインドウにドラック&ドロップする。BTN_INの信号も同様にDividerを作っって、ドラック&ドロップした。
20.いよいよシミュレーションを開始する。アイコンをクリックしても良いのだが、Transcriptウインドウで"run -all"と入力してシミュレーションを走らせる。テストベンチに$stop;を書いてあるので、そこまでシミュレーションを行うことができる。
20.updown_tb.v の$stop;行でシミュレーションが停止する。
21.Waveウインドウに戻ると波形が表示されているが、一部で見にくい。全体を表示させるために、zoom Fullアイコンをクリックする。
22.Waveウインドウの全体が表示された。
(注)本のVerilogファイルをそのままシミュレーションしても上の波形にはなりません。 btn_in.vをいじってあります。どういじってあるかは第2回目を参照ください。
23.今、7セグメントLEDに何を表示しているかを見るために、updown.vの[3:0] udcntを符号なし十進数で表示してみましょう。そうするには、右クリックメニューからRadixをUnsigned に設定します。
24.udcntが0から10までアップ・カウントして、そこから3までダウン・カウントして、次に0にリセットされているのが見えます。
25.CTRL+左クリックドラックで指定範囲を拡大できます。
26.udcntが0の時のnHEX0を見ると"1000000"です。これが7セグメントLEDの点灯パターンになります。これは、gセグメントのみ消灯で、それ以外のa, b, c, d, e, fセグメントが点灯します。つまり、8の真ん中の棒のみ消灯なので、0に見えます。7セグメントLEDの点灯表は、本の44ページの表2-2 7セグメントLEDデコーダの真理値表に書いてあります。
また最初からシミュレーションをしたいときは、Trascriptウインドウで、
restart -f run -all
を入力します。
これで第1回目は終了です。第2回目は、btn_in.vの修正部分とupdown_tb.vのテストベンチについて書くことにします。
”
システム開発入門[Altera偏]を試してみる4(2.4アップダウン・カウンタのシミュレーション2) ”に続く。
2011年10月29日 06:03 |
FPGAボードで学ぶ組込みシステム開発入門[Altera偏]
| トラックバック:0
| コメント:0
”
ステレオカメラ基板作成4(OV7670基板4) ”の続き。
届いたSpartan-3A Starter Kit用のステレオカメラ基板にコネクタとパスコンを実装した。CAM1のみ
aitendoのOV7670モジュール を実装してテストした。(以前は赤い色の基板でした)
画像が表示できなくて焦ったが、画面キャプチャスイッチを入れ忘れていたためだった。ONにすると画像が表示できた。
CAM1が成功したので、CAM3(CAM2はない)も実装してテストした。
こっちはすんなり成功した。
これで両方のカメラモジュールの動作が確認できた。初めて自分で作ってもらったプリント基板は大成功だった。こんな配線しかない簡単な基板を作るだけでも、いろいろわからないことばかりで大変だった。
いろいろアドバイスしていただいた皆さん、本当にありがとうございました。また、近い内に基板を作ると思うので、またアドバイスお願いします。
次は、すぐにでも
aitendoのOV9655モジュール 用の基板を作りたい。
その次はHDMIコネクタを実装する基板をSpartan-3A Starter Kit用に作りたいと思っている。(HDMIコネクタは購入済み)
2011年10月28日 04:32 |
プリント基板作成
| トラックバック:0
| コメント:3
10月9日に”
ステレオカメラ基板作成3(OV7670基板3) ”で発注したOV7670のステレオ基板ですが、10月12日に基板外形がないと言われて、”
DesignSpark PCBでガーバーファイルにBoard Outlinesを追加する ”で基板外形を追加して、送り直し、In productionになりました。
そして、今日基板が到着しました!!!やった~。嬉しいです。
Fusion PCB に頼んでからの軌跡を下に示します。
10/09/2011 Confirmed 10/09/2011 Confirmed PayPal status: Completed @ 22:13:49 Oct 09, 2011 PDT Trans ID:************* Amount: 38.42 USD 10/11/2011 Processing 10/12/2011 In production 10/17/2011 Shipped 10/17/2011 Traceabl eplease enter your order number at 国際郵便の記録 10月18日 16:00 引受 HONG KONG 10月21日 15:15 国際交換支店から発送 KOWLOON D HONG KONG 10月24日 15:55 国際交換支店に到着 成田国際空港支店 千葉県 10月25日 9:00 通関手続中 成田国際空港支店 千葉県 10月25日 11:15 国際交換支店から発送 成田国際空港支店 千葉県 10月26日 5:46 到着 筑波学園支店 茨城県 10月26日 14:39 お届け先にお届け済み 筑波学園支店**集配センター 茨城県
到着した時のパッケージです。
中身です。基板となぜか?髑髏バッチが入っていました。髑髏バッチはスイッチを入れると目と口が光ります。これはもしかして?サイトが乗っ取られたドクロマークのパロディ?そうとすればブラックすぎる~~~。
基板は全部で14枚入っていました。その内の5枚はテープでまとめられているので、これが検査済みみたいです。
基板の裏表です。基板のレジストの色は黄色です。
ヒロセの100ピンコネクタがピッタリ入りました。穴位置もピッタリ。自分でDesignSpark PCB でPCBシンボルを作ったので、ピッタリ入って嬉しいです。
早く部品をハンダ付けして、テストしてみたいです。
2011年10月26日 22:30 |
プリント基板作成
| トラックバック:0
| コメント:0
”
FPGAボードで学ぶ組込みシステム開発入門[Altera偏]を試してみる2(疑問) ”の続き。
今回は
ダウンロードしたDE0用のプロジェクト のdai2sho\seg7dec_ffをやってみようと思う。
QuartusII を立ち上げて、プロジェクトをロードし、コンパイルしたが、エラーが発生した。
あれ~、おかしいな?とその上の階層にあるREADME.txtを見たら載っていた。ここに引用する。
(注) seg7dec_ffは、このままコンパイルするとエラーになります。 ライブラリがCドライブからの絶対パスで登録されているため、 パスが異なると参照できなくなります。本文の2-3-3を参照して、 seg7decのライブラリ登録をし直してください。
パスが絶対パスで登録されているからのようだ。XilinxでもCoregenのcoeファイルが絶対パスでこの前困ったばかりだ。
さて、seg7decのシンボルを作成すれば良いはずなので、シンボルを作成しようとしたら、このフォルダ内にはないみたいだった。そうか、前のseg7decのシンボルを作って、それを登録するわけね。
seg7decプロジェクトに戻って、シンボルを作成した。
もう一度、seg7dec_ffプロジェクトに戻って、AssignmentsメニューからSettings...を選択して、出てきたSettingsダイアログのLibrariesのProject Librariesにseg7decを追加した。前に書かれていたseg7decのライブラリは消去した。
seg7dec_ff.bdfのseg7decをダブルクリックすると、seg7dec.bdfが開くようになった。これでOK。
もう一度コンパイルした。
今度は成功した。
Programmerで書きこむと動作した。
nBUTTONやSWのWeak Pullupはoffだったので、onにしておいた。”
FPGAボードで学ぶ組込みシステム開発入門[Altera偏]を試してみる2(疑問) ”参照。
2011年10月26日 06:01 |
FPGAボードで学ぶ組込みシステム開発入門[Altera偏]
| トラックバック:0
| コメント:0
”
Spartan-3A Starter KitでEDKを使ってカメラ表示28(ソフトでカメラを制御) ”の続き。
”
XPSでChipScope Proコアを追加してデバック1 ”と”
XPSでChipScope Proコアを追加してデバック2 ”で、XPSでChipScope ProをIPとして追加して、rot_a, rot_b, rot_centerの様子を観察したら、rot_a, rot_bがPULLUPされているはずなのに、値が0になっていた。
(rot_a, rot_b はロータリー・エンコーダの接点、rot_center はセンタースイッチ、詳しくは、
Spartan-3A/3AN スタータ キット ボード ユーザー ガイド (UG334) の30ページ、”ロータリー プッシュボタン スイッチ”を参照のこと)
XPSのUCF制約でPULLUP指定されているはずなのに、PULLUPされていないのはなぜか?調べてみることにした。
FPGA Editorでrot_a, rot_b, rot_centerのPADの属性を調べた。
rot_aのIBUFを下に示す。
設定値部分を拡大した。
PULLUPにチェックが入っていない。rot_bも同様だった。rot_centerもPULLDOWNにチェックが入っていなかった。
それじゃ、ISE12.4でインプリメントした回路はどうだったか?というと、”
画像テルミン2 ”をFPGA Editorで見てみた。(こっちはEDKは未使用で、Simple MicroBlazeを使用して、ISEのみで構築してある)
rot_aのIBUFを下に示す。
PULLUPにチェックが入っていた。rot_bも同様だった。rot_centerはPULLDOWNにチェックが入っていた。
ちなみに、UCFはどちらも同じで下のように記述してある。これは、Spartan-3A/3AN スタータ キット ボード ユーザー ガイド (UG334)に示された制約を丸写ししている。
NET "rot_center" LOC = "R13" | IOSTANDARD = LVTTL | PULLDOWN ; NET "rot_a" LOC = "T13" | IOSTANDARD = LVTTL | PULLUP ; NET "rot_b" LOC = "R14" | IOSTANDARD = LVTTL | PULLUP ;
”
制約ガイド UG625 (v. 13.2) 2011年7月6日 ”を見ると、3ページの改訂履歴に下のように書いてあった。(引用)
PULLUP, PULLDOWNについて記述されている。これは、ISE13.2で何かが変わったのかもしれない?
現在のISE13.2の制約を下のように変更してみた。
NET "rot_center" LOC = "R13" | IOSTANDARD = LVTTL | PULLDOWN = TRUE ; NET "rot_a" LOC = "T13" | IOSTANDARD = LVTTL | PULLUP = TRUE ; NET "rot_b" LOC = "R14" | IOSTANDARD = LVTTL | PULLUP = TRUE ;
これでも以前同様、PULLUP, PULLDOWNにチェックが入らなかった。(XPSで制約している)
次に、制約を下のように変更してみた。
NET "rot_center" LOC = "R13" | IOSTANDARD = LVTTL; NET "rot_center" PULLDOWN; NET "rot_a" LOC = "T13" | IOSTANDARD = LVTTL; NET "rot_a" PULLUP; NET "rot_b" LOC = "R14" | IOSTANDARD = LVTTL; NET "rot_b" PULLUP;
また、以前同様、PULLUP, PULLDOWNにチェックが入らなかった。(XPSで制約している)
どうやっても、PULLUP, PULLDOWN制約が入らない。困った。。。
ISEの方に、system_top_pull.ucfを新規作成した。内容を下に示す。
NET "rot_center" PULLDOWN; NET "rot_a" PULLUP; NET "rot_b" PULLUP;
これでインプリメントし、FPGA Editorで見たところ、うまく行った。
rot_aのIBUFの画面を下に示す。
rot_bにPULLUP、rot_centerにPULLDOWNのチェックが入っていた。
ということは、
13.2のXPSでPULLUP、PULLDOWN制約をしても、インプリメント結果に反映されない。ISE13.2でPULLUP、PULLDOWN制約をすると、インプリメント結果に反映される。 ということのようだ。
これで、SDKを立ち上げ、ソフトウェアを入れてビットファイルをダウンロードすると、ロータリー・エンコーダが動作した。これで完璧と思ったら、カメラの表示がおかくなっていた。
前回から入れたのは、ChipScope Proだけなので、iconとilaをXPSで削除して、もう一度やってみたら、カメラの表示が写った。
タイミングは全てメットしていたのだが、やはり、ChipScope Proを入れると、おかしくなることがあるようだ。
一応、これで完成だ。。。
2011年10月25日 06:05 |
EDK
| トラックバック:0
| コメント:0
昨日、iPhone4Sを2台購入しました。私が黒で、奥さんが白です。写真は黒。
3GSからの乗り換えです。iCloudでパソコンレスで同期しようとしましたが、やり方が分からず、パソコンで同期しました。
でも、最近、iTunesは具合が悪く、アプリの同期の途中で止まってしまいます。4Sにアプリをインストール途中で止まっちゃいました。
4Sのインストール途中のアプリを全部消して、もう一度、パソコンで同期しましたが、やはりだめでした。
iTunesをリカバリして、やっとアプリが同期できました。
今度は、音楽のコピーです。音楽は同期から外しているので、iTunesからコピーなんですが、これまた曲名だけ入って、音楽のファイル本体がコピーされません。何回かUSBケーブルを付けはずして、午後11過ぎまでかかってやっと思い通りにできました。
4Sのカメラは良いようです。
下が3GSのカメラで取った写真です。ちょっとぶれてしまいました。
同じところを4Sで取りました。同じようにPaint.NETで640X480に縮小してあります。
やはり、3GSよりアプリの起動とかが速い気がします。
2011年10月24日 20:01 |
日記
| トラックバック:0
| コメント:2
昨日は母校のホームカミングデーに行ってきました。
懐かしい研究室の同級生と待ち合わせて会って来ました。30年ぶりです。皆、ほとんど変わりがなかったです。ホームカミングデーの後で個別に飲み会にも行って、楽しい時間を過ごすことができました。
サプライズもありました。30年前に卒業研究でZ80のマイコンシステムを作りました。Z80(2.5MHz動作)、48KバイトSRAM。インタフェースは紙テープリーダー、紙テープライター、CRTディスプレイ、スイッチ入力、カセットインターフェースでした。このシステムを4人で、ラックから作りました。
その時書いたマニュアルを同級生の1人が持って来ました。ほんとうに驚きました。そしてそれは、製本されていました。今は亡き先生が製本してくれたとのことでした。飲み会の席では、30年前にタイムスリップしたように、その当時の話で盛り上がりました。
今から考えると、マルチ・タスクモニタを持ったシステムをよく1年で0から開発できたな?と思います。紙テープをリードしながら、他の処理が実行できていました。3日間研究室で徹夜してCRTディスプレイ装置を作ったことが懐かしく思い出されます。
当時、私は、CRTディスプレイ装置とカセットインターフェースを作っていました。カセットインターフェースは、サッポロシティ・スタンダードといって、カンサスシティ・スタンダードよりも高いビットレート(と言っても2400bps程度だったと思いますが)でデータを入出力出来る企画でした。これがうまく行かず、ウインドウ・コンパレータなどをOPアンプで実装して頑張っていたのですが、どうしてもうまく行きませんでした。これは後から考えると、調歩同期のクロックを1/1で使ってしまったためでした。当時はわからなかったんです。
大学4年の時は、それに気が付かなかったと思っていたのですが、同級生から卒業までにそれに気づいて、うまく行ったということを教えてもらいました。なんか肩の荷が降りた気がしました。
いろいろお話できて、本当に嬉しかったです。博多から飛行機で来てくれた同級生もいました。また、死ぬまでにお話ししたいと思っています。
2011年10月23日 05:54 |
日記
| トラックバック:0
| コメント:3
”
XPSでChipScope Proコアを追加してデバック1 ”の続き。
Project Navigator のAnalyze Design Using Chipscope をダブルクリックして、ChipScope Pro Analyzer を立ち上げた。
左上のOpen Cable/Search JTAG Chainアイコンをクリックして、FPGAを捜す。
FPGAとコンフィグROMが見つかった。OKボタンをクリックする。
左上のウインドウにXC3S700AとXCF04Sが表示された。XC3S700Aを選択して、右クリックメニューからConfigure...を選択する。
ChipScope Pro Analyzerのダイアログが表示された。OKボタンをクリックする。
ChipScope Pro Analyzerは下のような状態になった。
これでは信号名が入っていないので、信号名をインポートする。
FileメニューからImport...を選択する。Signal Importダイアログが表示されるので、system\implementation\chipscope_ila_0_wrapper\chipscope_ila_0.cdcを選択する。
Auto-create Buses Warningダイアログが表示される。了解ボタンをクリックする。
そうすると、WaveformにSignal名が表示された。
これで通常にChipScope Proでデバックをすることができる。
なお、今回はトリガ信号とデータ信号が同一だが、トリガ信号とデータ信号を異なる信号を入れる場合は、”
11.1 EDK - ChipScope Pro ILA コアのデータ ポートに信号を接続する方法 ”を参照のこと。
2011年10月22日 06:15 |
Chipscope
| トラックバック:0
| コメント:0
Spartan3シリーズでは、BSCANユニットが1個しか入っていないため、MicroBlazeでMDMユニットが入っているとChipScope Pro Inserter でChipScope Proを挿入することができなかった。(”
The Simple MicroBlaze Microcontroller 17 (ChipScope Proによるデバックの問題点) ”参照)
EDKでは、XPS上でChipScope ProのコアをAdd IPすることによって、ChipScope Proを使用することができるようだ。それをやってみようと思う。この場合にはBSCANユニットをMDMとChipScope Proで共有すると思われる。
XPSでDebugメニューからDebug Configuration...を選択する。
Debug Configurationダイアログが表示された。Moniter Hardware Signalsを選択されていた。左下のAdd ChipScope Peripheral...ボタンをクリックする。
Add New ChipScope Peripheralダイアログが表示された。To monitior arbitrary system level signals (adding ILA) のラジオボタンをクリックする。今回はrotary_encoder のデバックなので、ILAを選択した。
Debug Configuraitonダイアログが表示された。BasicタブでAvailable Ports on InstanceからExternal Portsを選択し、rot_a, rot_b, rot_centerを選択して、Add >>ボタンをクリックし、Signals Monitored by:に入れる。
Select the clock to be used monitoring: をclk_62_5000MHzに変更した。
Advancedタブをクリックして、UserタブのMiscを選択し、Use The ILA Trigger Signals As The ILA Data Signal のチェックを外す。これを外すと編集できるようになるので、Width of ILA Data Input Signalを32から16に変更した。これはデータサンプル数が1024で、データ幅が32ビットだと、1つのBRAMに収まらないからだ。
次に、Trigger Uinitをクリックして、Match Type for Trigger Unit0をbasicからbasic with edges に変更した。
もう一度、Miscをクリックして、Use The ILA Trigger Signals As The ILA Data Signal のチェックを入れた。これでOKボタンをクリックした。
XPSに戻ると、chipscope_icon_0とchipscope_ila_0が追加されていた。
これでXPSを終了して、Project Navigator でインプリメントした。
インプリメントが終了した。やはり、BRAMは100%の使用率になった。
2011年10月22日 05:37 |
Chipscope
| トラックバック:0
| コメント:0
”
FPGAボードで学ぶ組込みシステム開発入門[Altera偏]を試してみる1 ”で、dai2sho\seg7decをやってみたのだが、1つ疑問がある。(Quartus II のバージョンは11.0)
43ページの”図2-4 スイッチと7セグメントLEDの接続”でスイッチを見ると、2接点型のスイッチを使用して、上側の端子を抵抗を通して電源に、下側の端子をGNDに、真ん中の端子からFPGAのSW入力に接続されている。この接続の場合は、通常は真ん中の端子は上下の端子のどちらかに付いているが、スイッチが片側からもう片側に移動する時間にハイ・インピーダンスになってしまうという問題があると思う。少なくとも数ms はそうなるのではないだろうか?
その間はFPGAの入力端子がハイ・インピーダンス状態となってしまう。従って、FPGAの入力端子はプルアップが必要になると思われる。
SW[0]のプロパティをChip Plannerで見てみると、Weak pullupはoff になっていた。
Weak pullup以外にもマニュアルを見るとバス・キーパーとかがあるようなのだが、何処でONするかわからない?とりあえずWeak pullupをONしてみることにした。
多分、Pin Plannerでできるのだと思うので、Pin Plannerを起動して、Groupsウインドウで右クリックしてみた。Customize Columnsを選択した。
Customize Columnsダイアログが表示された。右のAvailable columns をスクロールするとWeak Pull-Up Resistor があったので、右のShow these columns in this order に入れて、OKボタンをクリックした。
SW[3..0]のグループのWeak Pull-Up ResistorをONにした。
Pin Plannerを閉じて、Quartus II でもう一度コンパイルした。コンパイルは以前と同様に成功した。
もう一度、Chip Planner でSW[0]を見ると、Weak pullupはonになっていた。
コンフィグレーションして確認すると、動作した。動作は以前と何も変わらない。
2011年10月21日 04:53 |
FPGAボードで学ぶ組込みシステム開発入門[Altera偏]
| トラックバック:0
| コメント:3
Alteraをやってみようとしたのだが、訳あってこっちを先にやってみることにした。
前回、”
Spartan-3A Starter KitでEDKを使ってカメラ表示27(独自にタイマーのカスタムIPを作る2) ”でSimple MicroBlaze用のタイマーを組み込んだら、うまく動作したので、SDKを立ち上げて、camera_controlプロジェクトを作成して、camera_control.cを作成した。このソフトウェアは、ロータリー・エンコーダを使用して、カメラのレジスタ設定を変更して、カメラのモードを変更するためのものだ。LCDにはそのステータスが表示される。これは、”
The Simple MicroBlaze Microcontroller 19 (SCCB設定レジスタを設定できたが...) ”で実装したCプログラムのアドレスや関数を一部変更して使用している。
そうすると、LCDの表示は問題なかった(つまり、smm_timerは正常動作)のだが、ロータリー・エンコーダを回しても表示が動かなかった。ロータリー・エンコーダのセンタースイッチは動作するので、左右に回す時がおかしいようだった。試しにFPGA Editorで見てみたが、rot_a, rot_bには正常に入力ピンがあったし、入力用FFに配線されていたので、問題ないようだった。
これはデバックをする必要があるが、BSCANユニットの関係でChipScope Pro Inserterは入れられない。それでは、XPSからChipScope Proを入れてみたい。ということで新シリーズスタートの予定。BRAMの残りが1個のみというのが痛い。
次は、Alteraに戻るつもりだ。
2011年10月20日 05:41 |
EDK
| トラックバック:0
| コメント:0
書籍の”
FPGAボードで学ぶ組込みシステム開発入門[Altera偏] ”を購入したので、そこに載っている回路をDE0で試して見ることにした。目標はDE0上でuClinuxを動作させることだ。いろいろ挑戦してみたのだが、今のところLinuxをFPGAボード上で動かせたことがないので、よくやり方が書いてあるこの本で挑戦してみようと思った。詳しいことは書かないつもりなので、その部分は本を読んで欲しい。
この本にはシミュレーションの記述が無いので、ModelSimでシミュレーションを試みるつもりだ。
まずは、
サポートページ から
DE0.zip をダウンロードした。
まずは、リハビリのためにdai2sho\seg7decからやってみた。
ちょうど指定のQuartus II 11.0がインストールされているので、フォルダ内のseg7dec.qpfをダブルクリックしてQuartus II を起動した。
Star Compilationアイコンをクリックして、コンパイルをスタートし、エラー無く終了した。
ところで、回路図をやってなかったので、分からないが、上の図でハイライトされている四角はなんだろう?プロパティも表示できないが、ピンアサインされているという表示かな?
Pin Plannerを開けてみると、後の章のピンアサインもすべてアサインされているみたいだ。
DE0をUSBポートに接続してコンフィグレーションした。
問題なく動作した。SWを2進数でセットすると、LEDに表示された。
こんな感じで、すべての手順は書かないで、所々の結果を書く感じで、本の回路を練習してみようか?と思うのですが、K林さん、よろしいでしょうか?先週、部屋に行ったのですが、いらしゃらなかったようなので、お聞きすることができませんでした。
シミュレーションはModelSimでやってみたいと思います。
いろいろやることがあるので、中断するかもしれませんが、uClinuxを動作させるところまで、やってみたいと思います。
(追加) ハイライトされている四角は、ピン番号でした。ViewメニューからShow I/O Standard and Reverse Pin Assignments をチェックを入れて、外すと表示されました。
同じViewメニューからShow Location Assignments のチェックを外すと四角とピン番号が消えました。
K林さんありがとうございました。
2011年10月19日 05:53 |
FPGAボードで学ぶ組込みシステム開発入門[Altera偏]
| トラックバック:0
| コメント:6
”
山寺(立石寺)に行ってきました1 ”の続き。
途中、阿弥陀如来に見えるという弥陀洞を通りましたが、そう言われれば形が似ているかな?というくらいでした。
やっと仁王門が見えてきました。
登って行くとまた建物が見えてきました。ここで飲み物を売ってましたが、高かったです。オロナミンCが240円だっったか?
やっと奥の院と大仏殿に着きました。疲れました。暑いです。
だいぶ登って来ました。この辺からの眺めは最高です。
ワンダ(コーヒー)のCMで宇宙人が俳句を読んでいる のがここ(五大堂)です。ここからの眺めは最高でした。
だいたい見所は見終えたので、下に降りました。下に降りる時が膝が笑ってしまって大変でした。
下の川が見える食堂で食事。
名物の団子。何かお麩が上にかかっていて、おはぎのような半づきの持ちの団子でした。くるみ味を頼んだのですが美味しかったです。
昼食時だったので、私は天丼を食べました。
さて、山寺観光を終えて、温泉に入りたいということで、本当は
蔵王温泉スキー場にある大露天風呂 に入るのが目的だったのですが、行ってると遅くなってしまうので、天童温泉に行くことにしました。
天童温泉は共同浴場がなく、旅館の温泉の入らせてもらうそうです。
天童温泉に着いて看板の出ていた”
いちらく ”に入りました。
中は豪華でした。リッチな気分になりました。浴衣とバスタオルとタオルが付いて1500円なので安いくらいです。
露天風呂は良かったですが、泉質が単純泉の用な感じで、やはり蔵王のような温泉に入らないと入った気がしません。
ですが、ここの日帰り入浴はとても良かったです。
天童を出て、仙台まで戻り、娘を届けてから、東北道で家に戻って来ました。
2011年10月18日 05:06 |
日記
| トラックバック:0
| コメント:0
土日(10月15,16日)に仙台の娘のところに行ってきて、日曜日に
山寺(立石寺) に行ってきました。
10月15日は東北大学の片平キャンパスを見学してきました。とても良さそうなところでした。
魯迅先生の像がありました。
年代を感じさせる建物がありました。
15日は娘のアパートに泊まって、16日に一緒に山形の山寺に行ってきました。
山形道を走って、山形北インターで降りて、一般道を走って行きました。麓の駐車場に車を入れて歩いて行きます。
橋の下の川はとっても良い眺め。
参道を歩いて、最初の階段を上り、立石寺本堂へ。
からだを触ると願い事が叶うという招福布袋像があったので、撫でてきました。なでられているところは黒光りしていました。
境内では、野点が行われていて、無料で抹茶とお菓子をごちそうになりました。苦くなくて、特にお菓子をいただきながら抹茶を飲むと美味しかったです。
すぐとなりに神社がありました。そこを過ぎると松尾芭蕉の像がありました。ここは有名な蝉の俳句を読んだところだそうです。
いよいよ、ワンダの宇宙人CMの奥の細道偏の撮影現場まで登って行きます。
鬱蒼とした森の中の石段を登って行きます。灯籠や仏像、碑がたくさんありました。
途中開けると上の崖が見えたりします。石灰岩かな?
途中にせみ塚がありました。芭蕉の句をしたためた短冊を埋めて石の塚を立てたそうです。
続く。
2011年10月17日 05:06 |
日記
| トラックバック:0
| コメント:2
”
Spartan-3A Starter KitでEDKを使ってカメラ表示26(独自にタイマーのカスタムIPを作る1) ”の続き。
今回はSDKを使ってソフトウェアを作る。
今回もSDKでのソフトウェアの作り方を手順を追って書いていく。
1.Project NavigatorでEDKインスタンスをクリックし、Exprot Hardware Design To SDK with Bitstreamをダブルクリックして、ハードウェア仕様をSDKに渡しながらSDKを立ち上げるのを忘れないようにする。 2.SDKのWorkspaceを指定する。 3.SDKが立ち上がる。Fileメニュー -> New -> Xilinx C projectを選択して新しいプロジェクトを作成する。 4.一般的には、Fileメニュー -> New -> Source FileでCソースを作って、編集する。(私は、Notepad++でCソースを作って、srcフォルダにドラッグアンドドロップ) 5.Cソースが出来たら、セーブすると、自動的にビルドする。 6.Xilinx Toolsメニュー -> Program FPGAを選択。 7A.Cソースのソフトウェアを直接実行する際は、Software Configuration で .elfファイルを選択して、Programボタンをクリックする。 7B.Cソースのソフトウェアをデバックする際は、Software Configuration で .elfファイルを選択せずにbootloopのままで、Programボタンをクリックする。 8B.Project Explorerウインドウのプロジェクト(今回はsmm_timer_test)のBinariesを展開して、.elfを右クリックする。 9B.Degub As -> Launch on Hardware を選択する。
smm_timer_testプロジェクトを作成して、smm_timer_test.c を書いた。コンパイルして実行したら、今度はうまく動いた。LEDが順番に点灯していくのが見えた。成功!!!やった~。
smm_timer_test.c を下に示す。
#include "xbasic_types.h" #include "xio.h" #include "mb_interface.h" #include "xparameters.h" #define XPS_GPIO_LEDS_8BIT_DATA XPAR_LEDS_8BIT_BASEADDR // データ #define XPS_GPIO_LEDS_8BIT_TRI XPAR_LEDS_8BIT_BASEADDR+0x4 // 0 - Output, 1 - Input int interrupt = 0 ;int k;void timer_int_handler(void * arg) { interrupt = 1 ; k = *(volatile unsigned int *)(XPAR_SMM_TIMER_0_BASEADDR); }int main() { unsigned int i; *(volatile unsigned int *)(XPS_GPIO_LEDS_8BIT_TRI) = 0 ; microblaze_register_handler(timer_int_handler, (void *) 0 ); microblaze_enable_interrupts(); for (i=1 ; i<256 ; i++){ *(volatile unsigned int *)(XPS_GPIO_LEDS_8BIT_DATA) = i; *(volatile unsigned int *)(XPAR_SMM_TIMER_0_BASEADDR) = 62500000 ; interrupt = 0 ; while (interrupt==0 ); } return 0 ; }
2011年10月13日 05:39 |
EDK
| トラックバック:0
| コメント:0
”
ステレオカメラ基板作成3(OV7670基板3) ”で基板が出来て、
Fusion PCB に発注したのですが、Board Outlinesがないというメールが来てしまいました。基板の外形が無いということのようです。
早速、DesignSpark PCBで、どうしたらBoard Outlinesを追加できるか探ってみた。
1.ガーバーファイルは、DesignSpark PCBで、OutputメニューからManufacturing Plot...を選択する。
2.Output Manufacturing Plotsダイアログが開く。Plots:でTop Copperを選び、Settingsタブを選択した。この状態では、Plated Board OutlinesもUnplated Board Outlinesも選択されていない。
3.これで、Runボタンをクリックして、ガーバーファイルやドリルファイルを出力した。
4.これをKicadのGerbViewで見てみたが、Board Outlinesは表示されていない。
5.次に、
Unplated Board Outlines を選択してみた。Runボタンをクリックする。Board Outlinesが表示された。
Bottom Copperも同様にBoard Outlinesを表示させた。
WinMergeで表示した、両者の差分を下に示す。
これでFusion PCB に再度送ったのだが、どうだろう?うまくacceptしてくると良いんだが。。。
(2011/10/13:追記)
Fusion PCBから
Your order has been updated to the following status: In production.
というメールがきました。ステータスの意味については下に引用します。
About order status: 1. Processing: Your order is being processed. 2. Shipped: Your order is collected for assignment by the forwarder. 3. Traceable: Tracking info for your order is available. 4. Waiting: Human interaction is needed for your order. 5. In production: Your PCB order is being manufactured. 6. Backorder: Your order contains at least one backordered item. 7. Combined: Your order is combined with your other orders. Normally it takes 1-2 business days for the order status to change from "Shipped" to "Traceable", since we need some extra time to collect tracking information from the forwarder and update it to our system. You can track your order at the top of website when its status reaches "Traceable".
ということで基板を作ってもらえるようです。良かったです。。。
2011年10月12日 21:22 |
CADツール
| トラックバック:0
| コメント:0
”
Spartan-3A Starter KitでEDKを使ってカメラ表示25(LCD、Rotary EncoderカスタムIPの追加3) ”からのつづきなのだが、”
xps_timerとxps_intcの使い方2(APIを使用する) ”からの続きでもある。
xps_timerの割り込みがどうしてもSpartan-3A Starter Kitでうまく動かないので、timerのカスタムIPを作ろうと思った。
Simple MicroBlazeにtimer.vhdがあるので、これを接続してみることにする。Simple MicroBlazeの
ファイル・アーカイブ(xapp1141.zip) 。
smm_timerのスレーブ・カスタムIPを作成した。
今回は一般的なスレーブ・カスタムIPの作成手順を箇条書きにして示そうと思う。
1.XPSのCreate and Import Peripheral WizardでカスタムIPのスケルトンを生成する。 2.vhdlフォルダに自作VHDLファイルを追加、またはVerilogフォルダを作って、自作Verilogソースを追加。 3.dataフォルダの.mpdファイルに外部へのポートを宣言する。 4.dataフォルダの.paoファイルに2.で追加したHDLファイルのエントリを追加する。 5.XPSでProjectメニューから> Rescan User Repositoriesを選択して、プロジェクトの変更をXPSに認識させる。 6.Add IPして、XPSのプロジェクトに追加する。 7.XPSのBus Interfacesタブで、バスを接続する。(今回はmb_plbに接続した) 8.XPSのPortsタブで、AddしたカスタムIPの必要なポートを外部ポートにする。(今回はなし) 9.内部ポートの接続がある場合には、XPSのPortsタブで接続する。 10.Addressesタブでアドレスを確認。自動的に割り当てられていない場合は、自分で割り当てる。 11.外部ポートのUCFを追加する。(今回はなし) 12.XPSを終了して、Project Navigatorでインプリメントする。 13.Project NavigatorでEDKプロジェクトを選択して、Export Hardware Design To SDK with Bitstreamをダブルクリックして、SDKを起動。 14.SDKでソフトウェアを作って、FPGAボードにダウンロードする。
以上のような手順となる。
今回のsmm_timerの場合は、xps_timerとxps_intcを削除して、microblazeのINTERRUPTと接続した。
アドレスは、0x840E0000から64Kバイトをマップした。
UCFの変更はなしなので、Project Navigatorでインプリメントした。
2011年10月12日 06:04 |
EDK
| トラックバック:0
| コメント:0
”
ステレオカメラ基板作成2(OV7670基板2) ”までで、
DesignSpark PCB で作成した基板を
Fusion PCB に発注しました。発注した基板は以下の通りです。
Products ------------------------------------------------------ 1 x Fusion PCB Service (PCB08511P) = $24.90 *onetime charges = $10.00 PCB Qty. 10 Layer 2 PCB Thickness 1.6mm PCB Dimension 5cm Max*10cm Max Surface Finish Hasl PCB Color Yellow E-Test 50% E-test ------------------------------------------------------ Sub-Total: $34.90 Registered Air Parcel (Weight: 0.07 KG.Delivery Time: 10-30 Days): $3.52 Total: $38.42
日本円で、3,029円でした。
5cm x 10cmの黄色の基板です。目立ちますね。多分。黄色の基板は見たことがないので頼みました。
ガーバーデータとドリルデータも送りました。来るのが楽しみです。後ろのシルクを追加で入れて、かっこ良く?しました。
イラストを入れようと、DesignSpark PCBにイラストのDXFファイルをインポートしました。DXFのデータは読めたのですが、大きさがどうしても小さくなってしまうので、あきらめました。
デジキーでヒロセの100ピンコネクタのレセプタクル と、秋月でパスコン用の
47uF 16V ,と
0.1uF 50V を買いました。
基板が来るのが楽しみです。
うまく動作したら、欲しい方にMakeで、基板(300円)+ヒロセの100ピンコネクタのレセプタクル(558円)+パスコン(約20円)を実費で頒布したいと思っています。(金額は未定です)欲しい方はいるのかな?後、現在は在庫切れですが、
aitendo のOV7670モジュール が2つ必要です。あくまで、サンプルをテストして動作したら?という条件付きです。。。
2011年10月10日 20:07 |
プリント基板作成
| トラックバック:0
| コメント:0
今日は、奥さんと下の娘と私で、
猿の惑星、創世記(ジェネシス) を見てきました。
猿の惑星シリーズは全部見ていると思います。やはり、初回のラストシーン、埋もれた自由の女神のシーンがとっても印象的です。
2011年10月09日 22:12 |
日記
| トラックバック:0
| コメント:0
基板作成時の注意事項覚書です。
まだまだ修正中です。終わりがありませんね。適当な所で基板屋さんに出そうと思っています。
1.M3ネジの頭は5.5mm、3.2Φの穴の1.15mmまで頭が来るので、2mm程度、ベタを逃がす。
2.基板端面からベタを1mm程度逃がす。
3.小さい容量のコンデンサはICの電源端子の近くに、今回の場合ならば、基板の裏に逃がす。(Fキー)
4.サーマルに配線がかぶるので、GNDは配線を引かないで、なるべくGNDベタで接続する。
5.GNDベタが全面つながるように効果的にビアを打って配線し、GNDベタ配線領域を確保する。
6.GNDに繋がらないベタは、Removeするように設定する。
2011年10月09日 20:52 |
プリント基板作成
| トラックバック:0
| コメント:0
”
ステレオカメラ基板作成1(OV7670基板) ”の続き。
ツイッターで、いろいろな方にアドバイスを頂いて、やっとステレオカメラ基板ができたんじゃないか?と思います。
下に基板の図を貼ります。
裏だけ、GNDベタににしてあります。
3D画面の表側です。
自分で作った部品の3Dモデルはないので、四角くなっています。
3D画面の裏側です。
私のツイッターのアカウントを入れてあります。
DesignSpark PCBはDXFファイルをインポートできるようなので、インポートしてみたのですが、インポートした図が見えなかったです。残念です、絵がシルクに入れば、娘のイラストを入れて、痛基板にしようと思っていたのですが。。。
DesignSpark PCBのShapeで書くという方法もありますが、自分でイラストをかけないというのが難点ですね。
(2011/10/09:追記)
アプロさんの助言を元に修正しました。電源ラインを太く、斜めに配線しました。2つのカメラのpclkの配線距離が違いすぎるので、片方をアコーディオン配線して、配線長を合わせました。
(もう一度追記)
表面もGNDベタを付けて、3.2Φの取付穴を付けました。小さいコンデンサを裏に回しました。
2011年10月08日 19:21 |
プリント基板作成
| トラックバック:0
| コメント:4
DesignSpark PCB 2.02で部品を基板の裏に送る方法は、
Fキー (Flip)でした。もしくは、部品を選択して
右クリックメニューからFlip を選択すると部品が基板の裏に行きます。
2011年10月08日 13:20 |
CADツール
| トラックバック:0
| コメント:0
”
xps_timerとxps_intcの使い方1(ソースコード・デバックができない) ”で、どうやっても割り込みがかからないので、困ってしまった。xps_intcのControl/Status Register 0をMDMで見ると、LSBが1になっていて、割り込みは受け付けているみたいだ。その後、MicroBlazeに割り込みが入らないんだと思う。
独自のタイマーを付ける前に、APIを使ってタイマー割り込みを試してみようと思った。
”
Embedded System Tools Reference ManualEDK 12.4 ”の239ページのInterrupt Setup Exampleを少し改造して、やってみることにした。
ちなみに、12行目~14行目のdefine文は間にスペースがなくなっているので、下の記述に変更した。
#define TMRCTR_DEVICE_ID XPAR_TMRCTR_0_DEVICE_ID #define INTC_DEVICE_ID XPAR_INTC_0_DEVICE_ID #define TMRCTR_INTERRUPT_ID XPAR_INTC_0_TMRCTR_0_VEC_ID
RESET_VALUEを62500000にして、XPS_GPIO_LEDS_8BITの記述を追加した。
これで、Spartan-3A Starter KitのEDKでやってみようと思ったが、コンパイル後のELFファイルの大きさが、141,486バイトになってしまった。MicroBlazeのメモリは8Kバイトなので、入らない。仕方がないので、SP605ででも確かめて、後日追記する。
2011年10月08日 04:53 |
EDK
| トラックバック:0
| コメント:0
”NetBeans IDE 6.8 でRubyをデバック ”で、NetBeans IDEでRubyスクリプトを書いているということをブログに書いた。
RubyではパラメータからVHDLファイルを生成している。とても人力でVHDLを記述するのは無理なので、Rubyで自動生成させているわけだ。
RubyのIDEとして、NetBeans IDEを使用している。デバッカを便利に使っていたのだが、ある時から使えなくなってしまった。
今回、Windows 7 64bit版にNetBeans IDE 7.0.1をインストールして、Rubyを書きたいと思いインストールすることにした。
・ 最初に
JAVA SEのJDK6 をインストールした。
・
NetBeans IDE 7.0.1をここからインストール した。
・ NetBeans IDE 7.0.1では標準ではRubyをサポートしていないので、”
NetBeans 7.0にRuby on Railsプラグインをインストールする手順 ”を見ながらRuby on Railsプラグインをインストールした。
・
JRuby 1.6.4 をダウンロード してインストールした。
・ NetBeans IDE 7.0.1のツール・メニューからRubyプラットフォームを選択する。
・ Rubyプラットフォームマネージャーが開くので、”プラットフォームを自動検出”で自動検出させるか、”プラットフォームを追加”でjruby.exeを指定する。
・ Rubyプラットフォームマネージャーの”Gem マネージャー”ボタンをクリックして、Gem マネージャーを開く。自動的に設定してくれるようだ。
・ Gem マネージャーを閉じ、Rubyプラットフォームマネージャーを閉じる。
これで、設定は終了した。
今度は、デバッカの起動を試みる。
・ プログラムの先頭にブレークポイントを設定しておく。
・ NetBeans IDE 7.0.1のデバック・メニューから”ファイルをデバック”を選択する。
・ ダイアログが開く。そのまま、了解ボタンをクリックする。(プログラムの先頭にブレークポイントを設定したので、問題ないはず)
・ デバッカが起動して、ブレークポイントで止まるはずが止まらない。
結局、デバッカが動かなかった。
Windows 7 32ビット版でも同様だった。
次にVirtualBox 4.1.4を使用して、Windows XP SP3上に同様に、NetBeans IDE 7.0.1をインストールして、Rubyの設定を行なって、デバッカを起動したら、問題なく動作した。
問題なくブレークポイントで止まっている。
Windows XP 32ビット版だと、NetBeans IDE 7.0.1のRubyデバックができるようだ。
2011年10月07日 12:24 |
Ruby
| トラックバック:0
| コメント:0
”
xps_timerとxps_intcの使い方1(ソースコード・デバックができない) ”で、ソースコード・デバックをすることが、できなかった。
その時の対処方法をK林さんから教えていただいたので、備忘録として書いておこうと思う。K林さん、教えて頂いてありがとうございました。
現象を下に示す。
・SDKでXilinx ToolsメニューからProgram FPGAを選択した。Program FPGAダイアログが開くので、Programボタンをクリックしてビットファイルをダウンロードした。 ・elfファイルで、右クリックして、右クリックメニューからDebug As -> Lanunch on Hardware を選択する。すると、No source available for "" が出てソースコード・デバックできない。。。(EDKのバージョンは13.2)
教えていただいたやり方を下に示す。
・SDKのXilinx ToolsメニューからGenerate linker script を選択する。
・Generate linker scriptダイアログが開く。左上のOutput SettingsのOutput Script:のBrowseボタンをクリックして、プロジェクト名\src\lscript.ld を選択する。(私のプロジェクトだと、CamDisp_EDK_OV7670_LCD\SDK_Workspace\xps_timer_test\src)
・Generateボタンをクリックして、lscript.ld を生成して、SDKのProjectメニューからBuild Allを行った。
・もう一度。デバックモードにした所、ソースコード・デバックが行えるようになった。
2011年10月06日 05:57 |
EDK
| トラックバック:0
| コメント:0
EDKはカメラ表示回路は、カスタム・マスタIPを作成できて完成したが、そのあと、CMOSカメラの設定をMicroBlazeから変更するソフトウェアをつくるはずだった。しかし、”
xps_timerとxps_intcの使い方1(ソースコード・デバックができない) ”で書いたようにソースコード・デバックができないという事態が発生したので、ペンディングとすることにした。
今回は、
MTM07 にうまく行けばだそうかな?ということで、ステレオカメラ基板を作ることにした。Spartan-3A Starter Kitの拡張コネクタに刺さる拡張ボードとして作製する。OV7670用とOV9655用の両方を作ることにした。基板作成は
Fusion PCB Service に頼むことにする。基板厚0.8mm、大きさ5cmX10cm、色は赤にする予定だ。うまく動作すれば、基板を頒布したい。原価で頒布するか、無料で差し上げることにする。無料の場合はSpartan-3A Starter Kitを持っている方のみとしたい。
前回、”
Spartan-3A Starter Kit用DVI出力拡張ボード(基板作成1) ”を作っていたのだが、やはり2層基板にやるには無理があってやめてしまった。その部品を使えば比較的簡単に基板がつくれそうだ。
まずは、OV7670用のステレオカメラ基板から作ることにした。
以前、練習したDesignSpark PCB で作ることにした。現在のバージョンは2.02だ。
下に回路図を示す。至ってシンプル。
これを5×10cmの基板にして、目の間隔、約6cmにカメラを離して配置して、Curve Miter TrackでAuto Routeしたのが下の図になる。1,2本手動で配線したが、ほぼ、オートルータに任せた。
まだラッツネットがあるし、基板の余白を埋めていないので完成ではないが、配線はこれで良いかな?と思っている。
初めて基板を作るので、何かおかしい所があったら教えて下さい。よろしくお願いします。
2011年10月05日 06:09 |
プリント基板作成
| トラックバック:0
| コメント:6
”
Spartan-3A Starter KitでEDKを使ってカメラ表示25(LCD、Rotary EncoderカスタムIPの追加3) ”の続きなんだが、その前に、今回はxps_timerとxps_intcの使い方を探ってみよう。
前回、”
axi_timerを使う1 ”、”
axi_timerを使う2(割り込みを使用した) ”でaxi_timerの使い方を学んだ。
それより前では、”
XPS_TIMERをテスト ”でXMDを使って、xps_timerをテストしてみた。今回は、インタラプト・コントローラ(xps_intc) 付きの xps_timer に付いて、使い方を探ってみようと思う。
まずは、Project Navigator のProcessesウインドウのExport Hardware Design To SDK with Bitstream をダブルクリックして、SDKを立ち上げる。
SDKが立ち上がった。
試しに本番のlcd_rot_contプロジェクトを作ってみたが、今回は、xps_timer_testプロジェクトを作成する。これは、XilinxのCプロジェクトだ。
そこに、xps_timer_test.c を新規作成した。
今回は、ハードウェアを直接アクセスして制御してみようと思う。
”
axi_timerを使う2(割り込みを使用した) ”のCコードをベースに、GPIOで接続されたLEDを点滅してみることにする。
参照データシート
”LogiCORE IP XPS Interrupt Controller (v2.01a) ”
”
LogiCORE IP XPS Timer/Counter (v1.02a) ”
”
XPS General Purpose Input/Output (GPIO) (v2.00a) ”
次に、XPSの設定を下に貼っておく。最初はxps_intcから。
ここで、Number of Interrupt Inputs が2になっているが、XPSのPortsタブで見ると、Iが1つしかないのが謎だ?
xps_timerの設定を下に示す。
xps_gpioの設定を下に示す。
・SDKでXilinx ToolsメニューからProgram FPGAを選択した。Program FPGAダイアログが開くので、Programボタンをクリックしてビットファイルをダウンロードした。
・elfファイルで、右クリックして、右クリックメニューからDebug As -> Lanunch on Hardware を選択する。すると、No source available for "" が出てソースコード・デバックできない。。。(EDKのバージョンは13.2)
デバック時にソースコード・デバックできないのは痛い。
今回のトラブルには関係ないが、タイマーの便利な使用方法。”
11.1 EDK - Microblaze のプロセッサ実行サイクルを計算する方法 ”タイマーで実行サイクルを計算する方法。
バグっているのが確実 だが、現在のCソースを貼っておく。
#include "xbasic_types.h" #include "xio.h" #include "mb_interface.h" #include "xparameters.h" #define XPS_INTC_0_ISR XPAR_XPS_INTC_0_BASEADDR // Interrupt Status Register #define XPS_INTC_0_IPR XPAR_XPS_INTC_0_BASEADDR+0x4 // Interrupt Pending Register #define XPS_INTC_0_IER XPAR_XPS_INTC_0_BASEADDR+0x8 // Interrupt Enable Register #define XPS_INTC_0_IAR XPAR_XPS_INTC_0_BASEADDR+0xC // Interrupt Acknowledge Register #define XPS_INTC_0_SIE XPAR_XPS_INTC_0_BASEADDR+0x10 // Set Interrupt Enable Bits #define XPS_INTC_0_CIE XPAR_XPS_INTC_0_BASEADDR+0x14 // Clear Interrupt Enable Bits #define XPS_INTC_0_IVR XPAR_XPS_INTC_0_BASEADDR+0x18 // Interrupt Vector Register #define XPS_INTC_0_MER XPAR_XPS_INTC_0_BASEADDR+0x1C // Master Enable Register #define XPS_TIMER_0_TCSR0 XPAR_XPS_TIMER_0_BASEADDR // Control/Status Register 0 #define XPS_TIMER_0_TLR0 XPAR_XPS_TIMER_0_BASEADDR+0x4 // Load Register 0 #define XPS_TIMER_0_TCR0 XPAR_XPS_TIMER_0_BASEADDR+0x8 // Timer/Counter Register 0 #define XPS_TIMER_0_TCSR1 XPAR_XPS_TIMER_0_BASEADDR+0x10 // Control/Status Register 1 #define XPS_TIMER_0_TLR1 XPAR_XPS_TIMER_0_BASEADDR+0x14 // Load Register 1 #define XPS_TIMER_0_TCR1 XPAR_XPS_TIMER_0_BASEADDR+0x18 // Timer/Counter Register 1 #define XPS_GPIO_LEDS_8BIT_DATA XPAR_LEDS_8BIT_BASEADDR // データ #define XPS_GPIO_LEDS_8BIT_TRI XPAR_LEDS_8BIT_BASEADDR+0x4 // 0 - Output, 1 - Input #define ENABLE_ALL_TIMERS (0x1<<10) #define ENABLE_PULSE_WIDTH_MODULATION (0x1<<9) #define TIMER_INTERRUPT (0x1<<8) #define ENABLE_TIMER (0x1<<7) #define ENABLE_INTERRUPT (0x1<<6) #define LOAD_TIMER (0x1<<5) #define AUTO_RELOAD_HOLD_TIMER (0x1<<4) #define ENABLE_EXT_CAPTURE_TRIG (0x1<<3) #define ENABLE_EXT_GENERATE_SIG (0x1<<2) #define DOWN_UP_COUNT_TIMER (0x1<<1) #define TIMER_MODE_CAP_GENE (0x1) int interrupt = 0 ;void xps_intc_init() { *(volatile unsigned int *)(XPS_INTC_0_IER) = 0x80000000 ; *(volatile unsigned int *)(XPS_INTC_0_MER) = 0x1 ; }void xps_timer_init(){ *(volatile unsigned int *)(XPS_TIMER_0_TLR0) = 62500000 ; *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | LOAD_TIMER; *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | DOWN_UP_COUNT_TIMER; }void timer_int_handler(void * arg) { interrupt = 1 ; }int main() { unsigned char i; *(volatile unsigned int *)(XPS_GPIO_LEDS_8BIT_TRI) = 0 ; *(volatile unsigned int *)(XPS_GPIO_LEDS_8BIT_DATA) = 1 ; xps_intc_init(); xps_timer_init(); microblaze_register_handler(timer_int_handler, (void *) 0 ); microblaze_enable_interrupts(); i = 1 ; while (1 ){ *(volatile unsigned char *)(XPS_GPIO_LEDS_8BIT_DATA) = i; interrupt = 0 ; while (interrupt==0 ); *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | DOWN_UP_COUNT_TIMER | TIMER_INTERRUPT; *(volatile unsigned int *)(XPS_INTC_0_IAR) = 0x80000000 ; *(volatile unsigned int *)(XPS_TIMER_0_TLR0) = 62500000 ; *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | LOAD_TIMER; *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | DOWN_UP_COUNT_TIMER; } return 0 ; }
(2011/10/06:追記) K林さんに間違いを指摘して頂いて、コードを修正しましたが、まだ割り込みがかかっていないようです。何でしょうか?現在のコードを貼っておきます。
#include "xbasic_types.h" #include "xio.h" #include "mb_interface.h" #include "xparameters.h" #define XPS_INTC_0_ISR XPAR_XPS_INTC_0_BASEADDR // Interrupt Status Register #define XPS_INTC_0_IPR XPAR_XPS_INTC_0_BASEADDR+0x4 // Interrupt Pending Register #define XPS_INTC_0_IER XPAR_XPS_INTC_0_BASEADDR+0x8 // Interrupt Enable Register #define XPS_INTC_0_IAR XPAR_XPS_INTC_0_BASEADDR+0xC // Interrupt Acknowledge Register #define XPS_INTC_0_SIE XPAR_XPS_INTC_0_BASEADDR+0x10 // Set Interrupt Enable Bits #define XPS_INTC_0_CIE XPAR_XPS_INTC_0_BASEADDR+0x14 // Clear Interrupt Enable Bits #define XPS_INTC_0_IVR XPAR_XPS_INTC_0_BASEADDR+0x18 // Interrupt Vector Register #define XPS_INTC_0_MER XPAR_XPS_INTC_0_BASEADDR+0x1C // Master Enable Register #define XPS_TIMER_0_TCSR0 XPAR_XPS_TIMER_0_BASEADDR // Control/Status Register 0 #define XPS_TIMER_0_TLR0 XPAR_XPS_TIMER_0_BASEADDR+0x4 // Load Register 0 #define XPS_TIMER_0_TCR0 XPAR_XPS_TIMER_0_BASEADDR+0x8 // Timer/Counter Register 0 #define XPS_TIMER_0_TCSR1 XPAR_XPS_TIMER_0_BASEADDR+0x10 // Control/Status Register 1 #define XPS_TIMER_0_TLR1 XPAR_XPS_TIMER_0_BASEADDR+0x14 // Load Register 1 #define XPS_TIMER_0_TCR1 XPAR_XPS_TIMER_0_BASEADDR+0x18 // Timer/Counter Register 1 #define XPS_GPIO_LEDS_8BIT_DATA XPAR_LEDS_8BIT_BASEADDR // データ #define XPS_GPIO_LEDS_8BIT_TRI XPAR_LEDS_8BIT_BASEADDR+0x4 // 0 - Output, 1 - Input #define ENABLE_ALL_TIMERS (0x1<<10) #define ENABLE_PULSE_WIDTH_MODULATION (0x1<<9) #define TIMER_INTERRUPT (0x1<<8) #define ENABLE_TIMER (0x1<<7) #define ENABLE_INTERRUPT (0x1<<6) #define LOAD_TIMER (0x1<<5) #define AUTO_RELOAD_HOLD_TIMER (0x1<<4) #define ENABLE_EXT_CAPTURE_TRIG (0x1<<3) #define ENABLE_EXT_GENERATE_SIG (0x1<<2) #define DOWN_UP_COUNT_TIMER (0x1<<1) #define TIMER_MODE_CAP_GENE (0x1) int interrupt = 0 ;void xps_intc_init() { *(volatile unsigned int *)(XPS_INTC_0_IER) = 0x1 ; *(volatile unsigned int *)(XPS_INTC_0_MER) = 0x3 ; }void xps_timer_init(){ *(volatile unsigned int *)(XPS_TIMER_0_TLR0) = 62500000 ; *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | LOAD_TIMER; *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | DOWN_UP_COUNT_TIMER; }void timer_int_handler(void * arg) { interrupt = 1 ; }int main() { unsigned int i; *(volatile unsigned int *)(XPS_GPIO_LEDS_8BIT_TRI) = 0 ; *(volatile unsigned int *)(XPS_GPIO_LEDS_8BIT_DATA) = 1 ; xps_intc_init(); xps_timer_init(); microblaze_register_handler(timer_int_handler, (void *) 0 ); microblaze_enable_interrupts(); for (i=10 ; i<256 ; i++){ *(volatile unsigned int *)(XPS_GPIO_LEDS_8BIT_DATA) = i; interrupt = 0 ; while (interrupt==0 ); *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | DOWN_UP_COUNT_TIMER | TIMER_INTERRUPT; *(volatile unsigned int *)(XPS_INTC_0_IAR) = 0x1 ; *(volatile unsigned int *)(XPS_TIMER_0_TLR0) = 62500000 ; *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | LOAD_TIMER; *(volatile unsigned int *)(XPS_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | DOWN_UP_COUNT_TIMER; } return 0 ; }
(2011/10/07:追記) SP605で同じCコードでxps_timerのテストをしてみたのですが、問題なく動作しました。
Spartan-3A Starter Kitでは、どうしても、うまく行きません。もう1つ、新規でEDKのプロジェクトを作成してやって見ましたが、やはり、割り込みはかかってないみたいでした。
Spartan-3A Starter KitのEDKでxps_timer, xps_intcの割り込み動作がおかしいようなので、独自のタイマーを組み込んでみようと思っています。
2011年10月03日 21:05 |
EDK
| トラックバック:0
| コメント:5
木製アタッシュケースに加工しようということで、今日も
FPGA-CAFE に行って、
レーザー加工機 で桐の板を彫刻してきました。
桐の板を一定の厚さに彫刻して、違う色の薄い木の板を同じ模様に切り取って貼付け、象嵌しようと思っていました。けれども、木の柔らかさが一定でないので、レーザーの出力が同じでもでこぼこが出来てしまって、あきらめました。
でも、彫刻がとても良い感じです。彫刻だけで十分かっこいいと思いました。下は加工サンプルです。
本番はもちょっと後で箱にする加工を施してからやりたいと思います。
すすたわりさん、いろいろ教えて頂いて、ありがとうございます。またよろしくお願いします。
2011年10月02日 19:31 |
木工
| トラックバック:0
| コメント:0