FC2カウンター FPGAの部屋 2013年06月

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

FPGAの部屋

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

さくらんぼ狩りと美味しいお蕎麦

昨日、山形市に行ってさくらんぼ狩りをして来ました。その後美味しいお蕎麦を食べて来ました。

昨日の午前5時30分頃、家を出て、午前10時ころに山形市のさくらんぼ狩り園、喜三郎に着きました。山形道の笹谷トンネルの宮城県側は雨だったのですが、山形県側に抜けたら良い天気でした。
去年、ここにさくらんぼ狩りに行ったので、案内の封筒が着ていました。案内の封筒を渡すとさくらんぼ狩りの料金が1,200円から1,000円になって、200円割引されました。更に、今年はかご一杯に取って500円というイベントをやっていたので、2人分頼んで、合計3,000円でした。

さくらんぼがあるハウスに入ると、去年同様、とっても暑かったです。今年も暑いと思って、下にTシャツを着ていたので、準備万端でしたが、やはり暑かったです。さくらんぼ狩りは40分間なので、どの木が甘いか教えてもらってから、さくらんぼ狩りをします。
Cherry_1_130630.jpg

食べてみると、やはり佐藤錦が一番味が良いと感じました。南陽は大きいんですが、味は淡白です。この時は食べ放題で食べ飽きるほど食べたので、味がわからなかったのですが、家に帰ってきて食べて見るとどれも美味しいです。黒っぽいさくらんぼもありました。さくらんぼの種類。さくらんぼが、たくさんなっていました。
Cherry_2_130630.jpg

かごに沢山さくらんぼを詰めました。1つは仙台の娘のところに、1つは自宅に持ち帰りました。
Cherry_3_130630.jpg

さくらんぼ狩り園で、美味しい蕎麦屋を教えてもらいました。芳亭というお蕎麦屋さんです。
Cherry_4_130630.jpg

さくらんぼ狩り円から4~5km離れていしました。天ざるそばがおすすめということで、食べたのですが、エビが大きくてプリプリで美味しかったです。そばも腰があり美味しかったです。
Cherry_7_130630.jpg

その後で、やはり、蔵王の露天風呂に行きました。やはり、川のそばの野趣あふれる露天風呂は最高です。泉質も硫黄の匂いが漂っていて、とっても温泉らしいです。
温泉の写真は去年取ったので、周りの写真を載せておきます。ここは蔵王のサンライズゲレンデの下のレストハウス(テラスサンパル)の駐車場です。スキーに行った時は雪をかぶった平地です。奥にカモシカ大橋があります。
Cherry_5_130630.jpg

夏のサンライズゲレンデです。草が生えています。夏に見ると斜度がありますね。
Cherry_6_130630.jpg

この後は娘のいる仙台に行きました。
今日奥さんが夜勤なので、朝7時30分に仙台を出て、つくばに午後12時に着きました。東北道はとってもスムーズでしたよ。来年はお地蔵さんを見に行きたいですね。。。

(追加)
日曜日、朝8時ころの東北道の菅生SAで色違いカウンタック4台+黄色のフェラーリ1台の軍団がいました。黒、ターコイズ、深い青、赤のカウンタックです。サーキットの狼世代としてはとっても気になりました。東北道上で追っかけたんですが、追いつくはずもありません。。。
Cherry_9_130630.jpg

Cherry_10_130630.jpg

黒、赤、ターコイズのカウンタックです。黒のカウンタックの左側のガルウイングが半分開いた状態です。電動で閉まるんでしょうかね?
  1. 2013年06月30日 18:38 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ISim で OVL Ver. 2.7 のOVLライブラリを使用したシミュレーション

ISim で OVL Ver. 2.7 のOVLライブラリのコンパイルと登録”で、OVL Ver. 2.7 のOVLライブラリをISimでコンパイルして登録した。

今回は、ISimを使って、OVL Ver. 2.7 のOVLライブラリを使用したシミュレーションを行う。AXI4 Slave インターフェースのメモリ・シミュレーション用 IPを使って、OVLのライブラリを使ったシミュレーションを行った。これについては、後で詳しくブログに書くつもりだ。

Project Navigator でプロジェクトを作製して、ISimでシミュレーションを行う。下に、Project Navigator のプロジェクトを示す。
std_ovl_v2p7_simlib_7_130628.png

次に、OVLのライブラリを使用するためのISimのプロパティを下に示す。
std_ovl_v2p7_simlib_8_130628.png

Other Compiler Options : -L accellera_ovl_vlog=C:\HDL\Xilinx\14.6\ISE_DS\ISE\verilog\hdp\nt64\accellera_ovl_vlog
Specify Search Directories for 'Include : D:\HDL\OVL\std_ovl_v2p7
Specify 'define Macro Name and Value : OVL_VERILOG,OVL_ASSERT_ON,OVL_FINISH_OFF


上に示すオプションを設定してある。

OVLのチェッカーは、”キャラクタ・ディスプレイ・コントローラをAXI4スレーブにする8.4(OVLチェッカのVerilog コード)”にある。アサーションのエラーが出ているので、修正する可能性がある。もう、一部修正した。修正済みのコードは、後でブログに貼る。
シミュレーション波形を下に示す。
std_ovl_v2p7_simlib_9_130628.png
  1. 2013年06月28日 19:56 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:0

ISim で OVL Ver. 2.7 のOVLライブラリのコンパイルと登録

元ネタは、”ISimでOVLのVHDL, Verilog混在シミュレーション(OVLライブラリのコンパイルと登録)”だが、この時は、Windows XPだったが、Windows 7 64ビット版になって、HDDのアサインが変わってしまったのと、OVLもバージョン2.7になったので、もう一度、ブログに書いておくことにした。

現在のOVL Ver. 2.7 の入手先は、”License and Statement of Use of Accellera System Initiative's Open Verification Library”です。そのWebページの”Accept agreement and proceed to download OVL.”をクリックするとダウンロード出来ます。


現在の OVL_Verilog_Lib_Comp.bat と OVL_VHDL_Lib_Comp.bat を示す。これをコマンドプロンプトから実行するとISim の OVLライブラリが作成できる。
std_ovl_v2p7_simlib_1_130627.png

OVLライブラリ・コンパイル用バッチファイルは、OVLバージョン2.7用にしたことと、HDDのアサイン、それに、コマンドのパスがなくなったので、フルパスでコマンドを指定している。

最初に、Verilog HDLのライブラリをコンパイルする。

ISimでOVLのVerilog HDLライブラリをコンパイルするバッチファル、OVL_Verilog_Lib_Comp.bat の内容を下に示す。

C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_always.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_always_on_edge.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_arbiter.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_bits.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_change.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_code_distance.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_coverage.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_decrement.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_crc.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_cycle_sequence.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_delta.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_even_parity.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_fifo.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_fifo_index.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_frame.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_handshake.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_hold_value.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_implication.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_increment.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_memory_async.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_memory_sync.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_multiport_fifo.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_mutex.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_never.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_never_unknown.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_never_unknown_async.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_next.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_next_state.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_no_contention.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_no_overflow.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_no_transition.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_no_underflow.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_odd_parity.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_one_cold.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_one_hot.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_proposition.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_quiescent_state.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_range.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_reg_loaded.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_req_ack_unique.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_req_requires.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_stack.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_time.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_transition.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_unchange.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_valid_id.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_value.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_value_coverage.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_width.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_window.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_win_change.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_win_unchange.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_xproduct_bit_coverage.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_xproduct_value_coverage.v
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vlogcomp -d OVL_VERILOG -d OVL_ASSERT_ON -d OVL_FINISH_OFF -i D:\HDL\OVL\std_ovl_v2p7 -work accellera_ovl_vlog D:\HDL\OVL\std_ovl_v2p7\ovl_zero_one_hot.v


OVL_Verilog_Lib_Comp.bat をコマンドプロンプトで実行した。
std_ovl_v2p7_simlib_2_130627.png

フォルダに、fuse.xmsgs というファイルと、isim フォルダが出来た。
std_ovl_v2p7_simlib_3_130627.png

isim\accellera_ovl_vlog フォルダに、Verilog HDL の OVLライブラリがコンパイルされていた。
std_ovl_v2p7_simlib_4_130627.png

次に、VHDLのOVLライブラリをコンパイルする。

ISimでOVLのVHDLライブラリをコンパイルするバッチファル、OVL_VHDL_Lib_Comp.bat の内容を下に示す。

C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\std_ovl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\std_ovl_procs.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\std_ovl_components_vlog.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\std_ovl_clock_gating.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\std_ovl_reset_gating.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_always.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_always_on_edge.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_change.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_cycle_sequence.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_decrement.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_delta.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_even_parity.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_fifo_index.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_frame.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_handshake.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_implication.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_increment.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_never.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_never_unknown.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_never_unknown_async.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_next.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_no_overflow.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_no_transition.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_no_underflow.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_odd_parity.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_one_cold.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_one_hot.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_proposition.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_quiescent_state.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_range.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_time.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_transition.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_unchange.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_width.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_win_change.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_win_unchange.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_window.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\ovl_zero_one_hot.vhd

C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_always_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_cycle_sequence_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_implication_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_never_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_never_unknown_async_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_never_unknown_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_next_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_one_hot_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_range_rtl.vhd
C:\HDL\Xilinx\14.6\ISE_DS\ISE\bin\nt64\vhpcomp -work accellera_ovl_vhdl D:\HDL\OVL\std_ovl_v2p7\vhdl93\ovl_zero_one_hot_rtl.vhd


OVL_VHDL_Lib_Comp.bat をコマンドプロンプトで実行した。
std_ovl_v2p7_simlib_6_130627.png

そうすると、SimLib\isim\accellera_ovl_vhdl フォルダが作られて、VHDL の OVLライブラリが作られた。
std_ovl_v2p7_simlib_5_130627.png

コンパイルした2つのライブラリを登録する。

私のパソコンでは、C:\HDL\Xilinx\14.6\ISE_DS\ISE\vhdl\hdp\nt64 に accellera_ovl_vhdl フォルダを移動した。

C:\HDL\Xilinx\14.6\ISE_DS\ISE\verilog\hdp\nt64 に accellera_ovl_vlog フォルダを移動した。

C:\HDL\Xilinx\14.6\ISE_DS\ISE\vhdl\hdp\nt64\xilinxsim.ini ファイルに以下の項目を追加した。

accellera_ovl_vlog=$XILINX/verilog/hdp/nt64/accellera_ovl_vlog
accellera_ovl_vhdl=$XILINX/vhdl/hdp/nt64/accellera_ovl_vhdl


これで、OVLライブラリのコンパイルと登録は終了だ。
  1. 2013年06月27日 05:40 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:0

AXI4 Slave インターフェースのメモリ・シミュレーション用 IP の作製1

AXI VDMAのレジスタ設定用AXI Lite Master IPの作製4(XPSへAdd IP)”で、AXI VDMAのレジスタ設定用のIPが出来た。

最後の図で、AXI VDMAをシミュレーションするために何が足りないかというと、メモリのシミュレーション・モデルということになる。
AXI_Lite_Master_6_130623.png

上の図で、axi_vdma_0 の M_AXI_MM2S と M_AXI_S2MM に接続できるAXI4 Slave インターフェースのメモリ・モデルが必要となる。

現在、AXI4 Slave インターフェースのメモリ・モデルは、殆どできていて、メモリ・モデルのシミュレーションの準備を進めている。AXI4 Master 簡易BFMとOVLチェッカーを使用する。(AXI4 Slave IPに関しては、”AXI4 Slave IPの作製”を参照のこと)
  1. 2013年06月27日 05:17 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

Verilog HDLでの log2 の求め方(Constant Functions in Verilog 2001)

Beyond Circuits は、Synchronous FIFO や LIFO などのXSTでの書き方が書いてある有用なWebページだ。

そこの、Constant Functions in Verilog 2001 を見ると、Verilog HDLによる log2 の求め方が書いてあった。

Constant Function とは、コンパイル時に値が決まる定数のFunction をビット幅の宣言時などに呼び出して、ビット幅を決定できる関数のことである。つまり、定数値をコンパイル時に決定するために使用し、実際の回路にはならない関数のことだ。これで log2 の演算を定義すると、ビット幅をメモリサイズから定義できるので、とっても便利だ。

Constant Functions in Verilog 2001 の記述を参照して、メモリ・モジュールを書いてみた。インプリメントするとBlockRAMにアサインされると思うが未確認だ。下に示す。(2013/06/26:変更)(2013/07/03:バグ修正)

// 8bit Memory Module

`default_nettype none

module memory_8bit #(
    parameter integer C_S_AXI_ADDR_WIDTH            = 32,
    parameter integer C_MEMORY_SIZE                    = 512    // Word (not byte)
)(
    input    wire    clk,
    input    wire    [C_S_AXI_ADDR_WIDTH-1:0]    waddr,
    input    wire    [7:0]    write_data,
    input    wire    write_enable,
    input    wire    byte_enable,
    input    wire    [C_S_AXI_ADDR_WIDTH-1:0]    raddr,
    output    reg        [7:0]    read_data
);

    // Beyond Circuts, Constant Function in Verilog 2001を参照しました
    // http://www.beyond-circuits.com/wordpress/2008/11/constant-functions/
    function integer log2;
        input integer addr;
        begin
            addr = addr - 1;
            for (log2=0; addr>0; log2=log2+1)
                addr = addr >> 1;
        end
    endfunction
    
    reg        [7:0]    mem    [0:C_MEMORY_SIZE-1];
    wire    [log2(C_MEMORY_SIZE)-1:0]    mem_waddr;
    wire    [log2(C_MEMORY_SIZE)-1:0]    mem_raddr;
    
    // The Address is byte address
    assign mem_waddr = waddr[(log2(C_MEMORY_SIZE)+log2((C_S_AXI_ADDR_WIDTH/8)))-1:log2((C_S_AXI_ADDR_WIDTH/8))];
    assign mem_raddr = raddr[(log2(C_MEMORY_SIZE)+log2((C_S_AXI_ADDR_WIDTH/8)))-1:log2((C_S_AXI_ADDR_WIDTH/8))];
    
    // Write
    always @(posedge clk) begin
        if (write_enable & byte_enable)
            mem[mem_waddr] <= write_data;
    end
    
    // Read
    always @(posedge clk) begin
        read_data <= mem[mem_raddr];
    end
endmodule

`default_nettype wire


(追加)
AR# 44586 13.2 Verilog $clog2 関数が正しくインプリメントされていない”に、定数関数 (Constant Function) のコードも書いてありました。
  1. 2013年06月25日 08:30 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:6

AXI VDMAのレジスタ設定用AXI Lite Master IPの作製4(XPSへAdd IP)

前回の記事は、”AXI VDMAのレジスタ設定用AXI Lite Master IPの作製3(HDLソースの公開)

一連のシリーズの目的は、なるべくXilinxで提供されているIPを使用してカメラの画像をディスプレイに表示することだ。AXI VDMAの使い方がわからないので、周辺を作りながらシミュレーションをしようと思っている。

今回は、AXI4 Lite Master IPの reg_set_axi_lite_master を上に書いたシミュレーション用のXPSプロジェクト VDMA_test に、Add IPした。

・まず、MPDファイル、PAOファイルを修正して、XPSプロジェクトの Projectメニューから Rescan User Repositories を実行した。(MUIファイルはいじる必要がなかった)

・ユーザーのカスタムIPとして、reg_set_axi_lite_master が見えた。
AXI_Lite_Master_4_130623.png

・Add IPを行った。ダイアログは設定項目がないので見るだけだ。
AXI_Lite_Master_5_130623.png

・reg_set_axi_lite_master がAdd IPされた。AXI VDMAの S_AXI_LITE バスと接続した。
AXI_Lite_Master_6_130623.png

MPDファイル、PAOファイルはほとんど修正していないので、省略する。
  1. 2013年06月23日 05:44 |
  2. AXI Lite Master IPコアの作製
  3. | トラックバック:0
  4. | コメント:0

PlanAheadプロジェクトでUCF を XDC 制約/コマンドに変換する方法

PlanAheadプロジェクトでUCF を XDC 制約/コマンドに変換する方法を試して見ることにした。

最初に、”AR# 50376 2012.x Vivado 制約 - UCF を XDC 制約/コマンドに変換する方法”を見て、PlanAheadのTclコンソールで、”write_xdc”と入力したのですが、エラーだった。

次に、”Vivado Design Suite 移行手法ガイドUG911 (v2012.2) 2012年7月25日”の19ページ~20ページの”PlanAhead ツールで UCF を XDC に変換”を見ると下のように書いてあった。引用する。

1. UCF 制約を含むプロジェクトを開き ます。
2. [Open Synthesized Design] をクリックします。
3. Tcl コンソールに 「write_xdc filename.xdc」 と入力します。


やってみた。

・最初に、PlanAheadプロジェクトを開いて、[Open Synthesized Design] をクリックした。
UCF_XDC_1_130622.jpg

・Tcl Console で、write_xdc ZedBoard_CamDisp_wHDMI.xdc と入力した。
UCF_XDC_2_130622.jpg

