組み込み機器・ハードウェアの設計開発から装置製作まで社内一貫対応!

組み込み機器・ハードウェア設計製作.com
組み込み機器・ハードウェア設計製作.com

produced by株式会社アイディアイ

設計のポイント

verilog記述のポイント:同期FIFOの設計

設計内容分類FPGA
解決できる課題CPU負荷低減

実現したい仕様・課題

同一クロック内でも、データの発生レートと消費レートが瞬間的に一致しないブロック間では、バッファとしてFIFOが必要になります。読み書きポインタの管理、フル/エンプティ判定、格納数の把握を、境界条件で誤りなく実装したいというのが課題です。

設計のポイント

同期FIFO(読み書きが同一クロックのFIFO)は、リングバッファ用メモリ、書き込みポインタ、読み出しポインタ、および格納数カウンタで構成するのが基本形です。深さを2のべき乗(2^N)にすると、ポインタはNビットカウンタの自然なラップアラウンドで巡回し、剰余計算が不要になります。フル/エンプティの判定は境界条件の誤りが最も出やすい箇所であり、格納数カウンタ(書き込みで+1、読み出しで-1、同時なら変化なし)を持たせて cnt==0 でエンプティ、cnt==DEPTH でフルと判定する方式が、単純で検証しやすく推奨できます。ポインタ比較だけで判定する方式(フルとエンプティの区別に1ビット拡張ポインタを使う)もありますが、いずれの方式でも「フル時の書き込み無視」「エンプティ時の読み出し無視」というガードをFIFO内部に備え、上位の使い方に依存せず壊れない設計とすることが重要です。メモリ部はブロックRAM推論パターン(同期書き込み・同期読み出し)に従えば、深いFIFOも効率よく実装できます。読み出しレイテンシ(読み出し要求から データ確定まで1クロック)を仕様として明確にし、必要ならFWFT(First-Word Fall-Through:先頭データを常に出力しておく方式)への変換段を設けます。almost_full等の閾値フラグを設けておくと、上流への早めのバックプレッシャーに使えます。

【コード例】
parameter DEPTH = 16; // 2のべき乗
reg [3:0] wp, rp;
reg [4:0] cnt; // 0〜16を表現
wire full = (cnt == DEPTH);
wire empty = (cnt == 0);
wire wr = we & ~full; wire rd = re & ~empty; // ガード
always @(posedge clk) begin
if (wr) begin mem[wp] <= din; wp <= wp + 4’d1; end
if (rd) begin dout <= mem[rp]; rp <= rp + 4’d1; end
cnt <= cnt + wr – rd;
end

verilog記述のポイント:同期FIFOの設計 | 組み込み機器・ハードウェア設計製作.com

補足情報

当事例のような、FPGA設計に関するポイントをまとめた冊子の無料DLが可能です。
是非以下よりご確認ください。

FPGA設計のポイント

>>ダウンロードはこちら!

設計のポイント 一覧

FPGA設計のポイント

お問い合わせ

組み込み機器・ハードウェア 設計製作.comを運営する株式会社アイディアイは、組み込み機器・ハードウェアの設計開発代行サービスを提供しています。
試験装置や制御機器、組み込みボードなど、設計・開発委託先をお探しの皆様、お気軽に当社に御相談ください。

技術資料のダウンロードはこちらから 技術資料ダウンロ―ド メールフォームでのお問い合わせはこちらから ご相談お問合せ