FC2カウンター FPGAの部屋 2009年09月

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

CMOSカメラから画像を入力してディスプレイへ出力7

ModelSimの文法エラーチェックが終わったので、ISE11.3でインプリメントをしてみることにした。
プロジェクトを作成して、インプリメントしたが、やはり結構ミスがあった。それを修正してPlace & Routeまで通ったと思ったらエラー発生。エラーは下の内容。

ERROR:Place:1012 - A clock IOB / DCM component pair have been found that are not placed at an optimal clock IOB / DCM site pair. The clock component is placed at site . The clock IO/DCM site can be paired if they are placed/locked in the same quadrant. The IO component is placed at site . This will not allow the use of the fast path between the IO and the Clock buffer. If this sub optimal condition is acceptable for this design, you may use the CLOCK_DEDICATED_ROUTE constraint in the .ucf file to demote this message to a WARNING and allow your design to continue. However, the use of this override is highly discouraged as it may lead to very poor timing results. It is recommended that this error condition be corrected in the design. A list of all the COMP.PINs used in this clock placement rule is listed below. These examples can be used directly in the .ucf file to override this clock rule.


Camera_Disp_14_090930.png

以前にあった”Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのインプリメントエラー”ともちょっと違うようだ。(後でDCMは固定する必要があるのかもしれないが。。。)
cam_pclkのSpartan3E-500-PQ208パッケージでのピン位置はP20 で、グローバルクロック入力に割り当てられていない。これでは、クロック用の専用配線が使えないので、不利なのだが、一応 CLOCK_DEDICATED_ROUTE制約を入れて、試しにP&Rしてみることにする。下のような制約をUCFファイルに追加した。

PIN "cam_pclk" CLOCK_DEDICATED_ROUTE = FALSE;


これでPlace & Routeしたらまたエラー。エラー内容は下。

ERROR:Place:1012 - A clock IOB / DCM component pair have been found that are not placed at an optimal clock IOB / DCM site pair. The clock component is placed at site . The clock IO/DCM site can be paired if they are placed/locked in the same quadrant. The IO component is placed at site . This will not allow the use of the fast path between the IO and the Clock buffer. If this sub optimal condition is acceptable for this design, you may use the CLOCK_DEDICATED_ROUTE constraint in the .ucf file to demote this message to a WARNING and allow your design to continue. However, the use of this override is highly discouraged as it may lead to very poor timing results. It is recommended that this error condition be corrected in the design. A list of all the COMP.PINs used in this clock placement rule is listed below. These examples can be used directly in the .ucf file to override this clock rule.
< NET "cam_pclk" CLOCK_DEDICATED_ROUTE = FALSE; >
< PIN "DCM_module_24MHz_inst/DCM_pclk.CLKIN" CLOCK_DEDICATED_ROUTE = FALSE; >


ご親切にも、UCFの書き方を教えてもらったので、指定の通りに書き直したらインプリメントが通った。
しかし、PCLKをグローバルクロック入力に割り当てないとは???これは使ってはいけないのか?
OV7640のデータシートのFigure 5 Row Output Timing DiagramにもPCLKに同期して画像のデータが出るようにタイミングチャートが書いてあるのに?なんで???
不可解だがしょうがない。これではタイミングがどうなっているか危ないので、なるべくIOピンにタイミング制約をかけることにする。
タイミング制約は例によってProcessesペインのUser Constraints -> Create Timing Constrints からConstrinats Editor を起動して行う。(この辺のやり方は、”ISE11.1iのチュートリアル3(制約 (UCF) の作成)”を参照のこと)
立ち上がってみると、cam_clkはUnconstrained Clocks に分類されてしまっている。。。(これは制約をかければ上のウインドウに行くようだ。)
Camera_Disp_15_090930.png

これは違うクロックでやるしかないかな?どうしてPCLKをグローバルクロック入力にアサインしなかったの?(愚痴です。。。)
こうなったら違うクロックで回路を動作させるしかないな。書き換えることにします。。。

(追記)
1番目のエラーと2番目のエラーは同一で、1番目のエラーの下を見たらexampleが書いてあったんでしょうね?またまた失敗です。。。

(またまた追記)
誤解があったので、Constraints Editorの使い方を研究して書こうと思う。だいぶ変更があるような気がする。
  1. 2009年09月30日 05:47 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:0

CMOSカメラから画像を入力してディスプレイへ出力6

CMOSカメラ・ディスプレイ・インターフェース回路のVHDLソース全体が出来上がったので、ModelSim XE3 Starterで一度コンパイルして文法エラーを訂正することにした。
ModelSimの新規プロジェクトを作成して、VHDLファイルをプロジェクトに追加しCompile Order... を行った。(この辺のやり方は、ModelSimのバージョンが古いのだが、”Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションまとめ1”を参照)
そうしたら下のようにdisp_timing_pack.vhd以外は真っ赤でエラー満載だった。
Camera_Disp_8_090929.png

エラーの出ているファイルの中の”# Compile of VGA_Display_Controller.vhd failed.”をダブルクリックするとUnsuccessful Complieウインドウが立ちあがる。
Camera_Disp_9_090929.png

このダイアログにはエラーの内容が書かれている。このエラーは”** Error: H:/HDL/FndtnISEWork/esp_board/CamDispCntrl_SRAM/Sources/VGA_Display_Controller.vhd(32): near ")": expecting "IDENTIFIER"”で、エラーのところをダブルクリックするとVHDLソースのエラーのところに飛ぶ。
Camera_Disp_10_090929.png

そうすると、ポート宣言で最後のポートのセミコロンが付いていることがわかる。これを削除して、今度はVGA_Display_Controller.vhdをWorkspaceペインから右クリックして、Compile -> Compile Selectedを実行して、VGA_Display_Controller.vhdだけをコンパイルする。
Camera_Disp_11_090929.png

またエラーが出て同様に修正。というような作業を繰り返すことになる。いつもVHDLソースを書くと、たくさんエラーが出るので、きちんと動くまでソースをブログに貼ることができない。。。

さらにもう1つのエラー。
Camera_Disp_12_090929.png

mem_aがunsigned、mem_addrがstd_logic_vectorなので、エラーだと言われている。
宣言部分は下。

library IEEE;
use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;

......

  mem_addr : out std_logic_vector(18 downto 0) -- SRAMのアドレス、バイト単位
 );
end VGA_Display_Controller;

.............

architecture RTL of VGA_Display_Controller is
signal mem_a : unsigned(18 downto 0);


このエラーは193行目を 

mem_addr <= std_logic_vector(mem_a);


に修正することでコンパイルが通った。

(追加)
仕事から帰ってきてバグ取りをした。文法エラーは全部とれた。
Camera_Disp_13_090929.png

  1. 2009年09月29日 05:38 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:0

雑記(2009/09/28)

この前、電波腕時計を買ったのだが、おかしくなってしまった。MARSHALというメーカーの2千数百円くらいの安い腕時計だった。まだ、買ってから数カ月だったので、直してもらおうと思ったが保証書や説明書がなくなってる。しょうがないもう1つ買おうかということで、図らずも同じメーカーのソーラー電波時計を6,980円で買った。
watch_090928.jpg

