FIFOの設計をしていたときに学んだことをまとめておきます。
(※FIFOとは、First In First Outの略で最初に来たものを最初に出力するということ、論理回路以外でも様々な場面で使われる言葉)
BRAMと分散RAMどっちを使うべきか…。設計当初は普通にBRAMを使うことを前提にして考えていました。しかし、BRAMのリソースが足りないことに気づき、急遽、分散RAMを用いてやり直すことになってしまった…
分散RAMにしたことで、レイテンシが変化し周辺回路もやり直しになってしまい、かなり大変でした。
今回は、BRAMと分散RAMの違いや、それぞれをRTL(verilog)で記述するとどうなるかをまとめていきたいと思います。
BRAM(ブロックラム)
基本的に4096bitのデュアルポートのRAMで、FPGAによってこのRAMが何個入っているか異なる。
分散RAM
LUTを使用して作られるRAMで、LUTのリソースがあれば好きなだけ生成可能。
ざっくり、それぞれの説明を書いたところで
下記にBRAMと分散RAMそれぞれをverilogで記載するときの例を示します。
BRAM
reg [9:0] mem [3:0];
always @(posedge CLK)
begin
if(en) mem[addr] <= d;
q <= mem[addr];
end
BRAMは、書き込みも読み込みも同期で動作する。分散RAMに比べて1クロック遅くなる
分散RAM
reg [9:0] mem [3:0];
always @(posedge CLK)
if(en) mem[addr] <= d;
assign q = mem[addr];
分散RAMは、書き込みは同期であるが、読み出しが非同期動作となる。アドレスで指定された値を常に出力されている。
コメント