FIFOというのはFirst In First Outの事で
最初に入ってきたデータを最初に出しますよ
と言うIC(IP)です。
これはFPGAの中では割と簡単に構築する事ができます。
そして、データの取り出しも1クロックの遅延をきちんと意識すれば
それほど苦労する事なく行う事ができます
1.インプットの有効なデータがある時は同じタイミングでwen信号をHighにする
2.データの取り出しが準備できたらrenをHighにするとデータが出てくる
3.FIFOのデータが入ってるかどうかはusedwやFull/Emptyの信号で確認する
最初の頃はFIFOのメモリはとても小さいので嫌だったのですが
FIFOの役割は、データを蓄える事よりも、タイミングの吸収にありました
特に違うクロックドメインの間を繋ぐ時には、なくてはならないものです
さて、私が苦労した外部FIFOは、いろいろな特徴がありました
どういうことかと言うと、データを送ってくるデバイスはFPGAの外にあるので
書き込む信号はFPGA側が合わせてやる必要があります。
そして、書き込み信号は、データより2クロック早く指示してやる必要があり、最初の2クロックは書き込みに使われません。
今はなんと言う事もないですが、この条件はFPGAの初心者の私には過酷でした。
更に先にも書いた様に、200クロックのデータが書き込まれるまで、データの読み出しは、無効になります。
一つ一つ終わらせて行けばいいのですが、FIFO(メモリ)の厄介なところは、メモリを正しく書けて、正しく読めて初めて成立するので、取り出したデータが正しくない場合、何が悪かったかがわからない場合があります
開発が進んでくると、データが整ってくるので、だんだん楽になってきますが
一番最初は、泣きそうなほど訳がわかりませんでした。