左が壊れていた電波時計、右が今回購入したソーラー電波時計。
ソーラー電波時計の説明書を頼りに、壊れた電波時計をJJYで校正したら、やはり電波を受信できていないようだった。それでも数回やると直ったみたい。。。上の写真はどちらも同じ時間を示している。買わなくてもよかったな~。。。(もしかしてムーブメントは同一かも?)
ちなみに、このMARSHALは、Bボタンを押すとJJYの受信状態、日にち、曜日、AM,PMを秒針が指し示す方式で面白い。普通にリュウズを回しても時間合わせ出来ない。結構とまどっている人がいると思う。
時計が2つになってしまった。どうしよう。2つ使い分けるか?

中日電工の8080相当CPUを標準CMOS ICで作るキット”で書いたが、”FIAT500と洗車の日々・・・”さんで、中日電工のキットの組み立て状況をブログに書いておられる。これからの展開が楽しみ。。。

さて、私が作っているCMOSカメラ・ディスプレイ・インターフェース回路だが、順調に出来上がっている。今からやれば、今日で一応VHDLソースはできると思うが、今日は録画しておいたシンガポールF1を見るので、明日の朝にやることにする。後はテストベンチを書いて、今回はModelSimでシミュレーションをすることになる。
  1. 2009年09月28日 05:25 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:5

CMOSカメラから画像を入力してディスプレイへ出力5

CMOSカメラ・ディスプレイ・インターフェース回路(こう呼ぶことにします)のVHDLをいま一生懸命?書いているところです。1時間半程度書いてると飽きちゃいますから一生懸命とはいえないかもしれません。今もブログ書いていますし。。。
こんな感じでNotepad++を2つのビューに分けて、片方を見ながら書いています。今、使っているのは19インチの液晶なので、もっと広い24インチくらい欲しいところです。
Camera_Disp_7_090925.png

現在のモジュール構成は上の図にみえるとおりに、CamDispCntrl_SRAM.vhd(これがトップです)、DCM_module_24MHz.vhd、synchronizer.vhd、Camera_Controller.vhd、VGA_Display_Controller.vhd、SRAM_Controller.vhd、そしてパッケージとしてdisp_timing_pack.vhdです。
以前書いた下の図と大体同じですが、SRAMのメモリアドレスはCamera_Controller.vhdとVGA_Display_Controller.vhdでそれぞれ生成することにしました。それをSRAM_Controller.vhdでRead/Writeで切り変えようと思っています。
Camera_Disp_4_090921.png

IOBに入るべきロジックはトップのCamDispCntrl_SRAM.vhd に全部書くことにします。今回の回路の動作周波数は24MHzなので、全く問題ないと思いますが、フロアプランするときに、このように書いた方がフロアプランしやすくなります。

#今日はですます調になってしまいました。今日の気分はですます調です。
  1. 2009年09月25日 05:49 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:0

安上がりはぎ合わせクランプ

今日は、のほほん木工房さんのビスケットモドキの記事を見て、安上がりはぎ合わせクランプを作ってみました。
M10X100cm の長ねじとM10ナット4個、M10チョウねじ5個、平ワッシャ7個、M10X100mmボルト3本、2X2材少々、タモ材少々で作りました。
これで、板をつなぎ合わせて、引き出し付きの箱を試しに作ってみようと思っています。そのための1X8材も買ってきました。1X8材は反っているので、どのくらいうまくできるかわかりませんが、やってみたいと思っています。
sagyoudai_5_090923.jpg
  1. 2009年09月23日 17:18 |
  2. 木工
  3. | トラックバック:0
  4. | コメント:0

作業台作成

昨日は持ち運ぶのに便利なように90cmの短い作業台を作りました。238円の6F(1820mm)の2X4材を3本半で出来たので1千円以下でできたことになります。
sagyoudai_1_090923.jpg

板を切るのに購入したスライド丸のこを使いました。今まで、脚を切るのに4本ぴったりに切るのに苦労していましたが、スライド丸のこの後ろに2X4材を2本重ねてクランプで押さえました。それをガイドに脚を切ったところ4本ぴったりの長さに切れました。(なかなか、ぴったり(0.5mm以上狂わずに)同じ長さに切れないんです。。。)
sagyoudai_2_090923.jpg

これが便利なので、押さえを作りました。
sagyoudai_3_090923.jpg

下のように、クランプで押さえて使おうと思いますが、微調整が難しいです。何か考えたほうが良さそうです。今のところクランプで押さえたままで、ゴム鎚でたたいて微調整すればいいかな?と思っています。
sagyoudai_4_090923.jpg

CMOSカメラ・ディスプレイ・インターフェース回路も夜&早朝につくっています。。。
  1. 2009年09月23日 08:42 |
  2. 木工
  3. | トラックバック:0
  4. | コメント:0

CMOSカメラから画像を入力してディスプレイへ出力4

・SRAMの容量
1ドットあたり輝度データ1バイトなので、640*480 = 307,200バイト。SRAMは1個当たり262,144X16bit = 524,288バイトなので1個で足りることになる。1個のChip Selectを操作して、後3個のChip Selectは1固定とする。

・クロックのブロック図
クロック関係のブロック図を下図に示す。
Camera_Disp_6_090921.png

水晶発振器から出力された48MHzクロックは、FPGAのDCMで24MHzに変換されてIOブロックにあるDDRレジスタを駆動する。DDRレジスタから出力された24MHzのクロックはCMOSカメラのCLKに入力される。CMOSカメラから出力されたPCLK(24MHz)はFPGAの別のDCMで受けられた後、FPGA内部のマスタークロック (mclk) として使用される。mclkはFPGA全体で使用するクロックである。
なお、DCM1/2のLOCKED信号をDDRレジスタのイネーブル信号として使い、DCM1/2がロックしないうちはCMOSカメラにクロックを供給しない。DCM1/1のLOCKEDは、論理を反転して、FPGA回路全体のリセット信号として使用する(resetはアクティブハイ)。
  1. 2009年09月22日 05:59 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:0

CMOSカメラから画像を入力してディスプレイへ出力3

・VGAタイミング
DWM2007年8月号のP31のVGAタイミングを参考にすることにした。カメラの映像信号のタイミングの1/2にするとちょうど、カメラの映像タイミングの1回にVGAタイミング2回でぴったりなのでそうすることにした。最初はカメラのVSYNC後のHREFのタイミングにVGAの出力を合わせることにする。
VGAの映像信号のタイミング

ドットクロック   24MHz(カメラのPCLKに同期) 41.7ns
水平ライン      764ドットクロック  31.8us
水平表示区間    640ドットクロック  26.7us
水平フロントポーチ  16ドットクロック 0.667us
水平同期信号     64ドットクロック  2.67us
水平バックポーチ   44ドットクロック 1.83us

垂直期間      525ライン 16.7ms
垂直表示区間   480ライン 15.3ms
垂直フロントポーチ 11ライン 0.350ms
垂直同期信号    2ライン 0.0637ms
垂直バックポーチ  32ライン 1.02ms


カメラのVSYNC後のカメラのHREFが1になっているのを確認したら、VGAコントローラをリセットする。VGAの水平ラインのタイミングは、水平表示区間+水平フロントポーチ+水平同期信号+水平バックポーチ、とする。
垂直も同様に、垂直表示区間+垂直フロントポーチ+垂直同期信号+垂直バックポーチ、とする。下に前回のタイミングチャートを示す。
Camera_Disp_3_090916.png

VGA信号のpackageは下のようになる。(今回は都合でVHDLです)

