2016年5月23日月曜日

FPGA学習で頭を抱える

ビールと棒々鶏とFPGA

トランジスタ技術2015年11号 p113に、16ビットのカウンタを2個使って32ビットのカウンタを構成する際の下位から上位へのキャリーの処理が以下のように記述されていまして。

CNT(15 downto 0) <= CNT(15 downto 0) + 1;
if (CNT(15 downto 0) = x"FFFE") then
  CARRY <= '1';
else
  CARRY <= '0';
end if;

これが"FFFF"との比較じゃなくて"FFFE"との比較で正しく動作する、というのがどうにも理解できなくて頭を抱えていました。記事には
・CNTとx”FFFE"を比較してCARRYを立てる回路
・CNTを+1する回路
は同時に実行されるので、これでうまく動くのです。
と説明されているのですが、少しデジタル回路をいじった経験からすれば、「下位のカウンタがFFFFから0000になるときにキャリーが1になるべき」で、いくらFPGAがソフトと違って同時に処理されるものだとしても、「今」の値がFFFFの時に「次」のキャリーの値が1になるんではないかなーという違和感が消えません。

そこで、いろいろキャリーの処理について調べてみました。結果、言語と構成は違いますが、以下の記事にこうなった原因と正しいやり方が出ていました。

触って学ぼう FPGA開発入門(6): 順序回路と組み合わせ回路を意識した記述を! (2/4)

トラ技の記事はキャリーの処理を順序回路の中に組み込んでしまったためにキャリー出力がラッチされてしまい、それを補うために1つ手前の値"FFFE"で比較してやらないといけない、ということのようです。

上の「触って学ぼう」の記事では回路図になっているので一目瞭然なのですが、トラ技の説明からはまったく理解できませんでした。というか「同時に処理されるので云々」というトラ技の説明は現象と結びつかない気がします。

いやー、ソフトウェアと違いますね。当たり前だけど。自慢じゃないけど、この落とし穴に何度も落ちる自信あります、私orz

0 件のコメント:

コメントを投稿