・おお。ZedBoard_CamDisp_wHDMI.xdc が出来たようだ。
UCF_XDC_3_130622.jpg

・エクスプローラを見ると、確実に ZedBoard_CamDisp_wHDMI.xdc が出来ていた。179KB とかなり大きなファイルだ。
UCF_XDC_4_130622.png

・ZedBoard_CamDisp_wHDMI.xdc をエディタで開いてみた。
UCF_XDC_5_130622.png

これで、ZedBoard用XDCファイルが出来たので、Vivado 2013.2 にIP Integrator のチュートリアルを試して見ることができる。
  1. 2013年06月23日 04:48 |
  2. Vivado
  3. | トラックバック:0
  4. | コメント:0

XPSのカスタムIPにおけるMPDファイルの書き方4

このブログ記事のトップは、”XPSのカスタムIPにおけるMPDファイルの書き方1
前の記事は、”XPSのカスタムIPにおけるMPDファイルの書き方3

キャラクタ・ディスプレイ・コントローラをAXI4スレーブにする13(Writeはうまく行った)”で使用した cdc_axi_slave IPで使用しているMPDファイルの書き方について、ここに書いておく。

PARAMETER C_S_AXI_NUM_ADDR_RANGES = 1, BUS = S_AXI, DT = INTEGER, ASSIGNMENT = OPTIONAL_UPDATE, TYPE = NON_HDL, RANGE = (1:4)


C_S_AXI_NUM_ADDR_RANGESのデフォルト値を1に定義して、レンジは1~4までのinteger だ。”ASSIGNMENT = OPTIONAL_UPDATE”は、、Platform Specification Format Reference ManualEmbedded Development Kit (EDK) 14.1 UG642 (v14.1) April 24, 2012 の42ページによると、TCLプロシージャに関連付けられているMHSの値を指定できるとのことだ。このパラメータはAXI Slave IPにアドレス・スペースがいくつあるかを指定する。

この後で、アドレス・スペースを並べて書いて、C_S_AXI_NUM_ADDR_RANGES で指定された数だけ有効になる。

PARAMETER C_S_AXI_RNG00_BASEADDR = 0xFFFFFFFF, BUS = S_AXI, DT = std_logic_vector, ADDRESS = BASE, PAIR = C_S_AXI_RNG00_HIGHADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 1), TYPE = NON_HDL, MIN_SIZE = 0x1000
PARAMETER C_S_AXI_RNG00_HIGHADDR = 0x00000000, BUS = S_AXI, DT = std_logic_vector, ADDRESS = HIGH, PAIR = C_S_AXI_RNG00_BASEADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 1), TYPE = NON_HDL
PARAMETER C_S_AXI_RNG01_BASEADDR = 0xFFFFFFFF, BUS = S_AXI, DT = std_logic_vector, ADDRESS = BASE, PAIR = C_S_AXI_RNG01_HIGHADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 2), TYPE = NON_HDL, MIN_SIZE = 0x1000
PARAMETER C_S_AXI_RNG01_HIGHADDR = 0x00000000, BUS = S_AXI, DT = std_logic_vector, ADDRESS = HIGH, PAIR = C_S_AXI_RNG01_BASEADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 2), TYPE = NON_HDL
PARAMETER C_S_AXI_RNG02_BASEADDR = 0xFFFFFFFF, BUS = S_AXI, DT = std_logic_vector, ADDRESS = BASE, PAIR = C_S_AXI_RNG02_HIGHADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 3), TYPE = NON_HDL, MIN_SIZE = 0x1000
PARAMETER C_S_AXI_RNG02_HIGHADDR = 0x00000000, BUS = S_AXI, DT = std_logic_vector, ADDRESS = HIGH, PAIR = C_S_AXI_RNG02_BASEADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 3), TYPE = NON_HDL
PARAMETER C_S_AXI_RNG03_BASEADDR = 0xFFFFFFFF, BUS = S_AXI, DT = std_logic_vector, ADDRESS = BASE, PAIR = C_S_AXI_RNG03_HIGHADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 4), TYPE = NON_HDL, MIN_SIZE = 0x1000
PARAMETER C_S_AXI_RNG03_HIGHADDR = 0x00000000, BUS = S_AXI, DT = std_logic_vector, ADDRESS = HIGH, PAIR = C_S_AXI_RNG03_BASEADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 4), TYPE = NON_HDL


ここで、C_S_AXI_RNG00_BASEADDR と C_S_AXI_RNG00_HIGHADDR はペアになっている。それぞれ PAIR で相手を指定している。ベース・アドレスと最大のアドレスのペアだ。

各、BASEADDR と HIGHADDR の表示は、C_S_AXI_NUM_ADDR_RANGES の値で決められる。例えば2番めのペアは、”ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 2)”と指定されていて、C_S_AXI_NUM_ADDR_RANGES の値が2以上の時に表示される。

下の図に、C_S_AXI_NUM_ADDR_RANGES = 1 の時のXPS Core Configダイアログを示す。
Writing_MPD_1_130622.png

次に、C_S_AXI_NUM_ADDR_RANGES = 3 の時のXPS Core Configダイアログを示す。
Writing_MPD_2_130622.png
  1. 2013年06月22日 05:13 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

Vivado 2013.2 が出た

Vivado 2013.2 が出た。今回のリリースからIP Integrator が使えるということでインストールして見てみた。IP Integrator はISEのXPSのようなものらしい。

・Vivado 2013.2 を起動して、以前のプロジェクトを開いた。

・FileメニューからOpen Example Project -> Zynq System IP Integrator project を選択した。
Vivado_2013_2_1_130621.png

・zynq_1_wrapper プロジェクトが開いた。IP Integrator のアイコンが入っていた。
Vivado_2013_2_2_130621.png

・IP Integrator のアイコンをクリックしてIP Integrator を起動した。
Vivado_2013_2_3_130621.png

見やすいですね。

・Zynq をダブルクリックすると、Zynq コアの設定ダイアログが表示された。左の項目を見るとどんなことが設定できるかわかると思う。
Vivado_2013_2_4_130621.png

・PS-PL Configuration を見るとPS-PL間でどのようなインターフェースを使っているのかが見える。
Vivado_2013_2_5_130621.png

・Peripheral I/O Pins を見たら、GUIで設定できるようだ。
Vivado_2013_2_6_130621.png

・後は略

・axi_intercon_1 をダブルクリックで開いてみたが、やけに設定が少ない気がするが、自動で設定してくれるのだろうか?
Vivado_2013_2_7_130621.png

・AXI BRAM Controller を開いてみた。なんか格好良い。
Vivado_2013_2_8_130621.png

・インプリメントを行った。Vivaod 2013.2 では、Dual Core のマシンのCPU占有率が100%になってDual Coreをすべて使い切るようだ。vivado のプロセスも2つ動いている。(WebPACKではどうなんだろうか?)

・インプリメントが終了した。エラーはなかった。Vivado 2013.2 を使用する場合は、CPUコアがたくさんあったほうが良いようだ。インプリメント中には、Vivado に2つのCPUリソースが専有されて、Chromeブラウザを使うにもリスポンスが悪くなってしまった。
Vivado_2013_2_9_130621.png

Vivado_2013_2_10_130621.png

Vivado_2013_2_11_130621.png
  1. 2013年06月21日 05:25 |
  2. Vivado
  3. | トラックバック:0
  4. | コメント:0

AXI VDMAのレジスタ設定用AXI Lite Master IPの作製3(HDLソースの公開)

AXI VDMAのレジスタ設定用AXI Lite Master IPの作製2(シミュレーション)”でシミュレーションが動作したので、シミュレーション環境を紹介する。

テストベンチにAXI VDMAのレジスタを設定するコントローラ (reg_set_axi_lite_master.v)(これはプロセッサの変わりだ)と、AXI4 Lite Slave BFM を接続してシミュレーションを行なっている。、AXI4 Lite Slave BFM は以前に公開したAXI4 Slave BFM に AXI4 Liteのラッパーをかませたものだ。

それでは、テストベンチから貼っておく。下に reg_set_axi_lite_master_tb.v を示す。

`default_nettype none

`timescale 100ps / 1ps

////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer:
//
// Create Date:   18:51:13 06/19/2013
// Design Name:   reg_set_axi_lite_master
// Module Name:   D:/HDL/FndtnISEWork/Zynq-7000/ZedBoard/test/reg_set_axi_lite_master/reg_set_axi_lite_master_tb.v
// Project Name:  reg_set_axi_lite_master
// Target Device:  
// Tool versions:  
// Description: 
//
// Verilog Test Fixture created by ISE for module: reg_set_axi_lite_master
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
////////////////////////////////////////////////////////////////////////////////

module reg_set_axi_lite_master_tb;

    // Inputs
    wire M_AXI_ACLK;
    wire M_AXI_ARESETN;
    wire M_AXI_AWREADY;
    wire M_AXI_WREADY;
    wire [1:0] M_AXI_BRESP;
    wire M_AXI_BVALID;
    wire M_AXI_ARREADY;
    wire [31:0] M_AXI_RDATA;
    wire [1:0] M_AXI_RRESP;
    wire M_AXI_RVALID;
    reg     init_done;

    // Outputs
    wire [31:0] M_AXI_AWADDR;
    wire [2:0] M_AXI_AWPROT;
    wire M_AXI_AWVALID;
    wire [31:0] M_AXI_WDATA;
    wire [3:0] M_AXI_WSTRB;
    wire M_AXI_WVALID;
    wire M_AXI_BREADY;
    wire [31:0] M_AXI_ARADDR;
    wire [2:0] M_AXI_ARPROT;
    wire M_AXI_ARVALID;
    wire M_AXI_RREADY;

    // Instantiate the Unit Under Test (UUT)
    reg_set_axi_lite_master uut (
        .M_AXI_ACLK(M_AXI_ACLK), 
        .M_AXI_ARESETN(M_AXI_ARESETN), 
        .M_AXI_AWADDR(M_AXI_AWADDR), 
        .M_AXI_AWPROT(M_AXI_AWPROT), 
        .M_AXI_AWVALID(M_AXI_AWVALID), 
        .M_AXI_AWREADY(M_AXI_AWREADY), 
        .M_AXI_WDATA(M_AXI_WDATA), 
        .M_AXI_WSTRB(M_AXI_WSTRB), 
        .M_AXI_WVALID(M_AXI_WVALID), 
        .M_AXI_WREADY(M_AXI_WREADY), 
        .M_AXI_BRESP(M_AXI_BRESP), 
        .M_AXI_BVALID(M_AXI_BVALID), 
        .M_AXI_BREADY(M_AXI_BREADY), 
        .M_AXI_ARADDR(M_AXI_ARADDR), 
        .M_AXI_ARPROT(M_AXI_ARPROT), 
        .M_AXI_ARVALID(M_AXI_ARVALID), 
        .M_AXI_ARREADY(M_AXI_ARREADY), 
        .M_AXI_RDATA(M_AXI_RDATA), 
        .M_AXI_RRESP(M_AXI_RRESP), 
        .M_AXI_RVALID(M_AXI_RVALID), 
        .M_AXI_RREADY(M_AXI_RREADY), 
        .init_done(init_done)
    );

    axi_lite_slave_BFM axi_lite_slave_BFM_i (
        .M_AXI_ACLK(M_AXI_ACLK), 
        .M_AXI_ARESETN(M_AXI_ARESETN), 
        .M_AXI_AWADDR(M_AXI_AWADDR), 
        .M_AXI_AWPROT(M_AXI_AWPROT), 
        .M_AXI_AWVALID(M_AXI_AWVALID), 
        .M_AXI_AWREADY(M_AXI_AWREADY), 
        .M_AXI_WDATA(M_AXI_WDATA), 
        .M_AXI_WSTRB(M_AXI_WSTRB), 
        .M_AXI_WVALID(M_AXI_WVALID), 
        .M_AXI_WREADY(M_AXI_WREADY), 
        .M_AXI_BRESP(M_AXI_BRESP), 
        .M_AXI_BVALID(M_AXI_BVALID), 
        .M_AXI_BREADY(M_AXI_BREADY), 
        .M_AXI_ARADDR(M_AXI_ARADDR), 
        .M_AXI_ARPROT(M_AXI_ARPROT), 
        .M_AXI_ARVALID(M_AXI_ARVALID), 
        .M_AXI_ARREADY(M_AXI_ARREADY), 
        .M_AXI_RDATA(M_AXI_RDATA), 
        .M_AXI_RRESP(M_AXI_RRESP), 
        .M_AXI_RVALID(M_AXI_RVALID), 
        .M_AXI_RREADY(M_AXI_RREADY)
    );

    initial begin
        // Initialize Inputs
        init_done = 1'b0;

        // Wait 100 ns for global reset to finish
        #100;
        
        // Add stimulus here
        init_done = 1'b1;
    end

    // ACLK のインスタンス
    clk_gen #(
        .CLK_PERIOD(100),    // 10nsec, 100MHz
        .CLK_DUTY_CYCLE(0.5),
        .CLK_OFFSET(0),
        .START_STATE(1'b0)
    ) ACLKi (
        .clk_out(M_AXI_ACLK)
    );
    
    // reset_gen のインスタンス
    reset_gen #(
        .RESET_STATE(1'b0),
        .RESET_TIME(1000)    // 100nsec
    ) RESETi (
        .reset_out(M_AXI_ARESETN)
    );
    
endmodule

module clk_gen #(
    parameter         CLK_PERIOD = 100,
    parameter real    CLK_DUTY_CYCLE = 0.5,
    parameter        CLK_OFFSET = 0,
    parameter        START_STATE    = 1'b0 )
(
    output    reg        clk_out
);
    begin
        initial begin
            #CLK_OFFSET;
            forever
            begin
                clk_out = START_STATE;
                #(CLK_PERIOD-(CLK_PERIOD*CLK_DUTY_CYCLE)) clk_out = ~START_STATE;
                #(CLK_PERIOD*CLK_DUTY_CYCLE);
            end
        end
    end
endmodule

module reset_gen #(
    parameter    RESET_STATE = 1'b1,
    parameter    RESET_TIME = 100 )
(
    output    reg        reset_out
);
    begin
        initial begin
            reset_out = RESET_STATE;
            #RESET_TIME;
            reset_out = ~RESET_STATE;
        end
    end
endmodule

`default_nettype wire


下に axi_lite_slave_BFM を示す。

//
// AXI Lite Master 用 AXI Slave Bus Fuction Model (BFM)
// axi_lite_slave_BFM.v
// AXI Master用 AXI Slave Bus Function Mode (BFM)へのラッパー
// 
// 2013/06/19 
//

`default_nettype none

