« MITOUJTAG Pro. 2.0.4リリースします | トップページ | INTESTを使ってFPGAをステップ実行させる »

2008.12.01

VerilogでBLOGANAを使う

MITOUJTAGのユーザ様からVerilogでもBLOGANAを使いたいとのご要望があったので、今日はVerilogの勉強をしました。

「入門 Verilog HDL記述 CQ出版社 小林優 著」という本を買って読みました。
FPGAの設計をするにあたって、
 process ⇔ always、 代入文 ⇔ assign文、  & ⇔ { }
のように、VHDLとだいたい1対1に対応するので、頭の中ではVHDLで書きながら、逐次翻訳していく感じで書いていけばよさそうだということがわかりました。

VHDLよりもVerilogのほうが楽な点として、
 ・enrtityとarchitectureを分けなくて良い
 ・変数宣言と記述の本文との間の境目(begin)がない
   しかも、wireやregの宣言を好きなところに書ける
 ・条件判断の結果がそのまま1bitの信号になる
 ・代入でビットの幅が合わなければ勝手に切り捨てられる
というところが衝撃的でした。
型やビット幅のチェックがVHDLほど厳密ではないようです。

さて、現在のBLOGANAのモジュールはVHDLで記述されていますが、これをVerilogに書き直そうかと思ったのですが、ISE9.1iではVHDLで作った下位モジュールを上位のVerilogのモジュールから呼び出せるようでした。

つまり、



entity blogana is

 Port ( CLK : in std_logic;
  TRIG : in std_logic;

  USER_OP : out std_logic_vector(19 downto 0);

  SAMPLE_EN : in std_logic;

  DIN : in std_logic_vector(71 downto 0);

  SAMP_FREQ : in integer range 0 to 2147483647;

  WIDTH72 : in std_logic;

  LENGTH1024 : in std_logic;

  BUSY : out std_logic

);

end blogana;


のようにVHDLで宣言したモジュールが、


・・・
assign blogana_trig = trig;

assign blogana_din[31 : 0] = lfsr[31 : 0];

assign blogana_din[32] = blogana_trig;

assign blogana_din[40 : 33] = counter[7 : 0];

assign vcc = 1;

wire [19:0] blogana_user;

blogana blogana_1( .CLK(clk) ,

 .TRIG(blogana_trig) ,

 .DIN(blogana_din) ,

 .USER_OP(blogana_user) ,

 .SAMPLE_EN(vcc) ,

 .SAMP_FREQ(50000000) ,

 .WIDTH72(vcc) ,

 .LENGTH1024(vcc) ,

 .BUSY(blogana_busy));



assign blogana_busy_op = blogana_busy;

・・・


と、Verilogからそのまま呼び出せました。

出来上がったFPGAをBLOGANAでサンプリングしてみると、ちゃんと見れました。
この波形は、50MHzで動作する32ビットのLFSRがあって、その下位6ビットが6b'000000ならばトリガがかかり、バイナリカウンタがカウントアップするという、簡単なサンプルです。

Blogana

ただし、MITOUJTAGに内蔵されたHDLソース解析ツールはVHDLしか解析してくれないので、Verilogで書かれたソースの場合は信号名を自動は設定することができません。
(上の図で信号名が(undefined)になっていますが、VHDLならば自動的にソースを解析して、lfsr[31 : 0]や、trigといった名前が設定されます)
これは今後の課題にしたいと思います。

|

« MITOUJTAG Pro. 2.0.4リリースします | トップページ | INTESTを使ってFPGAをステップ実行させる »

コメント

コメントを書く



(ウェブ上には掲載しません)




« MITOUJTAG Pro. 2.0.4リリースします | トップページ | INTESTを使ってFPGAをステップ実行させる »