FC2カウンター FPGAの部屋 2006年03月01日
FC2ブログ

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

FPGAの部屋

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

私のFPGA、回路入力方法の履歴

初めにFPGA(その頃はアルテラだったのでCPLD)を使用したのは7,8年前なのだろうか?
アルテラのMAX+PULS2というツールでFLEX10K50等を使っていた。その頃は回路図入力が多く、AHDLというアルテラ独自のHDL言語も使用していた。
回路図は視覚性が高く便利なのだが、下位モジュールの入力、出力ポートを増やすとシンボルを作り直しなので、下位モジュールの配線をしてある状況ではシンボルの作り直しは大変だった。(入力、出力ポートの位置がずれてしまうことがあるためいちいち確認しなければいけない)
(QurtausのBDFだっけ?ブロック図として回路を書けるのには魅力を感じたがXilinxに移行してしまった後だった)
その後、全てAHDLに移行していった。AHDLではプリミティブやLPMというIPを使用した。これはいろいろなパラメータを入れることによって、いろいろな場面で使えるようした汎用のモジュールだった。
例えばLPM_DFFはDフリップフロップのLPMだが、DFFのビット幅、イネーブル信号を入れるかどうか、1への非同期クリア、0への非同期クリア、0への同期クリアなどのポートが使っても使わなくても良いようにしてあった。
しばらくこれでFPGAの回路を書いていたが、その頃のアルテラは小さい回路ならば早く動くが、FPGAのリソースを使い切るようになると、うちらのテクニックでは極端に遅くなるという現象があった。次のプロジェクトの時に、それでXilinxに乗り換えることにした。(現在はアルテラも魅力的だと思っている)
Xilinxに乗り換えるとAHDLが使えなくなり、VHDLかVerilog-HDLの2択しかないようだった。(いまさら回路図入力はいやだった)どちらを勉強するか迷ったが、その頃はFPGAの回路を書くのにVHDLの人口比率のほうが多いという資料を見てVHDLに決めて勉強することにした。
VHDLをどうやって書いていけば良いかわからなかったので、本を買って勉強したが良くわからなかった。とりあえずAHDLと同様にLPMがあれば書きやすい。というかそのほかの書き方を知らずにLPMと同様のものをVHDLで書こうと思った。(MAX+PULS2でもVHDLで書くことが出来てLPMを使うことが出来た。でも当然ながらソースは無い)
昔はedif.orgというサイトがあって、そこにアルテラのLPMのVHDLソースがあったので、それを参考にLPMの一部を自分で書いてみた。
初期のVHDLの書き方はそのLPMもどきを使って書いていくスタイルだった。
そのうちに、この書き方は効率が悪いことに気が付いた。DFFなどVHDL数行で書く事が出来た。しかも普通に書いたほうが可読性も良い。カウンタなども同じだ。
それでLPMを使うのを止めることになった。今では自分だけのライブラリなども作らずに、以前作ったソースを参考にしながら書き直している。それが一番私にあっているようだ。だから以前書いたVHDLソースは大切ということだ。考え方、その時に調べて使ったVHDL書式が詰まっている。
VHDLも書きなれて便利に使ってるが、世の中はSystemVerilogに行くとすると、これからサポートが減ってくる可能性もあるので勉強することにした。特にテストベンチはVerilog-HDLでもVHDLより書きやすいようだ。
しかし、論理合成用のVHDLをVerilog-HDLにしていると、いろいろ出来ないことがある。Verilog2001フルサポートならばいいのだろうが一部サポートとかになると不便なこともある。
今の所、テストベンチだけSystemVerilogにしたいと思っている。(まだ余り勉強していないが。。。)


上の説明。
LPMもどき(dffena)で書くと8ビット幅イネーブル付きのDFFはこうなる

tbuf : dffena generic map(width=>8)
port map(clk=>clk, aclr=>reset, enable=>tbuf_ena, data=>td, q=>tbuf_q);


これよりは直接VHDLで

process(clk, reset) begin
 if reset='1' then
  tbuf_q <= (others => '0');
 elsif clk'event and clk='1' then
  if tbuf_ena='1' then
   tbuf_q <= td;
  end if;
 end if;
end process;


と書いたほうがわかりやすいと思っている。
  1. 2006年03月01日 06:05 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0