-- 表示タイミングの定義
-- pixel clock 24MHz, 640X480 pixel, 60Hz

library ieee;
use ieee.std_logic_1164.all;

package disp_timing_pack is
constant H_ACTIVE_VIDEO : integer := 640;
constant H_FRONT_PORCH : integer := 16;
constant H_SYNC_PULSE : integer := 64;
constant H_BACK_PORCH : integer := 44;
constant H_SUM : integer := H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH;

constant V_ACTIVE_VIDEO : integer := 480;
constant V_FRONT_PORCH : integer := 11;
constant V_SYNC_PULSE : integer := 2;
constant V_BACK_PORCH : integer := 32;
constant V_SUM : integer := V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH;
end disp_timing_pack;



下にトップモジュールのCamDispCntrl_SRAMの全体のブロック図を示す。
Camera_Disp_4_090921.png

CMOSカメラから入ってきた映像信号YUV422は、CAMERA_CONTROLLERでY信号だけをSRAM_CONTROLLERに渡す。SYNCHRONIZERは、CAMERA_CONTROLLERからVSYNC, HREFを受け取って同期信号をSRAM_CONTROLLERとVGA_DISPLAY_CONTROLLERに渡す。その同期信号でSRAM_CONTROLLERとVGA_DISPLAY_CONTROLLERは垂直0ライン、水平映像信号の0ドット目に同期する。VGA_DISPLAY_CONTROLLERはSRAMからREADしたYデータをRGBに変換(白黒なので、RGB同じ値にするだけ)し、DAC(ADV7125)に出力する。HSYNC, VSYNCは直接VGAコネクタに出力する。
DAC(ADV7125)のデータシートはここにある。下にブロック図を引用する。
Camera_Disp_5_090921.png

このうちのSYNC, PSAVEは使用しないで、R,G,BとBLANKを使用する。
  1. 2009年09月21日 06:03 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:0

娘が病気、犬小屋の修理

今朝から娘が吐き気がして、頭が痛いと症状を訴えてきた。少しだが、吐いてしまった。熱はないので、新型インフルエンザではなさそう。なんだろうということで、日曜日で医者もやっていないので、様子を見ていたが、午後になってから、食欲が出てきて、先ほどホットケーキを食べられた。たぶん、運動会で疲れたんだろう。とりあえず治ってよかった。

この前、犬小屋の下に引いてあるウッドデッキを犬に壊されてしまった。
dog_1_090920.jpg

なので、息子の自転車のすり減ったタイヤ交換のついでに、ホームジョイ本田で防腐剤付きの1X4材を買ってきて、上に木ねじ止めした。餌や水を置いてある容器の下も結構傷んでいたので、これはあり合わせの木材を貼ったのだが、これは防腐剤付きじゃないので、防腐剤を塗った。出来上がりはこれ。
dog_2_090920.jpg

全部新しい板を貼ったほうが良かった気がしたが、とりあえず良いだろうということで。。。1X4, 10feetsで520円X5で2,600円に2カット(車に乗せるため)してもらったから50円X2=100円で2,700円のはずだけど、もう少し取られたような?まあ良いか。。。
最後に下がうちの犬。
dog_3_090920.jpg

ゴールデンレトリバーとラブラドールレトリバーの合いの子です。
  1. 2009年09月20日 17:22 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

中日電工の8080相当CPUを標準CMOS ICで作るキット

FIAT500と洗車の日々・・・”さんで知ったのだが、中日電工さんからMYCPU80組み立てキットが発売されたそうだ。この方も一台購入されたようだ。
しかし、8080相当CPUを標準CMOS ICで作るキットとは恐れ入った。マイクロプログラム方式(ROMなどを使って、マイクロプログラムを実行してCPUの命令を実現する方式)を取らずにハードワイヤード方式でしかもTTL(標準CMOS IC)で作るとは凄い。CMOS ICの個数を数えたら269個あった。。。これで約5万円は安い。
「TTLでCPUをつくろう」(組立キットです!)”では、標準CMOS ICで8080相当のCPUを作るまでの苦労が詳しく記述されている。ものすごく長いので、読みたいんだけど全部は読めない。。。懐かしい感じ。。。
基板CADと回路図CADの整合性のチェックで大変という話が書いてあったが、KicadあたりでチェックすればDRCをかければ一発なんじゃないかと思った。全部手で設計されているので、本当にすごいのだけど、私だったらシミュレーターを使いたい。
なにはともあれ、本当にすごいキットだと思った。
  1. 2009年09月20日 05:26 |
  2. マイコン関連
  3. | トラックバック:1
  4. | コメント:4

小学校の運動会

今日は、先週の中学校の運動会に引き続き小学校の運動会だった。今日は曇りでちょうど良い天気。かんかんに晴れで暑いということもなく、運動会日和だった。雨も降らずにすごしやすい陽気だっだ。
今回も後の方にレジャーテーブルと折りたたみ椅子で陣取った。この方が周りに人が少ないので落ち着く。。。
syou_undoukai_1_090919.jpg

一番下の娘が5年生なのだが、定番の障害走、徒競走などをやっていた。脚は親に似て遅かった。しょうがない。。。
楽しみのお昼のお弁当。いつもながら、少し食べて落ち着いたときに写真を撮るのを思い出す。今日は娘のリクエストで海苔巻とサンドイッチ。作るのが大変で、お母さんは3時半に起きていた。
syou_undoukai_2_090919.jpg

騎馬戦とかにも、身長が大きいようで馬で出ました。最後は大玉ころがしです。
syou_undoukai_3_090919.jpg

その後、この前のアガチスをはいだ板のかんながけが終わったと言われたので、先生のところに取りに行った。今日は疲れました。。。
  1. 2009年09月19日 21:04 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

ISE11.3アップデート

今日来たXilinxからのメールを見たら、ISE11.3が出たとのことだった。ISE11.3はSoftware UpdatesとしてXilinxのダウンロードサイトからダウンロードする必要がある。Windowsの32ビット版で2.42GBある。ダウンロードに時間がかかった。
下のようにかなりの量のUpdateがある。
ISE113_updata_1_090917.png

Updateにもかなりの時間がかかりそうだ。
2009/09/17 20:50で0%終了。
21:27で49%終了。
風呂入ってきて、21:57で92%終了。
22:16 アップデート終了。約1時間30分かかった。

ISE11.3を起動したら、ISE11.2の時の履歴はクリアされてしまった。Spartan3A Starter Kit のDDR2コントローラーのバーストテストを早速コンパイルしてみた。問題なくインプリメントできた。良かった。。。
ISE113_updata_2_090917.png

ぱっと見にはISE11.2と違わないと思ったら、ピンクで囲ったSourcesのところがラジオボタンになっている。現在のシミュレーションツールはISimだが、ModelSimにシミュレーションツールを変更するとModelSimのアイコンになった。
ISE113_updata_3_090917.png
  1. 2009年09月17日 20:51 |
  2. Xilinx ISEについて
  3. | トラックバック:0
  4. | コメント:0

CMOSカメラから画像を入力してディスプレイへ出力2

