トラ技2009年6月号の別冊付録「再確認 電子機器の開発ツール」にFPGAの部屋のmarseeさんが、FPGAの開発方法の解説記事を書かれています。そこで使われていたのがdiceというサイコロのサンプルです。VHDLのソースは、FPGAの部屋さんの「ISE11.1iのチュートリアル1(導入編)」という記事に貼り付けてあります。先日買ったLatticeXP2基板「比叡」で動かしてみました。
徒然日記さんがAlteraで動かしているので、Xilinx、Altera、Latticeと3社のFPGAで動作が確認されたことになります。
オリジナルのソースはSpartan-3スタータキット用です。違うところは、比叡には7セグLEDがないので普通のLEDにしてしまったところと、リセットの極性が逆(比叡はアクティブロー)なところ、クロックが比叡は32.768MHz(SP3の方は50MHz)なところです。
使用スライス数は35でした。
VHDLのprocess文を使って非同期リセットを記述するには以下のように書きます。
この例ではresetが1のときにリセット時動作をするのでアクティブハイです。比叡で動作させるには0のときに動作させたいのでifの判定をreset='0'に書き換えることになります。
ちなみにverilogで同じことをalways文を使って書くと次のようになります。
ついでに、VHDLの同期リセットです。
resetのif文がclkのif文の内部に入っているのでクロックに同期しています。またprocessのセンシティビティリストがclkのみになっています。このあたりは、慣用句というか、形で覚えておくとよさそうです。
verilogの同期リセットは次のようになります。
verilogでは、センシティビティリストが変わるだけです(posedge resetがなくなります)。
と、ここで気づいたのですが、diceのソースでは以下のような記述になっています。
私の知っている同期リセットとも非同期リセットとも違います。どのような動作をするんでしょうか?
まだVHDLは、よく分かりません。
6/20 追記 diceのソースの件は、センシティビティリストの書き忘れだったそうです。弘法も筆の誤りといったところでしょうか。marseeさんのフォローの記事「ISE11.1iのチュートリアル1(導入編)の訂正」、徒然日記さんのフォローの記事「非同期リセットと同期リセット」が出ています。ISE、Quartus、ispLEVER、どのツールもwarningは出ていた模様です。合成ツールはたいてい山のようにwarningを吐き出してくれるので、warningに不感症になりやすいです。あまりに多すぎて見る気になれなくなっちゃいます。これはこれで役に立たないというか、重要なwarningを見落とす原因になります。このあたりは何とかしてもらいたいものです。
徒然日記さんがAlteraで動かしているので、Xilinx、Altera、Latticeと3社のFPGAで動作が確認されたことになります。
オリジナルのソースはSpartan-3スタータキット用です。違うところは、比叡には7セグLEDがないので普通のLEDにしてしまったところと、リセットの極性が逆(比叡はアクティブロー)なところ、クロックが比叡は32.768MHz(SP3の方は50MHz)なところです。
使用スライス数は35でした。
VHDLのprocess文を使って非同期リセットを記述するには以下のように書きます。
process(clk, reset) begin if(reset = '1') then リセット時の動作 elsif(clk'event and clk = '1') then クロック立ち上がり時の動作 end if; end process
この例ではresetが1のときにリセット時動作をするのでアクティブハイです。比叡で動作させるには0のときに動作させたいのでifの判定をreset='0'に書き換えることになります。
ちなみにverilogで同じことをalways文を使って書くと次のようになります。
always @(posedge clk or posedge reset) if(reset) リセット時の動作 else クロック立ち上がり時の動作
ついでに、VHDLの同期リセットです。
process(clk) begin if(clk'event and clk = '1') then if(reset = '1') then リセット時の動作 else クロック立ち上がり時の動作 end if; end if; end process;
resetのif文がclkのif文の内部に入っているのでクロックに同期しています。またprocessのセンシティビティリストがclkのみになっています。このあたりは、慣用句というか、形で覚えておくとよさそうです。
verilogの同期リセットは次のようになります。
always @(posedge clk) if(reset) リセット時の動作 else クロック立ち上がり時の動作
verilogでは、センシティビティリストが変わるだけです(posedge resetがなくなります)。
と、ここで気づいたのですが、diceのソースでは以下のような記述になっています。
process(clk) begin if(reset = '1') then リセット時の動作 elsif(clk'event and clk = '1') then クロック立ち上がり時の動作 end if; end process;
私の知っている同期リセットとも非同期リセットとも違います。どのような動作をするんでしょうか?
まだVHDLは、よく分かりません。
6/20 追記 diceのソースの件は、センシティビティリストの書き忘れだったそうです。弘法も筆の誤りといったところでしょうか。marseeさんのフォローの記事「ISE11.1iのチュートリアル1(導入編)の訂正」、徒然日記さんのフォローの記事「非同期リセットと同期リセット」が出ています。ISE、Quartus、ispLEVER、どのツールもwarningは出ていた模様です。合成ツールはたいてい山のようにwarningを吐き出してくれるので、warningに不感症になりやすいです。あまりに多すぎて見る気になれなくなっちゃいます。これはこれで役に立たないというか、重要なwarningを見落とす原因になります。このあたりは何とかしてもらいたいものです。