module axi_lite_slave_BFM # (
    parameter integer C_M_AXI_ADDR_WIDTH = 32,
    parameter integer C_M_AXI_DATA_WIDTH = 32,
    parameter C_M_AXI_AxSIZE = 3'b010,        // 4バイト
    
    parameter integer C_OFFSET_WIDTH = 10,    // 割り当てるRAMのアドレスのビット幅
    
    parameter integer WRITE_RANDOM_WAIT = 0, // Write Transaction のデータ転送の時にランダムなWaitを発生させる=1, Waitしない=0
    parameter integer WR_BVALID_RANDOM_WAIT = 0, // Write Transaction の時のM_AXI_BVALID をランダムにWaitする=1, Waitしない=0
    parameter integer READ_RANDOM_WAIT = 0 // Read Transaction のデータ転送の時にランダムなWaitを発生させる=1, Waitしない=0
) (
    // System Signals
    input wire M_AXI_ACLK,
    input wire M_AXI_ARESETN,

    // Master Interface Write Address
    input wire [C_M_AXI_ADDR_WIDTH-1:0] M_AXI_AWADDR,
    input wire [3-1:0] M_AXI_AWPROT,
    input wire M_AXI_AWVALID,
    output wire M_AXI_AWREADY,

    // Master Interface Write Data
    input wire [C_M_AXI_DATA_WIDTH-1:0] M_AXI_WDATA,
    input wire [C_M_AXI_DATA_WIDTH/8-1:0] M_AXI_WSTRB,
    input wire M_AXI_WVALID,
    output wire M_AXI_WREADY,

    // Master Interface Write Response
    output wire [2-1:0] M_AXI_BRESP,
    output wire M_AXI_BVALID,
    input wire M_AXI_BREADY,

    // Master Interface Read Address
    input wire [C_M_AXI_ADDR_WIDTH-1:0] M_AXI_ARADDR,
    input wire [3-1:0] M_AXI_ARPROT,
    input wire M_AXI_ARVALID,
    output wire M_AXI_ARREADY,

    // Master Interface Read Data 
    input wire [C_M_AXI_DATA_WIDTH-1:0] M_AXI_RDATA,
    input wire [2-1:0] M_AXI_RRESP,
    input wire M_AXI_RVALID,
    output wire M_AXI_RREADY
);
    

    // Instantiate the Unit Under Test (UUT_slave)
    axi_slave_bfm #(
        .C_M_AXI_ADDR_WIDTH(C_M_AXI_ADDR_WIDTH),
        .C_M_AXI_DATA_WIDTH(C_M_AXI_DATA_WIDTH),
        .C_OFFSET_WIDTH(C_OFFSET_WIDTH),
        .C_M_AXI_BURST_LEN(1),
        .WRITE_RANDOM_WAIT(WRITE_RANDOM_WAIT),
        .WR_BVALID_RANDOM_WAIT(WR_BVALID_RANDOM_WAIT),
        .READ_RANDOM_WAIT(READ_RANDOM_WAIT)
    ) axi_slave_bfm_i (
        .ACLK(M_AXI_ACLK), 
        .ARESETN(M_AXI_ARESETN), 
        .M_AXI_AWID(1'b0), 
        .M_AXI_AWADDR(M_AXI_AWADDR), 
        .M_AXI_AWLEN(8'd0),                // 1 Word
        .M_AXI_AWSIZE(C_M_AXI_AxSIZE), 
        .M_AXI_AWBURST(2'b01),             // INCR  (アドレスをインクリメント))
        .M_AXI_AWLOCK(1'b0),            // ノーマル・アクセス
        .M_AXI_AWCACHE(4'b0010),         // Normal Non-cacheable Non-bufferable
        .M_AXI_AWPROT(M_AXI_AWPROT),
        .M_AXI_AWQOS(4'b0000),            // default
        .M_AXI_AWUSER(), 
        .M_AXI_AWVALID(M_AXI_AWVALID), 
        .M_AXI_AWREADY(M_AXI_AWREADY), 
        .M_AXI_WDATA(M_AXI_WDATA), 
        .M_AXI_WSTRB(M_AXI_WSTRB), 
        .M_AXI_WLAST(1'b1), 
        .M_AXI_WUSER(), 
        .M_AXI_WVALID(M_AXI_WVALID), 
        .M_AXI_WREADY(M_AXI_WREADY), 
        .M_AXI_BID(), 
        .M_AXI_BRESP(M_AXI_BRESP), 
        .M_AXI_BUSER(), 
        .M_AXI_BVALID(M_AXI_BVALID), 
        .M_AXI_BREADY(M_AXI_BREADY), 
        .M_AXI_ARID(1'b0), 
        .M_AXI_ARADDR(M_AXI_ARADDR), 
        .M_AXI_ARLEN(8'd0),                // 1 Word
        .M_AXI_ARSIZE(C_M_AXI_AxSIZE), 
        .M_AXI_ARBURST(2'b01),             // INCR  (アドレスをインクリメント) 
        .M_AXI_ARLOCK(2'b00),            // ノーマル・アクセス
        .M_AXI_ARCACHE(4'b0010),         // Normal Non-cacheable Non-bufferable
        .M_AXI_ARPROT(M_AXI_ARPROT),
        .M_AXI_ARQOS(4'b0000),            // default
        .M_AXI_ARUSER(), 
        .M_AXI_ARVALID(M_AXI_ARVALID), 
        .M_AXI_ARREADY(M_AXI_ARREADY), 
        .M_AXI_RID(), 
        .M_AXI_RDATA(M_AXI_RDATA), 
        .M_AXI_RRESP(M_AXI_RRESP), 
        .M_AXI_RLAST(), 
        .M_AXI_RUSER(), 
        .M_AXI_RVALID(M_AXI_RVALID), 
        .M_AXI_RREADY(M_AXI_RREADY)
    );
endmodule

`default_nettype wire

  1. 2013年06月21日 03:29 |
  2. AXI Lite Master IPコアの作製
  3. | トラックバック:0
  4. | コメント:0

AXI VDMAのレジスタ設定用AXI Lite Master IPの作製2(シミュレーション)

AXI VDMAのレジスタ設定用AXI Lite Master IPの作製1(仕様の検討)”の続き。

AXI VDMAのレジスタを設定するコントローラのVerilog HDLコードとAXI4 Lite Master用AXI4 Lite Slave BFM(簡易版だけど)を作製できたので、シミュレーションを行った。
下図にシミュレーション結果を示す。
AXI_Lite_Master_3_130620.png

上の図では、AXI VDMAのレジスタを設定するコントローラ (reg_set_axi_lite_master.v) で、AXI VDMAのアドレスと設定値を保存しておくテキストファイル vdma_reg_set.txt の値を使用して、AXI4 Lite Masterアクセスを行なっている。下に、vdma_reg_set.txt の一部を示す。この後は全て0で、全部合計で256個ある。

00000010
12345678
00000020
11223344
00000030
55667788
ffffffff


vdma_reg_set.txt のフォーマットは1番目がアドレス、2番めが設定値となる。奇数番目がアドレス、偶数番目が設定値となる。そして、アドレスに”ffffffff”が現れた時に終了となる。

MicroBlaze があるのに、どうしてこのIPを作ったかというと、MicroBlazeでVDMAなどのレジスタを設定するとシミュレーションをするのに、SDKを立ちあげてソフトウェアを作る必要があるので面倒だ。レジスタを少し設定するだけだったら、すべてISimですることができる今回のレジスタを設定するコントローラIPを作ったほうが面倒が少ないと思ったからだ。設定アドレス、設定データのセットを作るのが面倒だったら、それを生成するスクリプトを作れば良いと思う。このIPは、主にシミュレーションに使用する。簡単な設定で値が固定されている場合は実機で使用しても良いと思う。
実機で頻繁に設定値を変える必要がある時は、プロセッサを使用する。そうすれば、FPGAを再インプリメントすることなしに、設定値を短時間で変更することができる。
下に、reg_set_axi_lite_master.v のコードを示す。

///////////////////////////////////////////////////////////////////////////////
//
// AXI4/Lite Master
//
////////////////////////////////////////////////////////////////////////////
//
// Structure:
//   reg_set_axi_lite_master
//
////////////////////////////////////////////////////////////////////////////

`default_nettype none

module reg_set_axi_lite_master # (
    parameter integer C_M_AXI_ADDR_WIDTH = 32,
    parameter integer C_M_AXI_DATA_WIDTH = 32
)(
    // System Signals
    input wire M_AXI_ACLK,
    input wire M_AXI_ARESETN,

    // Master Interface Write Address
    output wire [C_M_AXI_ADDR_WIDTH-1:0] M_AXI_AWADDR,
    output wire [3-1:0] M_AXI_AWPROT,
    output wire M_AXI_AWVALID,
    input wire M_AXI_AWREADY,

    // Master Interface Write Data
    output wire [C_M_AXI_DATA_WIDTH-1:0] M_AXI_WDATA,
    output wire [C_M_AXI_DATA_WIDTH/8-1:0] M_AXI_WSTRB,
    output wire M_AXI_WVALID,
    input wire M_AXI_WREADY,

    // Master Interface Write Response
    input wire [2-1:0] M_AXI_BRESP,
    input wire M_AXI_BVALID,
    output wire M_AXI_BREADY,

    // Master Interface Read Address
    output wire [C_M_AXI_ADDR_WIDTH-1:0] M_AXI_ARADDR,
    output wire [3-1:0] M_AXI_ARPROT,
    output wire M_AXI_ARVALID,
    input wire M_AXI_ARREADY,

    // Master Interface Read Data 
    input wire [C_M_AXI_DATA_WIDTH-1:0] M_AXI_RDATA,
    input wire [2-1:0] M_AXI_RRESP,
    input wire M_AXI_RVALID,
    output wire M_AXI_RREADY,
    
    input    wire    init_done
);

    reg        [31:0] rom [0:255];
    reg        [31:0] rom_dout;
    
    initial begin
        $readmemh("vdma_reg_set.txt", rom, 0, 255);
    end
    
    reg        reset_1b, reset;
    reg     [31:0]    reg_addr;
    reg        [31:0]    reg_data;
    reg     [7:0]    rom_addr;
    reg        awvalid;
    reg        wvalid;
    reg        bready;

    localparam    RESP_OKAY =        2'b00,
                RESP_EXOKAY =    2'b01,
                RESP_SLVERR =    2'b10,
                RESP_DECERR =    2'b11;
    
    localparam    IDLE_RRSM =                3'b000,
                ADDRESS_READ =            3'b001,
                DATA_READ =                3'b011,
                REG_SET_DATA_VALID =    3'b010,
                END_RRSM =                3'b110;
    reg        [2:0]    rrsm_cs;
    
    localparam    IDLE_ADDR =            2'b00,
                AWVALID_ASSERT =    2'b01,
                AWVALID_HOLD_OFF =    2'b11;
    reg        [1:0]    addr_cs;
    
    localparam    IDLE_DATA =            2'b00,
                WVALID_ASSERT =        2'b01,
                WVALID_HOLD_OFF =    2'b11;
    reg        [1:0]    data_cs;
    
    localparam    IDLE_RESP =        1'b0,
                BREADY_ASSERT =    1'b1;
    reg        resp_cs;
    
    reg        reg_data_valid;
    reg        rom_read_done;
    
    // Read is not implement
    assign M_AXI_ARADDR = 0;
    assign M_AXI_ARPROT = 3'd0;
    assign M_AXI_ARVALID = 1'b0;
    assign M_AXI_RDATA = 0;
    assign M_AXI_RREADY = 1'b1;
    assign M_AXI_WSTRB = 4'b1111;
    assign M_AXI_AWPROT = 3'b000;
    
    // reset
    always @(posedge M_AXI_ACLK) begin
        reset_1b <= ~M_AXI_ARESETN | ~init_done;
        reset <= reset_1b;
    end
    
    // instantiaton of rom
    always @(posedge M_AXI_ACLK) begin
        rom_dout <= rom[rom_addr];
    end
    
    // rom read State Machine
    always @(posedge M_AXI_ACLK) begin
        if (reset) begin
            rrsm_cs <= IDLE_RRSM;
            reg_data_valid <= 1'b0;
        end else begin
            case (rrsm_cs) 
                IDLE_RRSM : 
                    rrsm_cs <= ADDRESS_READ;
                ADDRESS_READ :
                    rrsm_cs <= DATA_READ;
                DATA_READ : begin
                    if (rom_dout == 32'hFFFF_FFFF) begin // end
                        rrsm_cs <= END_RRSM;
                        reg_data_valid <= 1'b0;
                    end else begin
                        rrsm_cs <= REG_SET_DATA_VALID;
                        reg_data_valid <= 1'b1;
                    end
                end
                REG_SET_DATA_VALID : begin
                    if (rom_read_done) begin
                        rrsm_cs <= ADDRESS_READ;
                        reg_data_valid <= 1'b0;
                    end
                end
                END_RRSM :
                    rrsm_cs <= END_RRSM;
            endcase
        end
    end
    
    // rom_addr
    always @(posedge M_AXI_ACLK) begin
        if (reset) begin
            rom_addr <= 8'd0;
        end else begin
            if (rrsm_cs == ADDRESS_READ) // Data
                rom_addr <= rom_addr + 8'd1;
            else if (rrsm_cs == REG_SET_DATA_VALID && rom_read_done) // Address
                rom_addr <= rom_addr + 8'd1;
        end
    end
    
    // AXI4 Lite Master Address
    always @(posedge M_AXI_ACLK) begin
        if (reset) begin
            reg_addr <= 32'd0;
        end else begin
            if (rrsm_cs == DATA_READ)
                reg_addr <= rom_dout;
        end
    end
    assign M_AXI_AWADDR = reg_addr;
    
    // AXI4 Lite Master WDATA
    always @(posedge M_AXI_ACLK) begin
        if (reset) begin
            reg_data <= 32'd0;
        end else begin
            if (rrsm_cs == REG_SET_DATA_VALID)
                reg_data <= rom_dout;
        end
    end
    assign M_AXI_WDATA = reg_data;
    
    // AXI Lite Master Address State Machine
    always @(posedge M_AXI_ACLK) begin
        if (reset) begin
            addr_cs <= IDLE_ADDR;
            awvalid <= 1'b0;
        end else begin
            case (addr_cs)
                IDLE_ADDR :
                    if (rrsm_cs == REG_SET_DATA_VALID) begin
                        addr_cs <= AWVALID_ASSERT;
                        awvalid <= 1'b1;
                    end
                AWVALID_ASSERT :
                    if (M_AXI_AWREADY) begin
                        addr_cs <= AWVALID_HOLD_OFF;
                        awvalid <= 1'b0;
                    end
                AWVALID_HOLD_OFF :
                    if (rrsm_cs != REG_SET_DATA_VALID)
                        addr_cs <= IDLE_ADDR;
            endcase
        end
    end
    assign M_AXI_AWVALID = awvalid;
    
    // AXI Lite Master Data State Machine
    always @(posedge M_AXI_ACLK) begin
        if (reset) begin
            data_cs <= IDLE_DATA;
            wvalid <= 1'b0;
            rom_read_done <= 1'b0;
        end else begin
            case (data_cs)
                IDLE_DATA : begin
                    rom_read_done <= 1'b0;
                    if (rrsm_cs == REG_SET_DATA_VALID) begin
                        data_cs <= WVALID_ASSERT;
                        wvalid <= 1'b1;
                    end
                end
                WVALID_ASSERT :
                    if (M_AXI_WREADY) begin
                        wvalid <= 1'b0;
                        rom_read_done <= 1'b1;
                        data_cs <= WVALID_HOLD_OFF;
                    end
                WVALID_HOLD_OFF : begin
                    rom_read_done <= 1'b0;
                    if (addr_cs == AWVALID_HOLD_OFF)
                        data_cs <= IDLE_DATA;
                end
            endcase
        end
    end
    assign M_AXI_WVALID = wvalid;
    
    // bready State Machine
    always @(posedge M_AXI_ACLK) begin
        if (reset) begin
            resp_cs <= IDLE_RESP;
            bready <= 1'b0;
        end else begin
            case (resp_cs)
                IDLE_RESP :
                    if (M_AXI_WREADY && data_cs == WVALID_ASSERT) begin
                        resp_cs <= BREADY_ASSERT;
                        bready <= 1'b1;
                    end
                BREADY_ASSERT :
                    if (M_AXI_BVALID) begin
                        resp_cs <= IDLE_RESP;
                        bready <= 1'b0;
                    end
            endcase
        end
    end
    assign M_AXI_BREADY = bready;
    
endmodule

`default_nettype none

  1. 2013年06月20日 05:47 |
  2. AXI Lite Master IPコアの作製
  3. | トラックバック:0
  4. | コメント:0

Rubyスクリプトを Ocra-1.3.0rc1 でEXE化

MIPSサブセットプロセッサのシミュレーションのために、命令データメモリを初期化できるようにしています。

命令データメモリは、”VHDLでのブロックRAMや分散RAMの初期化(16進数で書かれた外部データファイル)“に書いてあるようにインスタンスしてあります。初期化のためのファイル名は、”init_idram.txt”です。このブログ記事ではデータビット長は16ビットでしたが、今回は、32ビット長になっています。

intel hexで出力されたプログラムを、init_idram.txt にロードするために、inst_load_hex.rb というRubyスクリプトを書いてあります。ごくごく、簡単にクラスも使わないで書いてあります。

#.hexファイルを読んで、命令をidram.vhdの分散RAMの初期値として書き込む

def usage
  STDERR.print "usage : #$0 [input .hex file name] [output init_idram.txt file] \n"
  exit 1
end

if ARGV.size < 2
  usage
else
  mem_data = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

  file = File.open(ARGV[0], 'r')

  while line=file.gets
    if line[0, 1] == ':' then # intel hex code
      max = line[1,2].hex
      address = (line[3,4].hex)/4
      if line[7,2] == "00" then # normal data record
        for i in 1..max/4 do
          mem_data[address] = line[9+(i-1)*8,8].hex
          address += 1         
        end
      end
    end
  end
  file.close

##  mem_data.each do |i|
##    printf("%0.8X", *i)
##    print "\n"
#  end

  init_data_file = File.open(ARGV[1], 'w') # RAMの初期化データファイルを出力でオープン
  i = 0
  while i < mem_data.size
    init_data_file.printf("%.8X\r\n", *mem_data[i])
    i += 1
  end
  init_data_file.close
end


これをEXE化したいと思いました。Rubyスクリプトでは、Rubyを起動してRubyスクリプト名を指定して動作させます。それが面倒なので、Rubyインタープリンタをパッケージ化できれば、それを起動すれば、intel hexで出力されたプログラムを、init_idram.txt にロードすることができます。

EXE化のために Ocra-1.3.0rc1 を使用しました。関連するページを下に示します。

ocra-1.2.0 Documentation
rubyforge.org/projects/ocra
github.com/larsch/ocra


Ocra は、RubyスクリプトをEXE化するRubyスクリプトです。
rubyforge.org/projects/ocra から、Ocra-1.3.0rc1 をダウンロードして、一番新しい Ruby2.0.0をインストールして、EXE化してみたところエラーが出てダメでした。

README_rdoc の REQUIREMENTS: にも記述がありますが、Rubyのバージョンを選ぶようです。そこで、Ruby-1.9.1-p378 をダウンロードして、それでEXE化してみたところ、出来ました。

..\Ruby-1.9.1-p378\bin\ruby.exe ocrasa.rb inst_load_hex.rb


Ocra_1_130618.png

inst_load_hex.exe が出来ました。
Ocra_2_130618.png

コマンドの入力で実行できました。

inst_load_hex.exe disp_test2.hex init_idram.txt


Ocra_3_130618.png

init_idram.txt を見ると、disp_test2.hex をロードできているのがわかります。
Ocra_4_130618.png

そのままインプリメントすれば、命令データメモリに、プログラムがロードされた状態でインプリメントされます。FPGAボードの電源ONで、命令データメモリにプログラムが入っている状態になります。
  1. 2013年06月18日 10:55 |
  2. Ruby
  3. | トラックバック:0
  4. | コメント:0

秋葉原部品買い出し、FPGAな宴会

昨日は、つくばマラソンの先行エントリーに行って、午後から秋葉原にお神輿基板用の部品を買いに行きました。
部品は秋月電子通商で購入です。

表面実装用USBコネクタ(ミニB)(2個入)
超高輝度白色LED5mm OSPW5111A-YZ 10個入
ターミナルブロック 2ピン(緑)(縦)小
ターミナルブロック 2ピン(青)(縦)小
RGBイルミネーション・フルカラーLED 5mm乳白色ボディ OST1MK5A32A (10個入)


千石電商で赤黒2Aの電線と2mmΦの熱収縮チューブを買いました。
elec_parts_130617.jpg

それから新宿に行って、FPGAな宴会に参加して来ました。
いろいろ濃い話が聞けて面白かったです。Alteraもツール、デバイス共にいろいろなバグがあるんですね。。。
Vivado HLSもいろいろdisネタに事欠かないようです。Kintex-7を仕事で使うので、Vivado とISE を平行に使って比較してみようと思います。Vivado でこけてもISE に戻れますからね。Vivado で少しでも性能が良くなれば嬉しいですし。
FPGAの濃い話をしているのは、とっても楽しかったです。参加者の皆さん、ありがとうございました。またよろしくおねがいします。
  1. 2013年06月17日 05:19 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

つくばマラソン10kmにエントリー

今朝、雨だったにもかかわらず、うちの奥さんとつくばマラソン 先行エントリーの申し込みに行ってきました(奥さんはマラソンにエントリーです)。午前6時20分に市役所に着いたのですが、70~80人くらい並んでいました。早く来ると屋根付きのところに並べたので、雨は関係なかったです。
受付は、8時30分からというお知らせでしたが、20分ほど早まって8時10分ころ受付して来ました。
つくば市役所内に入ると、2階に上がって部屋に入ったんですが、そこには職員の方が10人以上並んでいてエントリーを行なっていました。呼ばれて行くと、免許証を見せて、名前を書いてエントリー用紙をもらって終了です。後日、お金を振り込んでエントリーのようです。
私が申し込んだのは10kmですが、ほとんどの人はマラソンに申し込んでいると思います。エントリー用紙の取りやすさが違っていました。マラソンの用紙は係の人が取りやすいところにありました。
用紙をもらって市役所を出ると、長蛇の列でした。道にまで並んでいました。全員がエントリーできるんでしょうか?

朝は起きるのが早いので、私にとっては楽勝です。それに、結構並ぶのが好きなんです。いろいろと観察出来ますよ。例えば、人が来るのには波があるとか。待ち合わせ時間をキリの良い時刻に設定しているんでしょうね?たぶん。。。

朝8時ころになると、市役所内に入る車が渋滞していました。
  1. 2013年06月16日 10:43 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

KiCad 2013-05-31 BZR 4019 でFusionPCBに基板を注文

お祭の神輿用LED配線基板の作製”で作った基板の左下が余っているので、LEDを追加しました。
KiCad_8_130614.png

KiCad_9_130614.png

これで完成したので、FusionPCBに発注するためにガーバーファイルとドリルファイルをKiCadから出力します。その出力の仕方を書いておきます。FusionPCBの基板発注ページです。

・KiCadのPcbnew のファイルメニューからプロットを選択します。
KiCad_10_130614.png

・プロットダイアログが開きます。左のレイヤーで、F.Cu、B.Cu、F.SilkS、B.SilkS、F.Mask、B.Mask、Edge.Cutsにチェックを付けます。

・基板外形図を添付するようになって、F.Cu、B.Cu、F.SilkS、B.SilkS、F.Mask、B.Maskレイヤーに基板外形が必要かどうかわからないのですが、一応、”すべての他のレイヤーから基板外形レイヤーのデータを除外します”のチェックを外します。

・出力ディレクトリを指定して、プロットボタンをクリックします。
KiCad_11_130614.png

・次にドリルファイルの生成ボタンをクリックして、ドリルファイルを生成します。
KiCad_12_130614.png

・ドリルファイル生成ダイアログが開きます。ドリルユニットを mm にしてからDrill File ボタンをクリックします。ドリルファイルが生成されるので、ダイアログを閉じます。
KiCad_13_130614.png

・プロットダイアログも閉じます。

・そうすると、元のファイル名にレイヤー名が追加されたファイル名とそれぞれの拡張子が付きます。
KiCad_15_130615.png

FusionPCBでは以下のファイルが必要となります。引用します。

3. Gerber file requirements:
The following layers are needed:
Top Layer: pcbname.GTL
Bottom Layer: pcbname.GBL
Solder Mask Top: pcbname.GTS
Solder Mask Bottom: pcbname.GBS
Silk Top: pcbname.GTO
Silk Bottom: pcbname.GBO
Drill Drawing: pcbname.TXT
Board Outline:pcbname.GML/GKO
Note:
The Gerber file must be RS-274x format.


・私はファイル名を一意にするために、英字+番号のファイル名(基板ファイル名)を付けています。Top LayerからSilk BottomまでのファイルはKiCadの出力するファイル名の拡張子とFusionPCBで要求されるファイルの拡張子は同じです。よって、基板ファイル名に入れ替えます。

・ドリルファイルは、ファイル名 + .drl という名前でしたが、基板ファイル名.txt に拡張子も変更します。

・基板の外形図は、ファイル名 + -Edge_Cuts.gbr という名前でしたが、基板ファイル名.gml に変更します。
KiCad_14_130614.png

・これで終了なので、ZIPファイルに固めて、FusionPCBのサイトからファイルを選択します。

これで、FusionPCBに発注すれば良いと思います。今のところパスしているようです。

06/14/2013 PCB Processing PCB File:D84539_15681_MSC_006.zip passed file examination.

  1. 2013年06月15日 04:43 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:3

お祭の神輿用LED配線基板の作製

子供みこしの配線をLED化して、重い鉛バッテリーをモバイルバッテリー化しようということで基板を作っていましたが、一応完成しました。これで1日寝かせて、もう一度、チェックして大丈夫だったらFusionPCBに発注しようと思います。

4つの基板にわかれていて、USBミニBからLED表4個接続基板、USBミニBからターミナルへ電源供給基板、ターミナルからLED表4個接続基板、ターミナルからLED表2個裏2個接続基板です。
KiCad_6_130614.png

抵抗が2つ並列なのは、20mAの高輝度LEDを、最初10mA 流して暗かったら抵抗を並列にして20mA
流そうという構想があるからです。

KiCad_7_130614.png

KiCad 2013-05-31 BZR 4019 を使ったんですが、表と裏で同じルートの配線引くと反対側の配線がなくなってしまいました。配線のルートを少し変更しました。まだこのバージョンは使わないほうが良いようです。

(2013/06/15:修正)
レイヤーとレンダーを一緒に使用している時に、つまり、レイヤーB.Cu、レンダーModule Backのチェックを外して、表面の配線をしてから、レイヤーとレンダーに全てチェックを入れ、レイヤーF.CuとレンダーModule Back のチェックを外して、配線を書くときに表面の同じネットの配線がハイライトされますが、その配線と同じルートで裏面も配線を引くと、そのときは配線が表示されないようです。
ズームしたりレイヤーにチェックを入れたりすると表示されます。実際には配線が書けています。



基板の左下が空いているのがもったいないので、もう1回路入れようかな?と思っています。ターミナルとLED2個くらい入るかな?
  1. 2013年06月14日 05:49 |
  2. プリント基板作成
  3. | トラックバック:0
  4. | コメント:0

AXI VDMAのレジスタ設定用AXI Lite Master IPの作製1(仕様の検討)

ZedBoard用画像出力IPの作製3(Add IP)”で、Xilinx社の AXI4-Stream to Video Out IP に接続するIPは全て作り終えた。
AXI VDMAのシミュレーションを行うまでに、どんなIPが足りないかというと、AXI VDMAのレジスタを設定するコントローラとAXI Master のメモリの2つである。
AXI_Lite_Master_1_130613.png

今回は、AXI VDMAのレジスタを設定するコントローラを AXI Lite Master として作製する。MicroBlaze でも良いのだが、MicroBlaze を実装すると大げさになってしまうし、ソフトウェアを初期値としてRAMにロードする手間も必要になる。AXI VDMAのレジスタを設定するだけの AXI Lite Master インターフェースを有した簡単なコントローラを自作することにする。
AR# 37425 12.3 EDK、12.3 ISE - カスタム AXI IP コアの作成方法”の ar37425.zip には、AXI Lite Master のテンプレートもあるのでそれを使用する。
AXI_Lite_Master_2_130613.png

AXI4 Lite バスについては、下の2つの記事を参照下さい。

キャラクタROMをAXI4 Lite Slave として実装する1(AXI4 Lite バスの勉強)
キャラクタROMをAXI4 Lite Slave として実装する2(AXI4 Lite バスの勉強2)


AXI VDMAのレジスタの値は、Verilog で32ビット長のRAMを定義して、初期値を与えようと思っている。最初(偶数アドレス)の32ビットがAXI Lite バスのアドレスで、次の32ビット(奇数アドレス)がAXI Lite バスのデータにしようと思っている。Verilog HDL を使用した外部ファイルによるRAMの初期値の与え方は、下の記事を参照下さい。

soc-lm32をSpartan3E Stater Kitにコンフィギュレーション


VHDLで作るとすると、下の2つの記事を参照下さい。

VHDLでのブロックRAMや分散RAMの初期化(外部データファイル)
VHDLでのブロックRAMや分散RAMの初期化(16進数で書かれた外部データファイル)

  1. 2013年06月13日 05:27 |
  2. AXI Lite Master IPコアの作製
  3. | トラックバック:0
  4. | コメント:0

ZedBoard用画像出力IPの作製3(Add IP)

ZedBoard用画像出力IPの作製2(シミュレーション)”でシミュレーションが終了したので、XPSプロジェクトへAdd IPした。

・PAOファイル、MPDファイル、MUIファイルを書いてから、XPSプロジェクトのProject メニューで、Rescan User Repositories... を選択して、video_out_zed IP をXPSプロジェクトに認識させた。
video_out_zed_4_130612.png

・Add IP を行なって、XPSプロジェクトにインスタンスした。
video_out_zed_5_130612.png

・video_out_zed IPがXPSプロジェクトに入った。
video_out_zed_6_130612.png

例によって、PAOファイル、MPDファイル、MUIファイルを貼っておく。
最初に、video_out_zed_v2_1_0.pao から下に示す。

## -- DISCLAIMER OF LIABILITY
## -- 
## -- This file contains proprietary and confidential information of
## -- Xilinx, Inc. ("Xilinx"), that is distributed under a license
## -- from Xilinx, and may be used, copied and/or disclosed only
## -- pursuant to the terms of a valid license agreement with Xilinx.
## -- 
## -- XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
## -- ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
## -- EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
## -- LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
## -- MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
## -- does not warrant that functions included in the Materials will
## -- meet the requirements of Licensee, or that the operation of the
## -- Materials will be uninterrupted or error-free, or that defects
## -- in the Materials will be corrected. Furthermore, Xilinx does
## -- not warrant or make any representations regarding use, or the
## -- results of the use, of the Materials in terms of correctness,
## -- accuracy, reliability or otherwise.
## -- 
## -- Xilinx products are not designed or intended to be fail-safe,
## -- or for use in any application requiring fail-safe performance,
## -- such as life-support or safety devices or systems, Class III
## -- medical devices, nuclear facilities, applications related to
## -- the deployment of airbags, or any other applications that could
## -- lead to death, personal injury or severe property or
## -- environmental damage (individually and collectively, "critical
## -- applications"). Customer assumes the sole risk and liability
## -- of any use of Xilinx products in critical applications,
## -- subject only to applicable laws and regulations governing
## -- limitations on product liability.
## -- 
## -- Copyright 2009 Xilinx, Inc.
## -- All rights reserved.
## -- 
## -- This disclaimer and copyright notice must be retained as part
## -- of this file at all times.
##
###############################################################################
##
## video_out_zed_v1_00_a.pao
##
## Peripheral Analyze Order File
##
##
###############################################################################


lib video_out_zed_v1_00_a conv_rgb2ycbcr.v verilog
lib video_out_zed_v1_00_a conv_hdmi_out.v verilog
lib video_out_zed_v1_00_a video_out_zed.v verilog


次に、video_out_zed_v2_1_0.mpdを下に示す。

#-- DISCLAIMER OF LIABILITY
#--
#-- This file contains proprietary and confidential information of
#-- Xilinx, Inc. ("Xilinx"), that is distributed under a license
#-- from Xilinx, and may be used, copied and/or disclosed only
#-- pursuant to the terms of a valid license agreement with Xilinx.
#--
#-- XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
#-- ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
#-- EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
#-- LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
#-- MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
#-- does not warrant that functions included in the Materials will
#-- meet the requirements of Licensee, or that the operation of the
#-- Materials will be uninterrupted or error-free, or that defects
#-- in the Materials will be corrected. Furthermore, Xilinx does
#-- not warrant or make any representations regarding use, or the
#-- results of the use, of the Materials in terms of correctness,
#-- accuracy, reliability or otherwise.
#--
#-- Xilinx products are not designed or intended to be fail-safe,
#-- or for use in any application requiring fail-safe performance,
#-- such as life-support or safety devices or systems, Class III
#-- medical devices, nuclear facilities, applications related to
#-- the deployment of airbags, or any other applications that could
#-- lead to death, personal injury or severe property or
#-- environmental damage (individually and collectively, "critical
#-- applications"). Customer assumes the sole risk and liability
#-- of any use of Xilinx products in critical applications,
#-- subject only to applicable laws and regulations governing
#-- limitations on product liability.
#--
#-- Copyright (c) 1995-2010 Xilinx, Inc.  All rights reserved.
#--
#-- This disclaimer and copyright notice must be retained as part
#-- of this file at all times.
#--
###################################################################
##
## Name     : video_out_zed
## Desc     : Microprocessor Peripheral Description
##          : Automatically generated by PsfUtility
##
###################################################################

BEGIN video_out_zed

## Peripheral Options
OPTION IPTYPE = PERIPHERAL
OPTION IMP_NETLIST = TRUE
OPTION STYLE = HDL
OPTION DESC = video_out_zed
OPTION LONG_DESC = Video Out for ZedBoard
OPTION HDL = VERILOG
OPTION RUN_NGCBUILD = FALSE

## Generics for VHDL or Parameters for Verilog
PARAMETER VIDEO_DATA_WIDTH = 24, DT = INTEGER, RANGE = (8,16,24,32,40,48,56,64,128,256)

## Ports

PORT pixclk = "", DIR = I, SIGIS = CLK
PORT aresetn = "", DIR = I, SIGIS = RST
PORT video_de = "", DIR = I
PORT video_vsync = "", DIR = I
PORT video_hsync = "", DIR = I
PORT video_vblank = "", DIR = I
PORT video_hblank = "", DIR = I
PORT video_data = "", DIR = I, VEC = [(VIDEO_DATA_WIDTH-1):0]
PORT vga_red = "", DIR = O, VEC = [3:0]
PORT vga_green = "", DIR = O, VEC = [3:0]
PORT vga_blue = "", DIR = O, VEC = [3:0]
PORT vga_hsync = "", DIR = O
PORT vga_vsync = "", DIR = O
PORT hdmi_clk = "", DIR = O
PORT hdmi_vsync = "", DIR = O
PORT hdmi_hsync = "", DIR = O
PORT hdmi_data_e = "", DIR = O
PORT hdmi_data = "", DIR = O, VEC = [15:0]

END


最後に、video_out_zed_v2_1_0.mui を下に示す。

<?xml version="1.0" encoding="ISO-8859-1"?>

<!--
###############################################################################
## DISCLAIMER OF LIABILITY
##
## This file contains proprietary and confidential information of
## Xilinx, Inc. ("Xilinx"), that is distributed under a license
## from Xilinx, and may be used, copied and/or disclosed only
## pursuant to the terms of a valid license agreement with Xilinx.
##
## XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
## ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
## EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
## LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
## MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
## does not warrant that functions included in the Materials will
## meet the requirements of Licensee, or that the operation of the
## Materials will be uninterrupted or error-free, or that defects
## in the Materials will be corrected. Furthermore, Xilinx does
## not warrant or make any representations regarding use, or the
## results of the use, of the Materials in terms of correctness,
## accuracy, reliability or otherwise.
##
## Xilinx products are not designed or intended to be fail-safe,
## or for use in any application requiring fail-safe performance,
## such as life-support or safety devices or systems, Class III
## medical devices, nuclear facilities, applications related to
## the deployment of airbags, or any other applications that could
## lead to death, personal injury or severe property or
## environmental damage (individually and collectively, "critical
## applications"). Customer assumes the sole risk and liability
## of any use of Xilinx products in critical applications,
## subject only to applicable laws and regulations governing
## limitations on product liability.
##
## Copyright 2009 Xilinx, Inc.
## All rights reserved.
##
## This disclaimer and copyright notice must be retained as part
## of this file at all times.
##
###############################################################################
-->

<!DOCTYPE doc SYSTEM "../../ipdialog.dtd" [
    <!-- -->
    <!ENTITY VIDEO_DATA_WIDTH '
    <widget id="VIDEO_DATA_WIDTH">
        <key>VIDEO_DATA_WIDTH</key>
        <label>VIDEO_DATA_WIDTH</label>
        <tip></tip>
    </widget>
    '>
]>

<doc>
    <view id="VIDEO">
        <display>VIDEO</display>
        <group id="VIDEO">
            <display>VIDEO</display>
            <item>&VIDEO_DATA_WIDTH;</item>
        </group>
    </view>
</doc>

  1. 2013年06月12日 05:09 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

KiCadで基板外形を書く、全部品の移動

現在、地元地区の子供神輿の照明をLEDにしようと思っています。小学1,2,3年生が担ぐ神輿なのですが、大きな鉛バッテリーを積んでいるので、小さい子には重くてかわいそうです。USB充電用のモバイルバッテリーで十分だと思われます。
そこで、USBミニBコネクタで電源供給するLEDライト基板を作ろうとしています。基板CADはKiCad (2013-05-31 BZR 4019) を使用しています。その際に基板外形の書き方をブログに書いてなかったので書いておこうと思います。

基板外形は、右の表示の一番下のEdge.Cuts を選択して、”図形ライン(またはポリゴン)を入力”を選択して、基板外形を書くことができます。
KiCad_1_130611.png

上の図の黄色の四角が基板外形です。

次に、ネットリストの読み込みを行なって、回路図のネットリストと部品シンボルを読み込んだ時にすべての部品が重なっているので、重なった部品をバラせると便利です。その時には、右クリックメニューから グローバル移動/配置 -> すべてのモジュールを移動 を選択します。
KiCad_2_130611.png

ダイアログが出てくるので、”はい”ボタンをクリックします。
KiCad_3_130611.png

すると全部品が並んで配置されて、基板に配置しやすくなります。
KiCad_4_130611.png

ちなみに回路図はこんなのです。5cm x 5cm に4つ並べようと思っています。(無理かもしれませんが?)4つは、取り付け穴を付けるとか、付けないととか、LEDの配置を変えようと思っています。
KiCad_5_130611.png
  1. 2013年06月11日 05:26 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:0

ZedBoard用画像出力IPの作製2(シミュレーション)

ZedBoard用画像出力IPの作製1(仕様の検討)”で仕様の検討が終了したので、テストベンチを作製してシミュレーションを行った。シミュレーションの際には、custom_vtc.v も入れてテストベンチを作製した。

シミュレーション結果を下に示す。まずは 17msec シミュレーションした全体の波形を示す。これは主に垂直同期関連の波形を観察するためだ。
video_out_zed_1_130611.png

次に垂直同期を確認するためのシミュレーション波形を下に示す。
video_out_zed_2_130611.png

最後にピクセルデータを確認するためのシミュレーション波形を下に示す。
video_out_zed_3_130611.png

下に、video_out_zed.v を示す。(2013/07/07:バグ修正)

// XPS のIP、v_axi4s_vid_out のVideo出力を受けてVGAポートとHDMI出力に出力する
// video_out_zed.v
// 2013/06/09
//

`default_nettype none

module video_out_zed # (
    parameter  VIDEO_DATA_WIDTH = 24
) (
    input    wire    pixclk,            // pixel clock
    input    wire    aresetn,        // AXI reset
    input    wire    video_de,    // data enable
    input    wire    video_hsync,
    input    wire    video_vsync,
    input    wire    video_vblank,
    input    wire    video_hblank,
    input    wire    [VIDEO_DATA_WIDTH-1:0]    video_data,
    
    (* IOB = "FORCE" *) output    reg     [3:0]    vga_red,
    (* IOB = "FORCE" *) output    reg     [3:0]    vga_green,
    (* IOB = "FORCE" *) output    reg     [3:0]    vga_blue,
    (* IOB = "FORCE" *) output    reg        vga_hsync,
    (* IOB = "FORCE" *) output    reg        vga_vsync,
    
    (* IOB = "FORCE" *) output    wire    hdmi_clk,
    (* IOB = "FORCE" *) output    wire    hdmi_vsync,
    (* IOB = "FORCE" *) output    wire    hdmi_hsync,
    (* IOB = "FORCE" *) output    wire    hdmi_data_e,
    (* IOB = "FORCE" *) output    wire    [15:0]    hdmi_data
);

    reg        reset_1b, reset;
    reg        [7:0]    red, green, blue;
    reg        hsyncx, vsyncx;
    
    // synchronization of reset_1b
    always @(posedge pixclk) begin
        reset_1b <= ~aresetn;
        reset <= reset_1b;
    end
    
    // input FF
    always @(posedge pixclk) begin
        if (reset) begin
            red <=        8'd0;
            green <=    8'd0;
            blue <=        8'd0;
            hsyncx <=    1'b1;
            vsyncx <=    1'b1;
        end else begin
            red <=        video_data[23:16];
            green <=    video_data[15:8];
            blue <=        video_data[7:0];
            hsyncx <=    ~video_hsync;
            vsyncx <=    ~video_vsync;
        end
    end
    
    // Output VGA Port
    always @(posedge pixclk) begin
        if (reset) begin
            vga_hsync <=    1'b1;
            vga_vsync <=    1'b1;
        end else  begin
            vga_hsync <=    hsyncx;
            vga_vsync <=    vsyncx;
        end
    end
    always @(posedge pixclk) begin
        if (reset) begin
            vga_red <=        4'd0;
            vga_green <=    4'd0;
            vga_blue <=        4'd0;
        end else begin
            if (video_de) begin
                vga_red <=        red[7:4];
                vga_green <=    green[7:4];
                vga_blue <=        blue[7:4];
            end else begin
                vga_red <=        4'd0;
                vga_green <=    4'd0;
                vga_blue <=        4'd0;
            end
        end
    end
            
    conv_hdmi_out conv_hdmi_out_inst (
        .clk_disp(pixclk),
        .reset_disp(~aresetn),
        .red(red),
        .green(green),
        .blue(blue),
        .hsyncx(hsyncx),
        .vsyncx(vsyncx),
        .display_enable(video_de),
        .hdmi_clk(hdmi_clk),
        .hdmi_vsync(hdmi_vsync),
        .hdmi_hsync(hdmi_hsync),
        .hdmi_data_e(hdmi_data_e),
        .hdmi_data(hdmi_data)
    );
    
endmodule

`default_nettype wire


次に、テストベンチ、video_out_zed_tb.v を下に示す。

`default_nettype none
`timescale 100ps / 1ps

////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer:
//
// Create Date:   03:40:14 06/11/2013
// Design Name:   video_out_zed
// Module Name:   D:/HDL/FndtnISEWork/Zynq-7000/ZedBoard/test/video_out_zed/video_out_zed_tb.v
// Project Name:  video_out_zed
// Target Device:  
// Tool versions:  
// Description: 
//
// Verilog Test Fixture created by ISE for module: video_out_zed
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
////////////////////////////////////////////////////////////////////////////////

module video_out_zed_tb;

    // Inputs
    wire pclk;
    wire aresetn;
    wire video_de;
    wire video_hsync;
    wire video_vsync;
    wire video_vblank;
    wire video_hblank;
    wire [23:0] video_data;

    // Outputs
    wire [3:0] vga_red;
    wire [3:0] vga_green;
    wire [3:0] vga_blue;
    wire vga_hsync;
    wire vga_vsync;
    wire hdmi_clk;
    wire hdmi_vsync;
    wire hdmi_hsync;
    wire hdmi_data_e;
    wire [15:0] hdmi_data;

    // R, G, B 毎に違った生成多項式のM系列を用意した
    function [7:0] mseqf8_R (input [7:0] din);
        reg xor_result;
        begin
            xor_result = din[7] ^ din[3] ^ din[2] ^ din[1];
            mseqf8_R = {din[6:0], xor_result};
        end
    endfunction
    
    function [7:0] mseqf8_G (input [7:0] din);
        reg xor_result;
        begin
            xor_result = din[7] ^ din[4] ^ din[2] ^ din[0];
            mseqf8_G = {din[6:0], xor_result};
        end
    endfunction

    function [7:0] mseqf8_B (input [7:0] din);
        reg xor_result;
        begin
            xor_result = din[7] ^ din[5] ^ din[2] ^ din[1];
            mseqf8_B = {din[6:0], xor_result};
        end
    endfunction

    reg        [7:0]    mseq8r = 8'd1;
    reg        [7:0]    mseq8g = 8'd1;
    reg        [7:0]    mseq8b = 8'd1;
    
    // Instantiate the Unit Under Test (UUT)
    video_out_zed video_out_zed_i (
        .pclk(pclk), 
        .aresetn(aresetn), 
        .video_de(video_de), 
        .video_hsync(video_hsync), 
        .video_vsync(video_vsync), 
        .video_vblank(video_vblank), 
        .video_hblank(video_hblank), 
        .video_data(video_data), 
        .vga_red(vga_red), 
        .vga_green(vga_green), 
        .vga_blue(vga_blue), 
        .vga_hsync(vga_hsync), 
        .vga_vsync(vga_vsync), 
        .hdmi_clk(hdmi_clk), 
        .hdmi_vsync(hdmi_vsync), 
        .hdmi_hsync(hdmi_hsync), 
        .hdmi_data_e(hdmi_data_e), 
        .hdmi_data(hdmi_data)
    );

    // Instantiate the Unit Under Test (UUT)
    custom_vtc custom_vtc_i (
        .vclk(pclk), 
        .aresetn(aresetn), 
        .vtc_ce(1'b1), 
        .vtc_act_vid(video_de), 
        .vtc_vsync(video_vsync), 
        .vtc_hsync(video_hsync), 
        .vtc_vblank(video_vblank), 
        .vtc_hblank(video_hblank)
    );

    // Red のM系列符号生成
    always @(posedge pclk) begin
        // if (mt9d111_cs==ACTIVE_DATA_TIME)
            mseq8r <= mseqf8_R(mseq8r);
    end
    
    // Green のM系列符号生成
    always @(posedge pclk) begin
        // if (mt9d111_cs==ACTIVE_DATA_TIME)
            mseq8g <= mseqf8_G(mseq8g);
    end
    
    // Blue のM系列符号生成
    always @(posedge pclk) begin
        // if (mt9d111_cs==ACTIVE_DATA_TIME)
            mseq8b <= mseqf8_B(mseq8b);
    end
    
    assign video_data = {mseq8r, mseq8g, mseq8b};
    
    // pclk generate
    clk_gen #(
        .CLK_PERIOD(250),    // 25.0nsec, 40MHz
        .CLK_DUTY_CYCLE(0.5),
        .CLK_OFFSET(0),
        .START_STATE(1'b0)
    ) pclk_from_pll_i (
        .clk_out(pclk)
    );
    
    // aresetn generate
    reset_gen #(
        .RESET_STATE(1'b0),
        .RESET_TIME(1000)    // 100nsec
    ) RESETi (
        .reset_out(aresetn)
    );

endmodule

module clk_gen #(
    parameter         CLK_PERIOD = 100,
    parameter real    CLK_DUTY_CYCLE = 0.5,
    parameter        CLK_OFFSET = 0,
    parameter        START_STATE    = 1'b0 )
(
    output    reg        clk_out
);
    begin
        initial begin
            #CLK_OFFSET;
            forever
            begin
                clk_out = START_STATE;
                #(CLK_PERIOD-(CLK_PERIOD*CLK_DUTY_CYCLE)) clk_out = ~START_STATE;
                #(CLK_PERIOD*CLK_DUTY_CYCLE);
            end
        end
    end
endmodule

module reset_gen #(
    parameter    RESET_STATE = 1'b1,
    parameter    RESET_TIME = 100 )
(
    output    reg        reset_out
);
    begin
        initial begin
            reset_out = RESET_STATE;
            #RESET_TIME;
            reset_out = ~RESET_STATE;
        end
    end
endmodule

`default_nettype wire


後の conv_hdmi_out.v のVerilog HDLコードは、”ZedBoardでHDMI出力14(YCbCr4:2:2 変換)”を参照のこと。
conv_rgb2ycbcr.v は、”RGB―YCbCr変換の検討2(Verilog HDLで実装)”を参照のこと。
  1. 2013年06月11日 04:49 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

ZedBoard用画像出力IPの作製1(仕様の検討)

前回、”Custom Video Timing Controller の作製3(XPSにAdd IP)”で、custom_vtc が完成したので、今度は、ZedBoardのVGAコネクタと、HDMIコネクタに画像信号を出力するIP (video_out_zed) を作製する。
更に、もう一度、LogiCORE IP AXI4-Stream to Video Out v1.0 Product Guide PG044 April 24, 2012のFigure 1-1をもう一度下に転載させて頂く。(”カメラ、ビデオ表示カスタムIPを AX4-Stream に変更1(使用するIPの検討)”参照)
Camera_Display_w_VDMA_3_130526.png

video_out_zed モジュールがどの部分に相当するかというと、上の図で、右端のVideo Interface に相当する。

ZedBoard用画像出力IP (video_out_zed) は、ビットマップ・ディスプレイ・コントローラのモジュールをそのまま使うことができるため簡単にできる。VGA出力は、入力されたピクセルデータと水平同期信号、垂直同期信号を出力する。HDMI出力は、ビットマップ・ディスプレイ・コントローラで使用してた conv_hdmi_out モジュールを再利用する。

下に、video_out_zed.v のポート宣言部を示す。

module video_out_zed # (
    parameter  VIDEO_DATA_WIDTH = 24
) (
    input    wire    pclk,            // pixel clock
    input    wire    aresetn,        // AXI reset
    input    wire    video_de        // data enable
    input    wire    video_hsync,
    input    wire    video_vsync,
    input    wire    video_vblank,
    input    wire    video_hblank,
    input    wire    [VIDEO_DATA_WIDTH-1:0]    video_data,
    
    (* IOB = "FORCE" *) output    reg     [3:0]    vga_red,
    (* IOB = "FORCE" *) output    reg     [3:0]    vga_green,
    (* IOB = "FORCE" *) output    reg     [3:0]    vga_blue,
    (* IOB = "FORCE" *) output    reg        vga_hsync,
    (* IOB = "FORCE" *) output    reg        vga_vsync,
    
    (* IOB = "FORCE" *) output    wire    hdmi_clk,
    (* IOB = "FORCE" *) output    wire    hdmi_vsync,
    (* IOB = "FORCE" *) output    wire    hdmi_hsync,
    (* IOB = "FORCE" *) output    wire    hdmi_data_e,
    (* IOB = "FORCE" *) output    wire    [15:0]    hdmi_data
);

  1. 2013年06月10日 04:25 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

”奇跡のりんご”(映画)を見て来ました

今日は、下の娘と奥さんと”奇跡のりんご”を見て来ました。良かったです。泣けました。りんごの花が咲いた時に下草が茂っていないなどの欠点はありましたが、楽しめました。
随分前ですが、奥久慈の辺りにりんご狩りに行ったのですが、下草が生えていて、地面がふかふかだったのを思い出しました。今は普及しているんでしょうか?減農薬に役だっているとか?
  1. 2013年06月08日 21:54 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Custom Video Timing Controller の作製3(XPSにAdd IP)

Custom Video Timing Controller の作製2(シミュレーション)”でCustom VTCのシミュレーションを行った。今回は、XPSプロジェクトにAdd IPを行う。

・PAOファイル、MPDファイル、MUIファイルを書いてから、XPSプロジェクトのProject メニューで、Rescan User Repositories... を選択して、Custom VTC IP をXPSプロジェクトに認識させた。

・Add IP を行なって、XPSプロジェクトにインスタンスした。
custom_vtc_7_130608.png

・VTIMING_OUTバスを定義しておいたので、v_axi4s_vid_out_0 のVTINIG_IN バスとXPSプロジェクトのBus Interfaces タブで接続することが出来た。
custom_vtc_8_130608.png

PAOファイル、MPDファイル、MUIファイルを下に示す。

まずは、custom_vtc_v2_1_0.pao から下に示す。

## -- DISCLAIMER OF LIABILITY
## -- 
## -- This file contains proprietary and confidential information of
## -- Xilinx, Inc. ("Xilinx"), that is distributed under a license
## -- from Xilinx, and may be used, copied and/or disclosed only
## -- pursuant to the terms of a valid license agreement with Xilinx.
## -- 
## -- XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
## -- ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
## -- EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
## -- LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
## -- MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
## -- does not warrant that functions included in the Materials will
## -- meet the requirements of Licensee, or that the operation of the
## -- Materials will be uninterrupted or error-free, or that defects
## -- in the Materials will be corrected. Furthermore, Xilinx does
## -- not warrant or make any representations regarding use, or the
## -- results of the use, of the Materials in terms of correctness,
## -- accuracy, reliability or otherwise.
## -- 
## -- Xilinx products are not designed or intended to be fail-safe,
## -- or for use in any application requiring fail-safe performance,
## -- such as life-support or safety devices or systems, Class III
## -- medical devices, nuclear facilities, applications related to
## -- the deployment of airbags, or any other applications that could
## -- lead to death, personal injury or severe property or
## -- environmental damage (individually and collectively, "critical
## -- applications"). Customer assumes the sole risk and liability
## -- of any use of Xilinx products in critical applications,
## -- subject only to applicable laws and regulations governing
## -- limitations on product liability.
## -- 
## -- Copyright 2009 Xilinx, Inc.
## -- All rights reserved.
## -- 
## -- This disclaimer and copyright notice must be retained as part
## -- of this file at all times.
##
###############################################################################
##
## custom_vtc_v1_00_a.pao
##
## Peripheral Analyze Order File
##
##
###############################################################################


lib custom_vtc_v1_00_a custom_vtc.v verilog


次に、custom_vtc_v2_1_0.mpd を下に示す。

#-- DISCLAIMER OF LIABILITY
#--
#-- This file contains proprietary and confidential information of
#-- Xilinx, Inc. ("Xilinx"), that is distributed under a license
#-- from Xilinx, and may be used, copied and/or disclosed only
#-- pursuant to the terms of a valid license agreement with Xilinx.
#--
#-- XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
#-- ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
#-- EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
#-- LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
#-- MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
#-- does not warrant that functions included in the Materials will
#-- meet the requirements of Licensee, or that the operation of the
#-- Materials will be uninterrupted or error-free, or that defects
#-- in the Materials will be corrected. Furthermore, Xilinx does
#-- not warrant or make any representations regarding use, or the
#-- results of the use, of the Materials in terms of correctness,
#-- accuracy, reliability or otherwise.
#--
#-- Xilinx products are not designed or intended to be fail-safe,
#-- or for use in any application requiring fail-safe performance,
#-- such as life-support or safety devices or systems, Class III
#-- medical devices, nuclear facilities, applications related to
#-- the deployment of airbags, or any other applications that could
#-- lead to death, personal injury or severe property or
#-- environmental damage (individually and collectively, "critical
#-- applications"). Customer assumes the sole risk and liability
#-- of any use of Xilinx products in critical applications,
#-- subject only to applicable laws and regulations governing
#-- limitations on product liability.
#--
#-- Copyright (c) 1995-2010 Xilinx, Inc.  All rights reserved.
#--
#-- This disclaimer and copyright notice must be retained as part
#-- of this file at all times.
#--
###################################################################
##
## Name     : custom_vtc
## Desc     : Microprocessor Peripheral Description
##          : Automatically generated by PsfUtility
##
###################################################################

BEGIN custom_vtc

## Peripheral Options
OPTION IPTYPE = PERIPHERAL
OPTION IMP_NETLIST = TRUE
OPTION STYLE = HDL
OPTION DESC = custom_vtc
OPTION LONG_DESC = Custom Video Timing Controller
OPTION HDL = VERILOG
OPTION RUN_NGCBUILD = FALSE

## Bus Interfaces
BUS_INTERFACE BUS = VTIMING_OUT, BUS_TYPE = INITIATOR, BUS_STD = VTIMING

## Generics for VHDL or Parameters for Verilog
PARAMETER H_ACTIVE_VIDEO = 800, DT = integer
PARAMETER H_FRONT_PORCH = 40, DT = integer
PARAMETER H_SYNC_PULSE = 128, DT = integer
PARAMETER H_BACK_PORCH = 88, DT = integer
PARAMETER V_ACTIVE_VIDEO = 600, DT = integer
PARAMETER V_FRONT_PORCH = 1, DT = integer
PARAMETER V_SYNC_PULSE = 4, DT = integer
PARAMETER V_BACK_PORCH = 23, DT = integer

## Ports
PORT vclk = "", DIR = I, SIGIS = CLK
PORT aresetn = "", DIR = I, SIGIS = RST
PORT vtc_ce = "", DIR = I
PORT vtg_act_vid = active_video, DIR = O, BUS = VTIMING_OUT
PORT vtg_vsync = vsync, DIR = O, BUS = VTIMING_OUT
PORT vtg_hsync = hsync, DIR = O, BUS = VTIMING_OUT
PORT vtg_vblank = vblank, DIR = O, BUS = VTIMING_OUT
PORT vtg_hblank = hblank, DIR = O, BUS = VTIMING_OUT

END


最後に、custom_vtc_v2_1_0.mui を下に示す。

<?xml version="1.0" encoding="ISO-8859-1"?>

<!--
###############################################################################
## DISCLAIMER OF LIABILITY
##
## This file contains proprietary and confidential information of
## Xilinx, Inc. ("Xilinx"), that is distributed under a license
## from Xilinx, and may be used, copied and/or disclosed only
## pursuant to the terms of a valid license agreement with Xilinx.
##
## XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
## ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
## EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
## LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
## MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
## does not warrant that functions included in the Materials will
## meet the requirements of Licensee, or that the operation of the
## Materials will be uninterrupted or error-free, or that defects
## in the Materials will be corrected. Furthermore, Xilinx does
## not warrant or make any representations regarding use, or the
## results of the use, of the Materials in terms of correctness,
## accuracy, reliability or otherwise.
##
## Xilinx products are not designed or intended to be fail-safe,
## or for use in any application requiring fail-safe performance,
## such as life-support or safety devices or systems, Class III
## medical devices, nuclear facilities, applications related to
## the deployment of airbags, or any other applications that could
## lead to death, personal injury or severe property or
## environmental damage (individually and collectively, "critical
## applications"). Customer assumes the sole risk and liability
## of any use of Xilinx products in critical applications,
## subject only to applicable laws and regulations governing
## limitations on product liability.
##
## Copyright 2009 Xilinx, Inc.
## All rights reserved.
##
## This disclaimer and copyright notice must be retained as part
## of this file at all times.
##
###############################################################################
-->

<!DOCTYPE doc SYSTEM "../../ipdialog.dtd" [
    <!-- -->
    <!ENTITY H_ACTIVE_VIDEO '
    <widget id="H_ACTIVE_VIDEO">
        <key>H_ACTIVE_VIDEO</key>
        <label>H_ACTIVE_VIDEO</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY H_FRONT_PORCH '
    <widget id="H_FRONT_PORCH">
        <key>H_FRONT_PORCH</key>
        <label>H_FRONT_PORCH</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY H_SYNC_PULSE '
    <widget id="H_SYNC_PULSE">
        <key>H_SYNC_PULSE</key>
        <label>H_SYNC_PULSE</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY H_BACK_PORCH '
    <widget id="H_BACK_PORCH">
        <key>H_BACK_PORCH</key>
        <label>H_BACK_PORCH</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY V_ACTIVE_VIDEO '
    <widget id="V_ACTIVE_VIDEO">
        <key>V_ACTIVE_VIDEO</key>
        <label>V_ACTIVE_VIDEO</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY V_FRONT_PORCH '
    <widget id="V_FRONT_PORCH">
        <key>V_FRONT_PORCH</key>
        <label>V_FRONT_PORCH</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY V_SYNC_PULSE '
    <widget id="V_SYNC_PULSE">
        <key>V_SYNC_PULSE</key>
        <label>V_SYNC_PULSE</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY C_M_AXI_SUPPORTS_WRITE '
    <widget id="C_M_AXI_SUPPORTS_WRITE">
        <key>C_M_AXI_SUPPORTS_WRITE</key>
        <label>C_M_AXI_SUPPORTS_WRITE</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY V_BACK_PORCH '
    <widget id="V_BACK_PORCH">
        <key>V_BACK_PORCH</key>
        <label>V_BACK_PORCH</label>
        <tip></tip>
    </widget>
    '>
]>

<doc>
    <view id="Video Timing">
        <display>Video Timing</display>
        <group id="Video Timing">
            <display>Video Timing</display>
            <item>&H_ACTIVE_VIDEO;</item>
            <item>&H_FRONT_PORCH;</item>
            <item>&H_SYNC_PULSE;</item>
            <item>&H_BACK_PORCH;</item>
            <item>&V_ACTIVE_VIDEO;</item>
            <item>&V_FRONT_PORCH;</item>
            <item>&V_SYNC_PULSE;</item>
            <item>&V_BACK_PORCH;</item>
        </group>
    </view>
    
</doc>

  1. 2013年06月08日 05:30 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

XPSのカスタムIPにおけるMUIファイルの書き方

custom_vtc IPコアを例にMUIファイルの書き方を書いておく。
なお、MPDファイルの書き方は、”XPSのカスタムIPにおけるMPDファイルの書き方1”からのシリーズを参照のこと。

なお、Platform Specification Format Reference ManualEmbedded Development Kit (EDK) 14.1 UG642 (v14.1) April 24, 2012 ”の75ページ ”Chapter 5 Microprocessor-IP User Interface (MUI)”をマニュアルとして参照にした。

MUI (Microprocessor-IP User Interface) ファイルは、XML形式で書かれていて、IPをXPSプロジェクトにAdd IPするときに表示されるダイアログのフォーマットを指定することができる。

DTD Reference Section
DTDファイルの ipdialog.dtd を参照する。ipdialog.dtd は、EDK_Installフォルダ/hw/XilinxProcessorIPLib/pcores にある。このファイルには、PLBの定義などがあった。
ipdialog.dtd は、MUIファイルの初めの行で定義してある。

<!DOCTYPE doc SYSTEM "../../ipdialog.dtd" [


Internal Entity Definition Section
すでに、DTDファイルで定義してある信号もあるけれども、IPコア固有のパラーメータを個別に定義する必要がある。

・<key> - MPDのパラメータの名前。このタグの値は、MPDファイル内の名前と一致する必要がある。

・<label> - 短いテキスト記述。このタグは、ダイアログボックスのパラメータのラベルを定義する。

・<tip> - ツールチップ。この情報は、マウスは、パラメータ名の上に保持されているダイアログボックスのポップアップウィンドウに表示される。コンテンツは、このタグは必要ない。

custom vtc の例をw下に示す。

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE doc SYSTEM "../../ipdialog.dtd" [
    <!-- -->
    <!ENTITY H_ACTIVE_VIDEO '
    <widget id="H_ACTIVE_VIDEO">
        <key>H_ACTIVE_VIDEO</key>
        <label>H_ACTIVE_VIDEO</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY H_FRONT_PORCH '
    <widget id="H_FRONT_PORCH">
        <key>H_FRONT_PORCH</key>
        <label>H_FRONT_PORCH</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY H_SYNC_PULSE '
    <widget id="H_SYNC_PULSE">
        <key>H_SYNC_PULSE</key>
        <label>H_SYNC_PULSE</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY H_BACK_PORCH '
    <widget id="H_BACK_PORCH">
        <key>H_BACK_PORCH</key>
        <label>H_BACK_PORCH</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY V_ACTIVE_VIDEO '
    <widget id="V_ACTIVE_VIDEO">
        <key>V_ACTIVE_VIDEO</key>
        <label>V_ACTIVE_VIDEO</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY V_FRONT_PORCH '
    <widget id="V_FRONT_PORCH">
        <key>V_FRONT_PORCH</key>
        <label>V_FRONT_PORCH</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY V_SYNC_PULSE '
    <widget id="V_SYNC_PULSE">
        <key>V_SYNC_PULSE</key>
        <label>V_SYNC_PULSE</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY C_M_AXI_SUPPORTS_WRITE '
    <widget id="C_M_AXI_SUPPORTS_WRITE">
        <key>C_M_AXI_SUPPORTS_WRITE</key>
        <label>C_M_AXI_SUPPORTS_WRITE</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY V_BACK_PORCH '
    <widget id="V_BACK_PORCH">
        <key>V_BACK_PORCH</key>
        <label>V_BACK_PORCH</label>
        <tip></tip>
    </widget>
    '>
]>


Labelはダイアログで、下の図のように表示される。この Internal Entity Definition Section では定義のみで、次に示す Entity Reference Section で item としてインスタンスされる必要がある。
custom_vtc_6_130608.png


Entity Reference Section
ここでは、Add IPの時のダイアログの体裁を決定する。

・<doc> - エレメント階層のトップでルート・エレメント。

・<view> - view は、階層の第2レベルの、タブ名となる。view id がIDを示し、<display> </display>で囲まれた間の名前がタブ名として表示される。

・<group> - グループを示す。group id がIDを示し、<display> </display>で囲まれた間の名前がタブ名として表示される。

・<item> - Internal Entity Definition Section で定義されたエンティティを表示させる。

custom_vtc で下のように書くと、

<doc>
    <view id="Video Timing">
        <display>Video Timing1</display>
        <group id="Video Timing">
            <display>Video Timing2</display>
            <item>&H_ACTIVE_VIDEO;</item>
            <item>&H_FRONT_PORCH;</item>
            <item>&H_SYNC_PULSE;</item>
            <item>&H_BACK_PORCH;</item>
            <item>&V_ACTIVE_VIDEO;</item>
            <item>&V_FRONT_PORCH;</item>
            <item>&V_SYNC_PULSE;</item>
            <item>&V_BACK_PORCH;</item>
        </group>
    </view>
    
</doc>


ダイアログは下の図のように表示される。
custom_vtc_5_130608.png
  1. 2013年06月08日 04:04 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

Custom Video Timing Controller の作製2(シミュレーション)

Custom Video Timing Controller の作製1(仕様の検討)”で仕様の検討をしたが、Verilog HDLで書いて完成したので、シミュレーションを行った。

Project Navigator でプロジェクトを作製して、シミュレーションを行った。Project Navigator の画面を下に示す。
custom_vtc_4_130606.png

下に17msec までシミュレーションした波形を示す。
custom_vtc_1_130606.png

vtc_vsync と vtc_vblank が出ているのがわかると思う。

今度は最初の部分を拡大してみた。
custom_vtc_2_130606.png

vtc_act_vid がピクセルデータが出ている部分で 1 になるのがわかる。vtc_hsync と vtc_hblank が出ているのが見える。

次に、vtc_vblank が 1 になる辺りを拡大してみた。
custom_vtc_3_130606.png

V_FRONT_PORCH = 1 なので、vtc_vsync が随分と前よりになっている。

Verilog HDLで書いたソースコードを貼っておく。(2013/07/07:修正)
custom_vtc.v を下に示す。

// Custom Video Timing Controller IP
// custom_vtc.v
// AXI4バス用

`default_nettype none

// synthesis translate_off
// `include "std_ovl_defines.h"
// synthesis translate_on

module custom_vtc # (
    parameter    integer    H_ACTIVE_VIDEO =    800,
    parameter    integer    H_FRONT_PORCH =         40,
    parameter    integer    H_SYNC_PULSE =        128,
    parameter    integer    H_BACK_PORCH =        88,
    parameter    integer    V_ACTIVE_VIDEO =    600,
    parameter    integer    V_FRONT_PORCH =        1,
    parameter    integer    V_SYNC_PULSE =        4,
    parameter    integer    V_BACK_PORCH =        23
)(
    input    wire    vclk,                // ディスプレイ表示用クロック
    input    wire    aresetn,            // 非同期リセット負論理
    input    wire    vtc_ce,                // VTC clock enable.
    output    wire    vtg_act_vid,        // VTG active video signal. 
    output    wire    vtg_vsync,
    output    wire    vtg_hsync,
    output    wire    vtg_vblank,
    output    wire    vtg_hblank
);
    localparam    integer    H_SUM = H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH;
    localparam    integer    V_SUM = V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH;

    reg    reset_1b, reset;
    reg [15:0] h_count;
    reg [15:0] v_count;
    reg hsyncx_node, vsyncx_node;
    reg display_enable;
    reg hblank;
    reg    vblank;

    // aresetn をvclk で同期化
    always @(posedge vclk) begin
        reset_1b <= ~aresetn;
        reset <= reset_1b;
    end
    
    // h_countの実装(水平カウンタ)
    always @(posedge vclk) begin
        if (reset)
            h_count <= 0;
        else if (vtc_ce) begin
            if (h_count>=(H_SUM-1)) // h_count がH_SUM-1よりも大きければ0に戻す(mod H_SUM)
                h_count <= 0;
            else
                h_count <= h_count + 1;
        end
    end
    
    // v_countの実装(垂直カウンタ)
    always @(posedge vclk) begin
        if (reset)
            v_count <= 0;
        else if (vtc_ce) begin
            if (h_count>=(H_SUM-1)) begin // 水平カウンタがクリアされるとき
                if (v_count>=(V_SUM-1)) // v_count がV_SUM-1よりも大きければ0に戻す(mode V_SUM)
                    v_count <= 0;
                else
                    v_count <= v_count + 1;
            end
        end
    end
    
    // vtg_hsync 出力(水平同期信号)
    always @(posedge vclk) begin
        if (reset)
            hsyncx_node <= 1'b1;
        else if (vtc_ce) begin
            if (h_count>(H_ACTIVE_VIDEO + H_FRONT_PORCH-1) && h_count<=(H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE-1)) // 水平同期期間
                hsyncx_node <= 1'b0;
            else
                hsyncx_node <= 1'b1;
        end
    end
    assign vtg_hsync = ~hsyncx_node;
    
    // vtg_vsync 出力(水平同期信号)
    always @(posedge vclk) begin
        if (reset)
            vsyncx_node <= 1'b1;
        else  if (vtc_ce) begin
            if (v_count>(V_ACTIVE_VIDEO + V_FRONT_PORCH-1) && v_count<=(V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE-1)) // 垂直同期期間
                vsyncx_node <= 1'b0;
            else
                vsyncx_node <= 1'b1;
        end
    end
    assign vtg_vsync = ~vsyncx_node;
    
    // vtg_act_vid 出力
    always @(posedge vclk) begin
        if (reset)
            display_enable <= 1'b0;
        else if (vtc_ce) begin
            if (h_count<H_ACTIVE_VIDEO && v_count<V_ACTIVE_VIDEO)
                display_enable <= 1'b1;
            else
                display_enable <= 1'b0;
        end
    end
    assign vtg_act_vid = display_enable;
    
    // vtg_hblank 出力
    always @(posedge vclk) begin
        if (reset)
            hblank <= 1'b0;
        else if (vtc_ce) begin
            if (h_count >= H_ACTIVE_VIDEO)
                hblank <= 1'b1;
            else
                hblank <= 1'b0;
        end
    end
    assign vtg_hblank = hblank;
    
    // vtg_vblank 出力
    always @(posedge vclk) begin
        if (reset)
            vblank <= 1'b0;
        else if (vtc_ce) begin
            if (v_count >= V_ACTIVE_VIDEO)
                vblank <= 1'b1;
            else
                vblank <= 1'b0;
        end
    end
    assign vtg_vblank = vblank;
            
endmodule

`default_nettype wire


次に、テストベンチの custom_vtc_tb.v を下に示す。(2013/07/07:修正)

`default_nettype none
`timescale 100ps / 1ps

////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer:
//
// Create Date:   05:22:59 06/05/2013
// Design Name:   custom_vtc
// Module Name:   D:/HDL/FndtnISEWork/Zynq-7000/ZedBoard/test/VDMA_test/custom_vtc_tb.v
// Project Name:  VDMA_test
// Target Device:  
// Tool versions:  
// Description: 
//
// Verilog Test Fixture created by ISE for module: custom_vtc
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
////////////////////////////////////////////////////////////////////////////////

module custom_vtc_tb;

    // Inputs
    wire vclk;
    wire aresetn;
    reg vtc_ce;

    // Outputs
    wire vtg_act_vid;
    wire vtg_vsync;
    wire vtg_hsync;
    wire vtg_vblank;
    wire vtg_hblank;

    // Instantiate the Unit Under Test (UUT)
    custom_vtc uut (
        .vclk(vclk), 
        .aresetn(aresetn), 
        .vtc_ce(vtc_ce), 
        .vtg_act_vid(vtg_act_vid), 
        .vtg_vsync(vtg_vsync), 
        .vtg_hsync(vtg_hsync), 
        .vtg_vblank(vtg_vblank), 
        .vtg_hblank(vtg_hblank)
    );

    initial begin
        // Initialize Inputs
        vtc_ce = 1'b0;

        // Wait 200 ns for global reset to finish
        #2000;
        
        // Add stimulus here
        vtc_ce = 1'b1;
    end

    // vclk generate
    clk_gen #(
        .CLK_PERIOD(250),    // 25.0nsec, 40MHz
        .CLK_DUTY_CYCLE(0.5),
        .CLK_OFFSET(0),
        .START_STATE(1'b0)
    ) pclk_from_pll_i (
        .clk_out(vclk)
    );
    
    // aresetn generate
    reset_gen #(
        .RESET_STATE(1'b0),
        .RESET_TIME(1000)    // 100nsec
    ) RESETi (
        .reset_out(aresetn)
    );

endmodule

module clk_gen #(
    parameter         CLK_PERIOD = 100,
    parameter real    CLK_DUTY_CYCLE = 0.5,
    parameter        CLK_OFFSET = 0,
    parameter        START_STATE    = 1'b0 )
(
    output    reg        clk_out
);
    begin
        initial begin
            #CLK_OFFSET;
            forever
            begin
                clk_out = START_STATE;
                #(CLK_PERIOD-(CLK_PERIOD*CLK_DUTY_CYCLE)) clk_out = ~START_STATE;
                #(CLK_PERIOD*CLK_DUTY_CYCLE);
            end
        end
    end
endmodule

module reset_gen #(
    parameter    RESET_STATE = 1'b1,
    parameter    RESET_TIME = 100 )
(
    output    reg        reset_out
);
    begin
        initial begin
            reset_out = RESET_STATE;
            #RESET_TIME;
            reset_out = ~RESET_STATE;
        end
    end
endmodule

`default_nettype wire

  1. 2013年06月06日 05:15 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

Raspberry Pi Camera が来ました

RSコンポーネンツに5月20日に注文したRaspberry Pi Camera が来ました。注文時に来たPDFファイルには9月9日に納品とがっくりするようなことが書いてあったんですが、6月3日に届きました。良かったです。

下の写真がRaspberry Pi Camera の箱です。
RPi_Camera_1_130605.jpg

Raspberry Pi Camera の本体です。FFCフラットケーブルが付いています。小さいです。23.5mm x 25mm です。
RPi_Camera_2_130605.jpg

基盤に取り付けられているカメラモジュールは、OmniVison社のOV5647 だそうです。相変わらず、マニュアルがありません。
カメラ部分を拡大してみました。
RPi_Camera_3_130605.jpg

FPGAにも使えるかな?と思いましたが、マニュアルが無くて使えないようです。

Raspberry Piカメラのセットアップ方法が書いてあります。やってみようと思っています。

そうそう、OV5647のマニュアルを探している時にPDFをダウンロードしたら拡張子が.pdf.exe でした。わからずに起動したのですが(見える拡張子はpdfだけでした)、Windowsで変更を許可するダイアログが出たので、キャンセルして助かりました。皆さんもお気をつけください。

#実はもうやられていたりして?油断も隙もない。。。
  1. 2013年06月05日 05:17 |
  2. マイコン関連
  3. | トラックバック:0
  4. | コメント:4

土間用テーブルの作製

ちょっと前に作ったのですが、奥さんの実家から土間用テーブルの作製を依頼されて作ったので、写真を載せておこうと思います。
table_130604.jpg

上の写真のように片方の2本の足を上がり框にかけて、もう片方の2本の足は土間に置いて使います。
テーブルは、赤松の厚さ25mm、幅400mm の板を100mm 切って、2枚はいで600mm四方の正方形 の天板にしてあります。
足は丸棒です。グランステージつくばでネジ付きの丸棒足が売っていたので、それを切って使っています。テーブルにはネジが切ってある金具が付いていて、そこに足をねじ込みます。
テーブルのの裏側には、2本の1x4材を補強として取り付けてあります。
テーブルの塗装は、アクリルニス仕上げで3度塗りです。
テーブルの縁取りはトリマーで面取りしました。
  1. 2013年06月04日 06:11 |
  2. 木工
  3. | トラックバック:0
  4. | コメント:0

Custom Video Timing Controller の作製1(仕様の検討)

カメラ・インターフェース用AXI4-Stream IPの作製6(AXI4-Stream IPの設定)”で、カメラ・インターフェース用AXI4-Stream IPの作製が終了した。もうすでにXPSプロジェクトにIPとして追加してある。

次は、AXI4-Stream to Video Outを使用するために、VTC(Video Timing Controller)の代わりになるものとして、Custom Video Timing Controller を作ろうと思う。
もう一度、LogiCORE IP AXI4-Stream to Video Out v1.0 Product Guide PG044 April 24, 2012のFigure 1-1をもう一度下に転載させて頂く。(”カメラ、ビデオ表示カスタムIPを AX4-Stream に変更1(使用するIPの検討)”参照)
Camera_Display_w_VDMA_3_130526.png

Figure 1-1の下側の Video Timing Controller を自作することにしようと思う。VTCは購入する必要があるためと、機能的にはSVGAのタイミングを生成出来れば十分なためだ。XilinxのVTCはもっと高機能だ。

下に、Custom Video Timing Controller IP (custom_vtc.v) の module の宣言部を示す。

module custom_vtc # (
    parameter    integer    H_ACTIVE_VIDEO =    800,
    parameter    integer    H_FRONT_PORCH =         40,
    parameter    integer    H_SYNC_PULSE =        128,
    parameter    integer    H_BACK_PORCH =        88,
    parameter    integer    V_ACTIVE_VIDEO =    600,
    parameter    integer    V_FRONT_PORCH =        1,
    parameter    integer    V_SYNC_PULSE =        4,
    parameter    integer    V_BACK_PORCH =        23
)(
    input    wire    vclk,                // ディスプレイ表示用クロック
    input    wire    aresetn,            // 非同期リセット負論理
    input    wire    vtc_ce,                // VTC clock enable.
    output    wire    vtc_act_vid,        // VTC active video signal. 
    output    wire    vtc_vsync,
    output    wire    vtc_hsync,
    output    wire    vtc_vblank,
    output    wire    vtc_hblank
);


これで、Verilog HDLで作成し、AXI4のバスは持たいないがXPSプロジェクトのカスタムIPとして作成しようと思う。
このように、自由にカスタムIPを作って、用意されているXilinxのIPと接続すると簡単にシステムを構築することができると思う。IP間の接続はHDLを書かなくても、GUIでできるし、CoregenのIPやプリミティブを使って無ければ、シリーズをまたいで自作したカスタムIPを使用することができる。CoregenのIPを使っていても、そのシリーズのFPGA用に再生成すれば良い。プリミティブは取り替える。
  1. 2013年06月04日 05:31 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

カメラ・インターフェース用AXI4-Stream IPの作製6(AXI4-Stream IPの設定)

前回、
カメラ・インターフェース用AXI4-Stream IPの作製4(HDLソース1)
カメラ・インターフェース用AXI4-Stream IPの作製5(HDLソース2)
で、カメラ・インターフェースAXI4-Stream IPのHDLソースを示した。
今回は、”カメラ・インターフェース用AXI4-Stream IPの作製1(仕様の検討)”に書かれているように、ar37425.zip を解凍して、ar37425/axi_stream フォルダをテンプレートとして、カメラ・インターフェース用のAXI4-Stream IP用に変更していく様子を示す。

・mt9d111_inf_axi_stream_v2_1_0.pao
まずは、 system\pcores\mt9d111_inf_axi_stream_v1_00_a\dataフォルダの mt9d111_inf_axi_stream_v2_1_0.pao ファイルから始める。ここには、IPに所属するHDファイルが書いてある。下のように変更した。

## AXI Stream Core
lib mt9d111_inf_axi_stream_v1_00_a mt9d111_inf_axi_stream.vhd vhdl
lib mt9d111_inf_axi_stream_v1_00_a pixel_fifo.v verilog
lib mt9d111_inf_axi_stream_v1_00_a mt9d111_cam_conts.v verilog


・mt9d111_inf_axi_stream_v2_1_0.mpd
次に、mt9d111_inf_axi_stream_v2_1_0.mpd ファイルを変更する。

1.”OPTION HDL = VHDL”を”OPTION HDL = MIXED”に変更(Verilog HDLも使用している)。

2.”OPTION STYLE = HDL”を”OPTION STYLE = MIX”に変更(pixel_fifo用にNGCファイルを使用する)。

3.”OPTION DESC”と”OPTION LONG_DESC”を下に示すように変更した。(修正)

OPTION DESC = mt9d111_inf_axi_stream
OPTION LONG_DESC = MT9D111 Interface of AXI4-Stream


4.”IO_INTERFACE IO_IF”を設定した。下の IO port for MT9D111 でグループ化する。

IO_INTERFACE IO_IF = mt9d111_inf


5.テンプレートにはマスタ用とスレーブ用の記述があるので、マスタ用だけの記述を残して、スレーブ用の記述は削除した。

6.C_M_AXIS_DATA_WIDTH の RANGE を”RANGE = (8,16,24,32,40,48,56,64,128,256)”に変更した。

6.5.C_M_AXIS_PROTOCOLパラメータを設定した。(2013/07/06:追記) ”AXI VDMAのシミュレーション1”を参照。

PARAMETER C_M_AXIS_PROTOCOL = XIL_AXI_STREAM_VID_DATA, DT = STRING, BUS = M_AXIS, ASSIGNMENT = CONSTANT, TYPE = NON_HDL


7.Ports を変更または追加した。変更、追加したポートを下に示す。

## Ports
PORT s2mm_aclk = "", DIR = I, SIGIS = CLK
PORT s2mm_prmry_reset = "", DIR = I, SIGIS = RST
PORT s2mm_fsync = "", DIR = O

# IO port for MT9D111
PORT init_done = "", DIR = I, IO_IF = mt9d111_inf, IO_IS = init_done
PORT pclk_from_pll = "", DIR = I, SIGIS = CLK, IO_IF = mt9d111_inf, IO_IS = pclk_from_pll
PORT pclk = "", DIR = I, SIGIS = CLK, IO_IF = mt9d111_inf, IO_IS = pclk
PORT xck = "", DIR =O, SIGIS = CLK, IO_IF = mt9d111_inf, IO_IS = xck
PORT href = "", DIR = I, IO_IF = mt9d111_inf, IO_IS = href
PORT vsync = "", DIR = I, IO_IF = mt9d111_inf, IO_IS = vsync
PORT cam_data = "", DIR = I, VEC = [7:0], IO_IF = mt9d111_inf, IO_IS = cam_data
PORT standby = "", DIR = O, IO_IF = mt9d111_inf, IO_IS = standby
PORT pfifo_overflow = "", DIR = O, IO_IF = mt9d111_inf, IO_IS = pfifo_overflow
PORT pfifo_underflow = "", DIR = O, IO_IF = mt9d111_inf, IO_IS = pfifo_underflow


・mt9d111_inf_axi_stream_v2_1_0.mui
次に、mt9d111_inf_axi_stream_v2_1_0.mui を編集する。このファイルは、Addした時のダイアログの表示を構築する。

1.C_M_AXIS_DATA_WIDTH の項目を削除した。

これで、mt9d111_inf_axi_stream_v2_1_0.mui の編集は終了した。

・mt9d111_inf_axi_stream_v2_1_0.bbd
system\pcores\mt9d111_inf_axi_stream_v1_00_a\dataフォルダに、mt9d111_inf_axi_stream_v2_1_0.bbdファイルを追加する。pixel_fifo のNGCファイルを追加するため、mt9d111_inf_axi_stream_v2_1_0.mpd ファイルを”OPTION STYLE = MIX”に変更し、mt9d111_inf_axi_stream_v2_1_0.bbdファイルを追加する。mt9d111_inf_axi_stream_v2_1_0.bbdファイルの内容を下に示す。

FILES
pixel_fifo.ngc


・netlistフォルダ
mt9d111_inf_axi_stream_v2_1_0.bbd フォルダに、pixel_fifo.ngc を使うと書いたが、実際の pixel_fifo.ngc を入れておくために system\pcores\mt9d111_inf_axi_stream_v1_00_a\netlist フォルダを作成する。
netlist フォルダの中には、pixel_fifo.ngc を入れておく。

これで、カメラ・インターフェース用のAXI4-Stream IPは、完成だ。

これを、XPSプロジェクトのProject メニューからRescan User Repositories を行なってから、mt9d111_inf_axi_stream をAdd IP すると下に示すダイアログが出る。
Cam_AXI4_Stream_IP_12_130603.png

M_AXISと mt9d111_inf に + 記号が付いているのが見えるだろうか?この信号線をクリックすると、グループを構成する信号名を一覧することができる。
Cam_AXI4_Stream_IP_13_130603.png

  1. 2013年06月03日 04:39 |
  2. AXI4-Stream IPの作製
  3. | トラックバック:0
  4. | コメント:0

カメラ・インターフェース用AXI4-Stream IPの作製5(HDLソース2)

今回は、シミュレーション用のHDLファイルを下に示す。

AXI4-Streamマスタの mt9d111_inf_axi_stream.vhd からのAXI4-Stream に接続し、TREADYを返すだけの axi4s_slave_bfm を下に示す。

-----------------------------------------------------------------------------
--
-- AXI Stream Master用 AXI Stream Slave Bus Function Mode (BFM)
--
-----------------------------------------------------------------------------
-- 2012/02/25 : M_AXI_AWBURST=1 (INCR) にのみ対応、AWSIZE, ARSIZE = 000 (1byte), 001 (2bytes), 010 (4bytes) のみ対応。
-- 2012/01/15 : BVALID が1になる間隔をランダム変更できるようにした。

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

package m_seq_bfm_pack is
    function M_SEQ16_BFM_F(mseq16in : std_logic_vector
        )return std_logic_vector;
end package m_seq_bfm_pack;
package body m_seq_bfm_pack is
    function M_SEQ16_BFM_F(mseq16in : std_logic_vector
        )return std_logic_vector is
            variable mseq16 : std_logic_vector(15 downto 0);
            variable xor_result : std_logic;
    begin
        xor_result := mseq16in(15) xor mseq16in(12) xor mseq16in(10) xor mseq16in(8) xor mseq16in(7) xor mseq16in(6) xor mseq16in(3) xor mseq16in(2);
        mseq16 := mseq16in(14 downto 0) & xor_result;
        return mseq16;
    end M_SEQ16_BFM_F;
end m_seq_bfm_pack;


library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
use IEEE.math_real.all;

library work;
use work.m_seq_bfm_pack.all;

--library unisim;
--use unisim.vcomponents.all;

entity axi4s_slave_bfm is
  generic (
        -- Master AXI Stream Data Width
        C_M_AXIS_DATA_WIDTH : integer range 8 to 1024 := 24;    C_M_AXI_ID_WIDTH     : integer := 1;
        
        TREADY_RANDOM_WAIT    : integer := 1 -- m_axis_treadyにランダムなWaitを発生させる=1, Waitしない=0
   );
  port(
        -- System Signals
        ACLK    : in std_logic;
        ARESETN : in std_logic;

        -- Master Stream Ports
    --    m_axis_aresetn : out std_logic;
        m_axis_tdata   : in std_logic_vector(C_M_AXIS_DATA_WIDTH-1 downto 0);
        m_axis_tstrb   : in std_logic_vector((C_M_AXIS_DATA_WIDTH/8)-1 downto 0);
        m_axis_tvalid  : in std_logic;
        m_axis_tready  : out  std_logic;
        m_axis_tlast   : in std_logic
    );

end axi4s_slave_bfm;

architecture RTL of axi4s_slave_bfm is

signal m_seq16_wr    : std_logic_vector(15 downto 0);
signal reset_1d, reset_2d, reset : std_logic := '1';
signal tready : std_logic;

begin
    -- ARESETN をACLK で同期化
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            reset_1d <= not ARESETN;
            reset_2d <= reset_1d;
        end if;
    end process;
    reset <= reset_2d;
    
    -- m_seq_wr、16ビットのM系列を計算する
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                m_seq16_wr <= (0 => '1', others => '0');
            else
                if TREADY_RANDOM_WAIT=1 then -- ランダムなWaitを挿入する
                    m_seq16_wr <= M_SEQ16_BFM_F(m_seq16_wr);
                else -- Wait無し
                    m_seq16_wr <= (others => '0');
                end if;
            end if;
        end if;
    end process;
    
    -- tready のアサート、TREADY_RANDOM_WAIT=1のときはランダムにアサートする
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                tready <= '0';
            else
                if TREADY_RANDOM_WAIT=1 then -- tready の処理、M系列を計算して128以上だったらWaitする。
                    if m_seq16_wr(7)='0' then -- tready='1' 
                        tready <= '1';
                    else -- m_seq16_wr(7)='1' then -- tready='0'
                        tready <= '0';
                    end if;
                else -- 常時1
                    tready <= '1';
                end if;
            end if;
        end if;
    end process;
    m_axis_tready <= tready;

end RTL;


次に、MT9D111のモデル、mt9d111_model.v を下に示す。(2013/08/27:修正)

// mt9d111_model.v 
// mt9d111 の動作モデル
// RGB565 を出力

`default_nettype none
`timescale 1ns / 1ps

module mt9d111_model # (
    parameter    integer HORIZONTAL_PIXELS    = 800,
    parameter    integer    VERTICAL_LINES        = 600,
    parameter    integer    HBLANK_REG            = 174,     // pixels
    parameter    integer    VBLANK_REG            = 16,    // rows
    parameter    integer    PCLK_DELAY            = 1
)(
    input    wire    xck,
    output    reg        pclk = 1'b1,
    output    reg        href = 1'b0,
    output    reg        vsync = 1'b0,
    output    reg        [7:0]    d = 8'd0,
    input    wire    scl,
    inout    wire    sda,
    input    wire    standby
);

    parameter    [2:0]    INITIAL_STATE =            3'b000,
                        FRAME_START_BLANKING =    3'b001,
                        ACTIVE_DATA_TIME =        3'b011,
                        HORIZONTAL_BLANKING =    3'b010,
                        FRAME_END_BLANKING =    3'b110,
                        VERTICAL_BLANKING =        3'b111;
                        
    reg        [2:0]    mt9d111_cs = INITIAL_STATE;
    reg        [2:0]    fseb_count = 3'd5;
    reg        [15:0]    adt_count = (HORIZONTAL_PIXELS * 2) - 1;
    reg        [15:0]    hb_count = HBLANK_REG - 1;
    reg        [15:0]    fvt_count = VERTICAL_LINES - 1;
    reg        [31:0]    vb_count = VBLANK_REG * (HORIZONTAL_PIXELS + HBLANK_REG) - 1;
    reg        [15:0]    init_count = 10; // 初期化時間
    reg        href_node = 1'b0;
    reg        vsync_node = 1'b0;
    reg        dout_is_even = 1'b0;

    // R, G, B 毎に違った生成多項式のM系列を用意した
    function [7:0] mseqf8_R (input [7:0] din);
        reg xor_result;
        begin
            xor_result = din[7] ^ din[3] ^ din[2] ^ din[1];
            mseqf8_R = {din[6:0], xor_result};
        end
    endfunction
    
    function [7:0] mseqf8_G (input [7:0] din);
        reg xor_result;
        begin
            xor_result = din[7] ^ din[4] ^ din[2] ^ din[0];
            mseqf8_G = {din[6:0], xor_result};
        end
    endfunction

    function [7:0] mseqf8_B (input [7:0] din);
        reg xor_result;
        begin
            xor_result = din[7] ^ din[5] ^ din[2] ^ din[1];
            mseqf8_B = {din[6:0], xor_result};
        end
    endfunction

    reg        [7:0]    mseq8r = 8'd1;
    reg        [7:0]    mseq8g = 8'd1;
    reg        [7:0]    mseq8b = 8'd1;
    
    // pclk の出力
    always @*
        pclk <= #PCLK_DELAY    xck;
        
    // MT9D111 のステート
    always @(posedge pclk) begin
        case (mt9d111_cs)
            INITIAL_STATE : begin
                if (init_count==0) begin
                    mt9d111_cs <= FRAME_START_BLANKING;
                    vsync_node <= 1'b1;
                end
            end
            FRAME_START_BLANKING : begin
                if (fseb_count==0) begin
                    mt9d111_cs <= ACTIVE_DATA_TIME;
                    href_node <= 1'b1;
                end
            end
            ACTIVE_DATA_TIME : begin
                if (adt_count==0) begin
                    if (fvt_count==0)    // frame end
                        mt9d111_cs <= FRAME_END_BLANKING;
                    else
                        mt9d111_cs <= HORIZONTAL_BLANKING;
                    href_node <= 1'b0;
                end
            end
            HORIZONTAL_BLANKING : begin
                if (hb_count==0) begin
                    mt9d111_cs <= ACTIVE_DATA_TIME;
                    href_node <= 1'b1;
                end
            end
            FRAME_END_BLANKING : begin
                if (fseb_count==0) begin
                    mt9d111_cs <= VERTICAL_BLANKING;
                    vsync_node <= 1'b0;
                end
            end
            VERTICAL_BLANKING : begin
                if (vb_count==0) begin
                    mt9d111_cs <= FRAME_START_BLANKING;
                    vsync_node <= 1'b1;
                end
            end
        endcase
    end
                
    // vsync, href 出力、レーシングを防ぐためにpclk よりも出力を遅らせる
    always @* begin
        vsync <= #1    vsync_node;
        href <= #1    href_node;
    end
    
    // Frame Start/End Blanking Counter (6 pixel clocks)
    always @(posedge pclk) begin
        if (mt9d111_cs==FRAME_START_BLANKING || mt9d111_cs==FRAME_END_BLANKING) begin
            if (fseb_count > 0)
                fseb_count <= fseb_count - 3'd1;
        end else
            fseb_count <= 3'd5;
    end
    
    // Initial Counter
    always @(posedge pclk) begin
        if (mt9d111_cs == INITIAL_STATE) begin
            if (init_count != 0)
                init_count <= init_count - 1;
        end
    end
    
    // Active Data Time Counter
    always @(posedge pclk) begin
        if (mt9d111_cs != INITIAL_STATE) begin
            if (mt9d111_cs==ACTIVE_DATA_TIME) begin
                if (adt_count > 0)
                    adt_count <= adt_count - 16'd1;
            end else
                adt_count <= (HORIZONTAL_PIXELS * 2) - 1;
        end
    end
    
    // Horizontal Blanking Counter
    always @(posedge pclk) begin
        if (mt9d111_cs != INITIAL_STATE) begin
            if (mt9d111_cs==HORIZONTAL_BLANKING) begin
                if (hb_count > 0)
                    hb_count <= hb_count - 16'd1;
            end else
                hb_count <= HBLANK_REG - 1;
        end
    end
    
    // Frame Valid Time Counter
    always @(posedge pclk) begin
        if (mt9d111_cs != INITIAL_STATE) begin
            if (mt9d111_cs==ACTIVE_DATA_TIME && adt_count==0) begin
                if (fvt_count > 0)
                    fvt_count <= fvt_count - 16'd1;
            end if (mt9d111_cs == VERTICAL_BLANKING)
                fvt_count <= VERTICAL_LINES - 1;
        end
    end
    
    // Vertical Blanking Counter
    always @(posedge pclk) begin
        if (mt9d111_cs != INITIAL_STATE) begin
            if (mt9d111_cs==VERTICAL_BLANKING) begin
                if (vb_count > 0)
                    vb_count <= vb_count - 32'd1;
            end else
                vb_count <= VBLANK_REG * (HORIZONTAL_PIXELS + HBLANK_REG) - 1;
        end
    end
    
    // Red のM系列符号生成
    always @(posedge pclk) begin
        // if (mt9d111_cs==ACTIVE_DATA_TIME)
            mseq8r <= mseqf8_R(mseq8r);
    end
    
    // Green のM系列符号生成
    always @(posedge pclk) begin
        // if (mt9d111_cs==ACTIVE_DATA_TIME)
            mseq8g <= mseqf8_G(mseq8g);
    end
    
    // Blue のM系列符号生成
    always @(posedge pclk) begin
        // if (mt9d111_cs==ACTIVE_DATA_TIME)
            mseq8b <= mseqf8_B(mseq8b);
    end
    
    // d 出力のODD とEVEN を示す
    always @(posedge pclk) begin
        if (mt9d111_cs==ACTIVE_DATA_TIME)
            dout_is_even <= ~dout_is_even;
        else
            dout_is_even <= 1'b0;
    end
    
    // d 出力、レーシングを防ぐためにpclk よりも出力を遅らせる
    always @(posedge pclk) begin
        if (mt9d111_cs==ACTIVE_DATA_TIME) begin
            if (dout_is_even)
                d <= #1 {mseq8g[4:2], mseq8b[7:3]};
            else
                d <= #1 {mseq8r[7:3], mseq8g[7:5]};
        end
    end

endmodule

`default_nettype wire


最後に、テストベンチの mt9d111_inf_axi_stream_tb.v を下に示す。

`default_nettype none

`timescale 100ps / 1ps

////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer:
//
// Create Date:   09:51:18 12/31/2012
// Design Name:   mt9d111_inf_axi_master
// Module Name:   D:\HDL\FndtnISEWork\Zynq-7000\ZedBoard\test\VDMA_test\mt9d111_inf_axi_stream_tb.v
// Project Name:  mt9d111_inf_axi_master
// Target Device:  
// Tool versions:  
// Description: 
//
// Verilog Test Fixture created by ISE for module: mt9d111_inf_axi_master
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
////////////////////////////////////////////////////////////////////////////////

module mt9d111_inf_axi_stream_tb;

    wire s2mm_aclk;
    wire s2mm_prmry_reset;
    wire s2mm_fsync;
    wire init_done;
    wire pclk_from_pll;
    wire pclk;
    wire href;
    wire vsync;
    wire [7:0] cam_data;
    wire xck;
    wire standby;
    wire pfifo_overflow;
    wire pfifo_underflow;
    
    wire [23:0] m_axis_tdata;
    wire [2:0] m_axis_tstrb;
    wire m_axis_tvalid;
    wire m_axis_tready;
    wire m_axis_tlast;

    // Instantiate the Unit Under Test (UUT)
    mt9d111_inf_axi_stream # (
        .C_M_AXIS_DATA_WIDTH(24)
    ) uut (
        .s2mm_aclk(s2mm_aclk), 
        .s2mm_prmry_reset(s2mm_prmry_reset), 
        .s2mm_fsync(s2mm_fsync),
        .m_axis_tdata(m_axis_tdata), 
        .m_axis_tstrb(m_axis_tstrb), 
        .m_axis_tvalid(m_axis_tvalid), 
        .m_axis_tready(m_axis_tready), 
        .m_axis_tlast(m_axis_tlast), 
        .init_done(init_done), 
        .pclk_from_pll(pclk_from_pll), 
        .pclk(pclk), 
        .xck(xck), 
        .href(href), 
        .vsync(vsync), 
        .cam_data(cam_data), 
        .standby(standby), 
        .pfifo_overflow(pfifo_overflow), 
        .pfifo_underflow(pfifo_underflow)
    );
    
    assign init_done = 1'b1;

    // pclk_from_pll のインスタンス
    clk_gen #(
        .CLK_PERIOD(278),    // 27.8nsec, 約36MHz
        .CLK_DUTY_CYCLE(0.5),
        .CLK_OFFSET(0),
        .START_STATE(1'b0)
    ) pclk_from_pll_i (
        .clk_out(pclk_from_pll)
    );
    
    // s2mm_prmry_reset のインスタンス
    reset_gen #(
        .RESET_STATE(1'b1),
        .RESET_TIME(1000)    // 100nsec
    ) RESETi (
        .reset_out(s2mm_prmry_reset)
    );
    
    // MT9D111 モデル
    mt9d111_model #(
        .HORIZONTAL_PIXELS(800),
        .VERTICAL_LINES(600),
        .HBLANK_REG(174),
        .VBLANK_REG(16),
        .PCLK_DELAY(1)
    ) mt9d111_model_i (
        .xck(xck),
        .pclk(pclk),
        .href(href),
        .vsync(vsync),
        .d(cam_data),
        .scl(1'b1),
        .sda(),
        .standby(standby)
    );

    // Instantiate the Unit Under Test (UUT_slave)
    axi4s_slave_bfm #(
        .C_M_AXIS_DATA_WIDTH(24),
        .TREADY_RANDOM_WAIT(1) // m_axis_treadyにランダムなWaitを発生させる=1, Waitしない=0
    ) uut_slave (
        .ACLK(s2mm_aclk), 
        .ARESETN(~s2mm_prmry_reset), 
        .m_axis_tdata(m_axis_tdata), 
        .m_axis_tstrb(m_axis_tstrb), 
        .m_axis_tvalid(m_axis_tvalid), 
        .m_axis_tready(m_axis_tready), 
        .m_axis_tlast(m_axis_tlast)
    );
      
endmodule

module clk_gen #(
    parameter         CLK_PERIOD = 100,
    parameter real    CLK_DUTY_CYCLE = 0.5,
    parameter        CLK_OFFSET = 0,
    parameter        START_STATE    = 1'b0 )
(
    output    reg        clk_out
);
    begin
        initial begin
            #CLK_OFFSET;
            forever
            begin
                clk_out = START_STATE;
                #(CLK_PERIOD-(CLK_PERIOD*CLK_DUTY_CYCLE)) clk_out = ~START_STATE;
                #(CLK_PERIOD*CLK_DUTY_CYCLE);
            end
        end
    end
endmodule

module reset_gen #(
    parameter    RESET_STATE = 1'b1,
    parameter    RESET_TIME = 100 )
(
    output    reg        reset_out
);
    begin
        initial begin
            reset_out = RESET_STATE;
            #RESET_TIME;
            reset_out = ~RESET_STATE;
        end
    end
endmodule

`default_nettype wire


  1. 2013年06月02日 04:29 |
  2. AXI4-Stream IPの作製
  3. | トラックバック:0
  4. | コメント:0
»