まずは使用する基板、CMOSカメラの確認だが、基板は画像ベースボード(回路図の一部)とXC3S500E-VQ208(208 ピン)+ 2Mバイト高速SRAM 基板シキノハイテックのCMOSカメラKBCR-M03VG。このCMOSカメラはCMOSイメージセンサにOmniVision社のOV7640を使用している。
OV7640の使用するモードは、VGAモード(30フレーム/秒)、YUV422モード、YUVフォーマットはUYVYUYVYモードを使用する。YUVなどの画像データは8ビット幅で、Uが8ビット、Yが8ビット、Vが8ビット、Yが8ビットというように出力される。これはデフォルトの設定なので、I2Cでレジスタを設定する必要はとりあえずない。予定は白黒なので、YUVのうち輝度成分のYだけ取り出せばOKだ。
画像データはUYVYと41.6ns(24MHz)ごとに出力される。それが640ドット分続く。実際のタイミングチャートは下にデータシートから引用する。
Camera_Disp_1_090916.png

HERFのが1の間Y[7:0]にはUYVYの順に出力されるはず。全体のタイミングチャートもデータシートから引用させていただく。
Camera_Disp_2_090916.png

ここでRowが640tpclkと書いてあるが、UYかUYで1画素なので、CMOSカメラから出力されるPCLKを基準とすると640X2=1280PCLKで1つのRowとなる。(のだと思う。少なくともRGB出力した時はそうだった)これで30フレーム/秒という出力フレームの規格にも計算が合うことになる。

2Mバイト高速SRAMは、アクセスタイム10ns、16ビット幅のSRAM(IS61LV25616AL)を使用している。アクセスタイムは10nsだが、非同期動作なので、周期が10nsクロックで動作は出来ない。現実的にはSpartan3Eボードの48MHzクロックを1/2分周した24MHzで使用する。Write用のパルスはDDRレジスタで出力する。Yデータを格納する際には、SRAMのデータは16ビット幅なので、最初に上位8ビットにYデータを書き込む。次のYデータは下位8ビットに書き込む。つまり24MHzクロック2クロックに1回、8ビットずつ書き込みを行う。
下にSRAMをアクセスするタイミングチャートを示す。
Camera_Disp_3_090916.png

CMOSカメラに24MHzクロックを供給し、カメラから帰ってくるのがPCLKである。これも24MHzのクロックだ。
MDはメモリに読み書きするデータで、上の文字がDISPLAY_DATAの時が、表示用のデータをリードしているときだ。この時は8ビットのYデータ2つ分、2バイトを読み出してディスプレイに表示する。2クロックに1回の読み出しなので、2バイトのデータをもらう必要がある。VOIDは書き込みのタイミングだけど、書き込むデータがそろっていないので書き込めないことを示す。最初のYデータ (CAMERA Y0) が来たら上位8ビットに書き込む。(CAMERA Y0,XX) 次のCAMERA Y1は下位8ビットに書き込む (XX, CAMERA Y1)。これはSRAMのUB, LB信号を用いて上位8ビット、下位8ビットだけに書き込むことができる。
下のR/WはRead/Writeを表す。MADDRは、SRAMのアドレスを示す。なんでも良いときは3FFFFと書いた。
その下のCAMERA U0, CAMERA Y0...はCMOSカメラから出てくるYUV422のデータを示している。その下がHREFの信号となる。

大体このようなタイミングでやって行こうかと思っている。出力の時にIOBのFFを使うために、もう1クロック後ろずれする可能性はある。
ディスプレイに表示するために読み出すのは、1秒間に60フレーム必要だが、CMOSカメラからの書き込みは1秒間に30フレームなので、表示2フレームで正常な画像が出力できることになる。
  1. 2009年09月16日 06:03 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:0

CMOSカメラから画像を入力してディスプレイへ出力

以前、”DWM誌の2007年8月号と2007年10月号の基板でカメラの画像を表示”で、イーエスピー企画が出している。画像ベースボード、デジタルCMOSカメラ、208ピンSpartan3E XC3S500+2M高速SRAM基板を使って、カメラで撮影した画像をアナログRGBディスプレイに表示することができた。けれども、”DWM誌の2007年8月号と2007年10月号の基板でカメラの画像を表示2”で、カメラの画像をディスプレイに表示できたが、DCMの位置でおかしくなるという現象が出た。
お仕事で、このボードを使って画像処理をするのだが、メインのお仕事が忙しいため、汎用部分だけ家でブログを書きながらやることにした。オリジナルの肝心な部分は、家で土台ができてから職場でやるので、問題はないと思う。Spartan3A Starter Kitで今回開発したDDR2 SDRAMコントローラを使ってMico32をもう一度やってみるのも魅力的だけど、画像処理も捨てがたい。
今回、改めてDWMのサンプルVHDLコードを読んでみたが、同期するクロックの生成部分が2回に1度しかうまくいかなそうなことや(そもそも、ロジックで分周してクロックを作った場合は、そのネットに制約をかけないとクリティカルパスが制約されない)、SRAMへのWrite出力信号がクロックとANDを取っているようだった。このサンプルVHDLコードはあまり好みではないので全面的に書き直すことにした。
とりあえずはCMOSカメラから出てきたYUV422フォーマットの画像データをY成分8ビットのみ抽出して、ディスプレイに表示してみることだ。
今日は昨日宴会だったので眠いということで、これまでとする。
  1. 2009年09月15日 05:36 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:0

サマーウォーズを見てきました

昨日は土浦イオンでサマーウォーズを見てきました。
2回、3回みたという学生もいると聞いたので、自分でも奥さんと下の娘と見てきました。
3人とも良かったという感想です。PS3買ってBDかDVDでたら欲しいです。設定にはだいぶ無理がありますが、昔ながらの大家族とコンピュータワールドが一緒に描かれているのが良いです。

午後からは、手作り家具の即売会を見にイーアスに行ってきました。カントリー調のものばかりでした。そういう展示会みたいです。素材はパインの集成材か、2X4などのSPF材みたいです。タモやナラ、アガチスなどはなかったですが、小さい引き出しに桐を使っているものがありました。
  1. 2009年09月14日 05:34 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

中学校の運動会

昨日は中学校の運動会でした。
最初は曇りの天気で今にも降ってきそうでした。
やたらと競技の進行が早いと思ったら、雨が降らないうちにやれるだけやってしまおうということみたいです。案の定11時ころから雨が降ってきて、一時的にですが、強い雨になりましたが、競技は続行しています。かわいそうになりましたが、だいぶ午後の分もやってしました。
お昼は車の2、3座席目を上げて、フラットフロアにして、みんな車座になって食事をしました。午後からクラス対抗リレーが中止になったりして大変な運動会になりましたが、息子が中学最後の運動会に出られて良かったです。
tyuugaku_undoukai_090912.jpg
  1. 2009年09月13日 06:50 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

KicadでSpartan3ボードを試作4(Spartan3ボードの設計データを公開)

今まで作ってきたSpartan3ボードの設計データを公開する。Spartan3ボードはもったいないが6層の基板だ。興味のある方は、ここからダウンロードしてください。(注:このSpartan3ボードは、フットプリントなどがいい加減です。検証もしていないので、このまま作っても動きません)
ちなみにKicadは、ここからKiCad-2009-02-16-final-WinXP_full_with_components_doc_autoinstall.zipをダウンロードすると良いと思う。
ただ、ライブラリはライセンスに抵触する可能性があるので配布しない。回路図のシンボルだけなので、下に作成したシンボルを貼っておくので、それを見ながら自分で作ってください。(2009/9/14 追記:今、違うパソコンで確かめたらライブラリがなくても問題なく表示されるみたいです)
なおフットプリント(modules) は作っていないので必要ありません。上のバーにライブラリ名が書いてある。
xilinx.lib
KiCAD_68_090912.png

