Sim's blog

電子工作はじめてみました

diceを動かしてみました

2009-06-17 19:54:27 | FPGA
トラ技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文を使って非同期リセットを記述するには以下のように書きます。
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を見落とす原因になります。このあたりは何とかしてもらいたいものです。