regul.lib
KiCAD_69_090912.png

KiCAD_70_090912.png

KiCAD_71_090912.png

ライブラリの変更および作成の仕方は、”KiCADでSpartan3ボードを試作1”を参考にしてください。これでライブラリを追加すると、下の図のような回路図が見えると思う。
KiCAD_72_090912.png

ちなみにKicadを起動すると最初に下の図のような画面が起動して、Fileメニュー -> Openでダイアログが開いたら、Spartan3_board.proを選択する。これでSpartan3_boardプロジェクトをロードした。
KiCAD_73_090912.png

ここで右のピンクの四角で囲ったアイコンをクリックすると回路図エディタ(EESchema)が起動し、青い四角のアイコンをクリックするとPCBエディタ(PCBnew) を起動できる。
これで、PCBエディタを起動すると、最初はこんな風に見える。
KiCAD_74_090912.png

全面ピンク色で何のことやらわからない。
ここで全部のベタ(Zone)を透かしてみよう。左のDo not show filled areas in zonesアイコンをクリックすると、ベタが枠だけになって全体の配線を見ることができる。
KiCAD_75_090912.png

さらに、High Contrast Mode Displayアイコンをクリックすると、現在の表示層のCopper層以外の配線はハイドされる。
KiCAD_76_090912.png

これで、Show filled areas in zonesアイコンをクリックして、もう一度ベタを表示してみよう。
KiCAD_77_090912.png

ベタが表示されるが、Copper層はベタがないので表示されない。ベタで隠れて他の層の配線は消える。
上のツールバーで層を変更してもよいのだが、ショートカットキーのF5でもInner L1層に変更することができる。どちらかでInner L1層に表示を変更する。ここはGNDベタ層となっている。
KiCAD_78_090912.png

​ここで、LDOレギュレータのLT​​1585-3.3CMのあたりを拡大してみてみよう。拡大するには、その辺をマウスでポイントしてマウスのホイールを​自分のと反対側に回せば拡大できる。
KiCAD_79_090912.png

ピンクで囲った部分がサーマルクロスで、ベタを作った時にGNDに接続されるリード穴に自動的に入った。これはラジアル部品(片方にリードが出ている部品)をハンダ付けする際にベタに熱が逃げるのを防ぐそうである。
黄色で囲ってある方はLDOレギュレータのComponent層のランドから配線を伸ばしてビアを掘ったところ。全面ベタになっている。これは後でドリルをして、スルーホールメッキをするとビアにこのGND層が接続されるのだろう。隣の+3.3VはGND層に接続するとまずいので抜けている。

後はいろいろな層を見てほしい。
最後に​​3D Displayメニューから3D Displayを選ぶと3D画像が見れる。
KiCAD_80_090912.png

画面をドラックして裏面を見ることもできる。
KiCAD_81_090912.png

裏にパスコンが付いているのがわかる。
いろいろKicadをいじってみると面白いと思う。これでKicadはとりあえずおしまいにする。

(追記)
Kicadで検索していたら、Quick KICAD Library Component Builderを見つけました。ICパッケージのライブラリを作るツールみたいです。作ってみた方がいらしたらレポートお願いします。

MiccellaneousメニューからGlobal Deleteを選択すると、Global Deleteダイアログが出ます。そこで、Items to deleteのDelete ZoneをチェックしてOKボタンをクリックすると、ベタがすべて消えますし、Delete TracksをチェックしてOKボタンをクリックすると、すべての配線が消えます(脇のTrack FilterのInclude AutoRouted Tracksのチェックを入れてください)。お好みの状態で自分で気ままにやってみてください。
  1. 2009年09月13日 05:22 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:0

KiCADでSpartan3ボードを試作4

”KiCADでSpartan3ボードを試作3”でZoneのinternal error でだめだったが、今日やってみたら大丈夫だった。2層分ベタ(Zone)を作ると、次のベタのフィル出来なくなったが、全部のベタを作って、適当なZoneを選んでフィルしたら、全部の層のフィルができた。これでまたやってみることができそう。下の図、後から追加したコンデンサもサーマルができている。ピンクで囲った部分。
KiCAD_60_090911.png

やはり、アキシャル部品は電源、GND層にすでにつながっているが、表面実装品は配線とビアが必要なので、電源、GNDだけ配線とビアを作ろうと思う。
まずは、電源やGNDラインなので、配線やビアを大きくする。まずは配線を0.432mmにする。配線やビアを書けるように、Add tracks and viasアイコンをクリックして、配線、ビア書きモードにする。次に右クリックして、Select Track Width -> Track 0.432を選択する。
KiCAD_62_090911.png

同様に、右クリックして、Select Track Width -> Via 1.143を選択する。
KiCAD_62_090911.png

これで、配線やビアを大きくなった。LDOレギュレータLT1585-3.3CMのGNDパッドをGNDに接続する。まずは、現在の層がComponet層になっているのを確認する。Add tracks and viasアイコンをクリックしたままで、GNDパッドをクリックして配線を引き出し、vキーを押すとビアを掘って、GND層のInner L1に接続される。そしてダブルクリックして配線を終える。
KiCAD_64_090911.png

電源、GND全部の配線とビアをうった。(下図)
KiCAD_65_090911.png

これでFreeRouterにデータを渡してオートルートした。やはり、ここまできちんと?やるとオートルートがすぐに終わった。下図がComponent面。(Tips: FreeRouterでオートルートを止めるときには右クリックでメニューを出せば止まる)
KiCAD_66_090911.png

下図がCopper面。
KiCAD_67_090911.png

やっとできました。良かった。完成しないかと思ったが。。。けど、今見ると基板に無駄が多い。6層になってしまったのも痛い。電源を島にして4層にしないとだめだし。。。今後、何か基板を作るときにはKiCADで作ってみようと思う。
なお、Gerberデータは”Designing PCBs in Kicad and PcbNew:”によるとFileメニュー -> plotで出すようだ。
  1. 2009年09月12日 05:43 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:3

FPGAカンファレンス2009に行けなくなりました

FPGAカンファレンス2009に参加申し込みをしていたのですが、緊急の仕事が入ってしまったため、行けなくなりました。非常に残念です。Spartan6やいろいろ見たり聞いたりしてみたかったが、大事な仕事なので仕方ありません。ET2009には行こう、行けたらいいな?と思っています。時期的にも大丈夫だと思うのですが。。。
  1. 2009年09月11日 20:52 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

KiCADでSpartan3ボードを試作3

KiCADでSpartan3ボードを試作2”でいい加減にボードを作ったが、もうすこしSpartan3ボードをまともにしたい。それに、LDOレギュレータたちのパスコンを付けるのを忘れていた。これを追加しないとまともに動かない。そもそもフットプリントがいい加減なので、もともと製造はできないと思うが。。。
下がLDOレギュレータたちのパスコンを追加した回路図。
KiCAD_50_090910.png

これをネットリストに吐きだして、Cvpcbでフットプリントを設定してもう一度ネットリストを吐く。それをPCBnewで読み込むと、新しく追加した部品が一か所に集まって見にくい。そこで右クリックからGlob Move and Place -> Move New Modules を行うと、その近辺で展開されて部品が見やすくなる。(下図は部品を展開した後)
KiCAD_51_090910.png

ちなみに基板の方は、1層内に電源の島を作るのが面倒だったので、6層基板として、内層の各層全面とコンポーネント面の一部にベタを作ってしまった。内層L1はGND、内層L2は+2.5V、内層L3は+3.3V、内層L4は+1.2V、コンポーネント面の一部は+5Vとなった。下の図はコンポーネント面を指定した図である。(PCBnewの左のアイコンの下から2番目、Normal Constant Mode Display アイコンをクリックすると、下のように指定された層(Component層)の配線だけを表示できるので、そうしている)
KiCAD_52_090910.png

なおベタを作る方法は、”Designing PCBs in Kicad and PcbNew:”を参考にしている。

KiCADでSpartan3ボードを試作2”で疑問だったパスコンをFPGAの裏に配置する方法もわかった。それは、もうすでに1個やってあるのだが、やり方を示すと、まずはSpartan3(U4)の後ろにあるC10を右クリックで選択する。
KiCAD_53_090910.png

さらにC10を右クリックして、Footprint C10(Component)を選択して、そのサブメニューのEditを選択する。
KiCAD_54_090910.png

Module Propertiesダイアログが開く。ここでLayerをComponetからCopperの方のラジオボタンをONにする。
KiCAD_55_090910.png

これでOKボタンをクリックするとC10がSpartan3の後ろに回った。表示をComponentからCopper面にするとパッドが見える。
KiCAD_56_090910.png

FPGAの下のすべてのパスコンに対して行い、追加したコンデンサを配置した。
KiCAD_58_090910.png

これでFreeRouterにデータを渡して、オートルートしてもらおうとしたが、よくみてみるとベタを作った後に置いた部品はサーマルが出来ていない。(下の図は内層L1、GND)
KiCAD_59_090910.png

もう一度、ベタ(Zone)を貼りなおしたのだが、3層以上ベタ(Zone)を貼るとinternal errorになってしまった。追加の部品がないときにはベタ(Zone)を貼れたのだけど。。。どうしたんだろうバグかな?
とりあえず、出来なくなってしまったので、これで休止とする。残念。
たぶんもう一度基板図(PCBnew)を作り直すしかないかもしれない。

とりあえず大体の使い方はマスターできたかな?
  1. 2009年09月10日 06:07 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:0

KiCADでSpartan3ボードを試作2

KiCADでSpartan3ボードを試作1”の続き。
大体回路図を書くことができた。(下の図)
KiCAD_36_090908.png

現在はDRCをかけている。DRCはデザインのルールをチェックする機能で、おかしい接続をチェックしてくれる。例えば入力同士がつながっていて、同じネットに出力がないとかいうときにエラーを出してくれる。(ただし部品の番号をふるアノテーションを行ってから) KiCADの回路図エディタ(eeschema) のDRCをしてみよう。Schematic Electric Rules Checkアイコンをクリックする。
KiCAD_37_090908.png

下の図のEEschema Ercダイアログが出てくる。もうすでにDRCを行っているので、エラーが2と出ているが、再度行うときはDel Markersボタンをクリックしてマーカーを消して、Test Ercボタンを押してエラーチェックする。Erc File Report: のWrite erc report にチェックを入れると、エラーリポートをファイルに書いてくれる。
KiCAD_38_090908.png

DRCエラーの場所には、下の図のようなマーカーが出る。
KiCAD_39_090908.png

エラーログを下に示す。

ERC: Warning Pin power_in not driven (Net 41) (X= 3.300 inches, Y= 4.250 inches


何回つなぎなおしてもだめなのだ。おかしい?
+3.3Vの電源のところなのだが、もしかして3端子レギュレータがおかしいのかとlibeditで、LT1585-3.3CMを見てみた。これは、KiCADに入っていたregulライブラリ内のLT1585CMをコピーして、ADJピンをGNDに修正したものだ。2番ピンのOUTを右クリックメニューからEdit Pinを選んでピンのプロパティを見てみることにした。
KiCAD_40_090908.png

ピンのプロパティを見ると電源出力のはずなのにInputになっていた。これをPower Outに変更した。
KiCAD_41_090908.png

GNDもPower Inに変更した。これでセーブして、回路図エディタでもう一度DRCチェックをした。そうするとエラーが1つ減って、後1つになった。
KiCAD_42_090908.png

結構こういうのが隠れているんじゃないか?と思う。
そういえば、パスコンと電源コンポーネントを使うのを忘れていたので追加した。(下図参照)
KiCAD_43_090908.png

Netlist GenerationアイコンをクリックしてNetlistを出力して、Run Cvpcbアイコンを起動してmodule(footprint) を選択した。(回路図シンボルとフットプリントとの対応が良くわからないので、いいかげんです。コンデンサと抵抗はSM0603というのを選択しましたが、これは大きさからするとミリではなくインチ(mil)みたいです。)
KiCAD_44_090908.png

このネットリストをSave Netlist and Footprints List filesアイコンをクリックして、セーブする。
PCBnewを開いて、部品を配置した。だいぶ飽きてきたので、申し訳ないが、いい加減。パスコンも抵抗も拡大しないと見分けがつかないので、いい加減に置いてしまった。
KiCAD_45_090908.png

本当はパスコンはFPGAの裏に実装が良いと思うのだが、うらに置く方法がわからない。Copper面を選択しながら部品を配置すればいいのかな?基板は4層にしたのだが、中の1層はGND、内層のもう1層は電源、2.5V, 3.3V, 1.2Vを分けて島を作る必要があるのだが、とりあえず面倒なので、そうしなかった。やればできると思う。
これで配線幅と間隔を0.125mmに設定した。(いい加減です)
KiCAD_46_090908.png

FreeRouterに渡してオートルートさせたが、フィットしないのでルールを変更した。
KiCAD_47_090908.png

これでFreeRouterに渡してオートルートさせたら1時間ほどでフィットした。(下図)
KiCAD_48_090908.png


基板を作る上での問題点は

1.日本の抵抗のサイズ、1608, 1005などがないのでフットプリントを作成する必要がある。いろんな部品のフットプリントも。
2.フットプリントがどれがどれに対応するのか?良くわからない。回路図シンボルとフットプリントが別だから。この辺を整備する必要があるのではないか?
3.今回はやらなかったが、部品をCopper面に配置できるのだろうか?
4.最初に内層のGNDベタや電源ベタを作ると配線が見にくくなると思うが、その層だけを見る方法があるのか?
5.電源、GNDラインだけ配線幅を変えてオートルート出来るのか?これはFreeRouterでネットをクラス分けで切るので、これでやればできることと思う。


両面基板で、部品面だけに部品が載るのだったら基板を作れる気がしてきた。
しかし、基板を作るのは面倒だ。根気が続かない。フットプリント、パスコンの位置、抵抗の位置、考えることが多い。片手間で基板は作れませんね。。。基板を作って配布している方を尊敬しました。どうしても作りたいものがないので、作りませんが、作りたいものができたら本腰で作ってみたいと思います。
とりあえずKiCADの使い方は課題が残っているがこれまでとする。フリーのPCBCADとしては、本当にいいソフトだと思う。誰かやり方のページを書いてください。(他力本願)

(追記)
4.は解決方法が見つかった。PCBnewの左のアイコンの下から2番目、Normal Constant Mode Display アイコンをクリックすると、下のように指定された層(Component層)の配線だけを表示して、他の層の配線を薄く表示できる。これで各層の配線がわかりやすくなりそうだ。
KiCAD_49_090908.png

上の図と見比べてほしい。断然、その層の配線が見やすくなった。もう少しまともな基板にしてみようかな?

ご希望の方がいらっしゃれば、このSpartan3基板のKiCADのファイルを公開します。
  1. 2009年09月08日 06:37 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:2

板と板のはぎ

昨日から今日にかけて、板と板をはぎました。はぐというのは板と板を張り合わせて、大きな一枚の板にすることです。板の幅が24cmだったので、半分に切った12cmの板とくっつけて36cm幅にしました。
まずは板の直角を出すために電気かんなで削ります。板の端と端に木工用ボンドを塗って合わせます。さらに、棒で押さえて、端金で止めます。その際に必ず、上にかけたら下にもかけないと板が曲がってしまいます。材料はアガチスという南洋材です。これは狂いが少なくてよいのですが、柔らかいです。下がやっている様子です。
itahagi_1_090906.jpg

これがくっついて36cm幅になった板です。
itahagi_2_090906.jpg

これから、大きな電気かんなでかんながけしてもらうと、つなぎ目がわからなくなります。
  1. 2009年09月06日 17:28 |
  2. 木工
  3. | トラックバック:0
  4. | コメント:0

KiCADでSpartan3ボードを試作1

KiCADでSaprtan3ボードを書いてみた。デザインウェーブマガジン2005年1月号の30ページの回路図を参考に書いてみることにした。デザインウェーブマガジン2005年1月号は持っているが、今手元にないので、コネクタはいい加減に配線することにした。
まずは回路図を書きます。Spartan3のXC3S50-VQ100はライブラリにあったので、配置できたが、XilinxのROMのXCF01SVO20CがXilinxのライブラリの中にない。ここはlibrary ediorで編集することにした。eechemaからlibrary editorアイコンをクリックして、library editorを呼ぶ。(下の図は実際にライブラリに追加した後です)
kicad_29_090904.png

Libeditが起動する。私がやったのはチュートリアルのように、Select Component to editアイコンをクリックして、すでにあったXCF08を呼んできて編集した。
kicad_30_090904.png

編集は、ピンをドラックで選択して移動したり、ピンの位置で右クリックしてDeleteしたり、同じく右クリックメニューからEdit Pinを選んで、名前、入出力の変更などを行った。下の図は右クリックメニューからEdit Pinを選んだ時に出てくるダイアログ。
kicad_31_090904.png

チップの名前をダブルクリックして変更し、四角い枠が大きかったので、右はじで右クリックするとメニューからDeleteが選べたので、削除した。もう一度、右側のメニューのAdd Rectanglesアイコンを選んで四角を描画した。
最後にLibeditの一番左はじのアイコン、Save current loaded library on disk (file update) をクリックしてセーブした。ダイアログはすべてYes。
kicad_33_090904.png

そうすると、回路図エディタ(eechema)でXCF01SVO20Cが選べるようになった。(最初の図)

次はモジュール(フットプリント)の追加なのだが、TSSOP24パッケージがあるみたいなので省略。
LDOレギュレータが結構大変だった。DWMのレギュレータはKiCADにライブラリがなかった。それでリニアテクノロジ社のLDOレギュレータを選定したのだが、電圧アジャスト出来るタイプを使おうとすると1.2Vまで出力できなかったりして、数回やり直した。結局、LDOレギュレータのセレクションガイドを見て、1.2VはLT3021、2.5VはLT1763にした。両方ともライブラリを作った。
kicad_34_090904.png

現在までの回路図の出来上がり状況。
kicad_35_090904.png
  1. 2009年09月06日 17:09 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:4

Avalon-MMスレーブペリフェラル4(Nios2 IDEで7セグLEDをテスト)

KiCADをいじっていたので、前回と間が空いてしまったが、ダイナミック点灯7セグメントLEDのAvalon-MMスレーブペリフェラルをNios2 IDEでファームを作って動作チェックをしてみることにした。
まずはQuartus2のProgrammerでボードに書き込んでみた。そうすると7セグメントLEDはオール0を表示した。とりあえず合っているが、少し明るさが暗い感じだ。ダイナミック点灯の1KHzに周波数が高すぎるのか?それとも分周をミスって周波数が高いのかはわからない(オシロを持っていないので)後で実際に値を表示してみればわかると思う。
Nios2 9.0 IDEを立ち上げて、新しいboard_diagを作った。具体的にはFile メニューからNew -> NiosⅡ C/C++ Application を選択した。New Project ダイアログが起動した。
Name にboard_diag_7segと入れてPTFファイルを選択し、Finishボタンをクリックして、Board Diagnosticsテンプレートを生成した。
AvalonMMslave7seg_21_090829.png

Nios2 9.0 IDEの左のペインのboard_diag_7segのところで右クリックして、Build Projectを選択してプロジェクトをビルドした。
AvalonMMslave7seg_22_090829.png

board_diag_7seg_syslib\Debug\system_description\system.h にAvalonMM_Slave_Dyna7seg_0 configurationが出来ていた。

/*
* AvalonMM_Slave_Dyna7seg_0 configuration
*
*/

#define AVALONMM_SLAVE_DYNA7SEG_0_NAME "/dev/AvalonMM_Slave_Dyna7seg_0"
#define AVALONMM_SLAVE_DYNA7SEG_0_TYPE "AvalonMM_Slave_Dyna7seg"
#define AVALONMM_SLAVE_DYNA7SEG_0_BASE 0x00000020
#define AVALONMM_SLAVE_DYNA7SEG_0_SPAN 32
#define AVALONMM_SLAVE_DYNA7SEG_0_TERMINATED_PORTS ""
#define ALT_MODULE_CLASS_AvalonMM_Slave_Dyna7seg_0 AvalonMM_Slave_Dyna7seg


これからファームを書いて、7セグメントLEDをテストしする。
最初にboard_diag.cの既存の7セグメントLEDのテストルーチンを改造した。オリジナルは2ケタの7セグメントLEDに00からFFの表示をするものだった。今回のボードは8桁あるので、2桁ずつ00からFFまで表示するようにした。下にそのCコードを示す。

static void SevenSegCount( void )
{
  alt_u32 count;
  
  for (count = 0; count <= 0xff; count++)
  {
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+4, count>>4);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+8, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+12, count>>4);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+16, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+20, count>>4);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+24, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+28, count>>4);
    usleep(500000);
  }
}


上のコードに書き換えて、他のところもつじつまの合わない部分を書き換えて、左側のペインのboard_diag_0 で右クリックしてRun As -> Nois Ⅱ Hardware を選択しmakeした。
その結果、表示が全く読めない。ただし、全部のLEDに同じ数字がそろうときにはきちんと読むことができる。
次に、先ほどのコードをしたように変更して、全部の7セグLEDに同じ表示が出るようにした。

static void SevenSegCount( void )
{
  alt_u32 count;
  
  for (count = 0; count <= 0xff; count++)
  {
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+4, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+8, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+12, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+16, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+20, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+24, count&0xf);
    IOWR_ALTERA_AVALON_PIO_DATA(AVALONMM_SLAVE_DYNA7SEG_0_BASE+28, count&0xf);
    usleep(500000);
  }
}


そうするときちんと表示されてたのだが、Dを表示した後にFになっている。Eが抜けているようだ。B27segDec.vのソースを見るとEを表示する記述が抜けていた。失敗。。。早速、Eを表示する記述を書き加えた。
表示がおかしいのは、7セグLEDのダイナミック点灯の周波数が高くて、スイッチング用のトランジスタが間に合っていないのが原因じゃないかと思う。
上記の項目を修正して、もう一度Quartus2でコンパイル、Nios2 9.0 IDEでBuild Projectを行った。
今度はEは点灯したが、やはり表示がおかしい。


わかりました。ケアレスミスです。それは。。。

AvalonMM_Slave_Dyna7seg.vファイルのseven_seg_digitを接続するのを忘れていました。道理でこれでは表示がおかしくなるはずです。

assign seven_seg_digit = drive_led;


を追加しました。これで正常になるでしょう。元も直しておきました。でもQuartus2ではエラーにならないんですね。ISEでは確実にピンがなくなり、UCFと合わないので、Translateでエラーが出ます。
これでまた、もう一度やり直して、Consoleでボードと通信ができるようになりました。下はNios2 9.0 IDEの一番下のConsoleペインです。Main Menuからd: Seven Segmeent Menuを選択するためにSelect Choiceに d +リターンキーを入力します。
AvalonMMslave7seg_24_090903.png

Seven Segment Menuからa: Count From 0 to FF. を選択するために a +リターンキーを入力します。b:は実装してありません。
AvalonMMslave7seg_25_090903.png

そうすると、ボードの7セグメントLED8個が4つの組で00からFFまでカウントを始めました。良かった。ケアレスミスでした。
AvalonMMslave7seg_090904.jpg

紆余曲折、途中でKiCADに浮気するというアクシデントはあったが、曲がりなりにもAvalon-MMスレーブペリフェラルを実装することができて、良かった。
  1. 2009年09月04日 06:06 |
  2. SOPC Builder
  3. | トラックバック:0
  4. | コメント:0

私の誕生日

昨日は私の誕生日でした。うれしくもありませんが51回目の誕生日です。
うちの奥さんがダンデライオンでケーキを買ってきてくれました。普段は頭が上がりませんが、うれしいですね。(これは秘密ですよ、笑)
cake_1_090902.jpg

51というろうそくを買ってきてくれたので、ケーキに刺しました。ろうそくが大きい。。。
cake_2_090902.jpg

火をともすとこんな感じ。じじいになったという実感がわきました。
cake_3_090902.jpg

ケーキはムースのようなチーズケーキでとてもおいしかったです。また食べたいですね。下にラズベリージャムが入っていました。

51歳の記念じゃないですが、どこかでSpartan3A Starter KitのDDR2 SDRAMコントローラのこととかプレゼンできれば?と思っていますが、適当なところはないでしょうか?FPGAのことをある程度わかってる集団でしないとわからないでしょうし。。。
もっともあがり症なのでプレゼンできるかどうか?わからないですが、そのような場はあるのかな?と思いました。
  1. 2009年09月02日 05:55 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:6

KiCADからFreeRouterへデータを渡してオートルート

KiCADをすこし、いじっている。だいぶ分かってきたが、まだ1つのレイヤーだけを表示する方法がわからない。これがないとベタを作るときに多層板だと良くわからなくなると思うのだが。。。
今回はKiCAD上でオートルートせずに、FreeRouterにデータを渡してオートルートしてから、その配線情報をKiCADに読み込む操作を書いておこうと思う。メリットはKiCADのPCB editorにはないUNDO, REDOが使えることだ。
まずは、簡単な回路だけど、配線情報(Tracks)がなくてラッツネットだけの基板を用意し、FreeROUTEを起動するアイコンをクリックする。
kicad_8_090901.png

dialog_freeroute_exchangeダイアログが表示される。デザインをExportする。Export a Specctra Design(*.dsn) Fileボタンをクリックする。
kicad_9_090901.png

保存用のダイアログが開く。test1.dsnという名前でセーブする。
kicad_10_090901.png

Lanch FreeRouter via Java Web Startボタンをクリックして、FreeRouterを起動する。
kicad_11_090901.png

FreeRouterが起動する。Open Your Own Design ボタンをクリックする。
kicad_12_090901.png

セキュリティ警告が出るが、了解ボタンをクリックする。.dsnファイルを読み込むダイアログが出る。test1.dsn を指定して開く。
kicad_13_090901.png

confirmのダイアログが出てくるのでYesボタンをクリックする。
kicad_14_090901.png

すると、FreeRouterのBoard Layoutに今までのデザインが表示される。Tool BarでRouteを選択する。
kicad_15_090901.png

ParameterメニューからSelectを選択する。
kicad_16_090901.png

Select Parameterウインドウが開く。大体、動作はわかると思うが、Current Layerで現在描画するレイヤーを選択できる。Componentを選択する。
kicad_17_090901.png

Board Layoutウインドウでパーツのパッドを左クリックしてクリックを離すと、現在選択されたレイヤーに配線を引くことができる。
kicad_18_090901.png

そのまま目的のパッドに持っていくと配線を引き終わることができるが、途中で右クリックして、レイヤーを変えることもできる。
kicad_19_090901.png

Select ParameterダイアログのCurrent Layerで現在描画するレイヤーをCopperにするとCopper面(ハンダ面)に配線が引ける。
kicad_20_090901.png

ここでTool BarのUndoをクリックすると直前の配線がラッツネットに戻り、Redoをクリックすると配線が戻る。良い感じ。
これでTool BarのAutorouterをクリックすると、今、配線済みのネットまで再配線されてしまう。そこで配線済みのネットはオートルートの対象外にしよう。
ParameterメニューからAutorouteを選択する。
kicad_21_090901.png

Autoroute Parameterダイアログが開く。Passes:のPostrouteのラジオボタンをはずすと配線済みは再配線されなくなる。
kicad_22_090901.png

Tool BarのAutorouterをクリックするとオートルートされる。結果が下の図。マニュアル配線済みはそのまま残っている。
kicad_23_090901.png

さて、この結果をKiCADに戻すことにする。FileメニューからExport Specctra Session Fileを選択する。
kicad_24_090901.png

ファイルを書き込みますよ?というダイアログが出るので、了解ボタンをクリックする。
保存ダイアログが出るので、test1.sesというファイル名を入力して、保存ボタンをクリックする。
kicad_25_090901.png

Save also the rules created in this program for later reuse?というダイアログが出る。はい(Y)ボタンをクリックする。
これでFreerouterの処理は終わったので、KiCADに読み込む。
dialog_freeroute_exchangeダイアログのBack Import the Specctra Session (*.ses) Fileボタンをクリックする。
kicad_26_090901.png

Merge Specctra Session file:ダイアログが開く。test1.sesを選んで、開くボタンをクリックする。
kicad_27_090901.png

そうすると、今までFreerouterでやってきた配線結果がKiCADに反映された。
kicad_28_090901.png

これで、今回はおしまい。長かった。。。途中で入力したテキストが消えてしまった。くやしー。
もうすこし、KiCAD、Freerouterの機能を調べてみよう。時間があればSpartan3ボードでも設計してみたい。
  1. 2009年09月01日 06:03 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:0