ブロックRAM
ブロックRAM(デュアルポート)
同期読み見出し同期書き込みのデュアルポートメモリ
論理合成結果,ブロックRAMとして実装される.
読み出し優先(read-first)
書き込み前の値が読み出される.
module dpram(clk, load1, load2, addr1, addr2, d1, d2, q1, q2); parameter DWIDTH=16,AWIDTH=12,WORDS=4096; input clk,load1,load2; input [AWIDTH-1:0] addr1,addr2; input [DWIDTH-1:0] d1,d2; output [DWIDTH-1:0] q1,q2; reg [DWIDTH-1:0] q1,q2; reg [DWIDTH-1:0] mem [WORDS-1:0]; always @(posedge clk) begin if(load1) mem[addr1] <= d1; q1 <= mem[addr1]; end always @(posedge clk) begin if(load2) mem[addr2] <= d2; q2 <= mem[addr2]; end endmodule
書き込み優先(write-first)
書き込み後の値が読み出される.
module dpram(clk, load1, load2, addr1, addr2, d1, d2, q1, q2); parameter DWIDTH=16,AWIDTH=12,WORDS=4096; input clk,load1,load2; input [AWIDTH-1:0] addr1,addr2; input [DWIDTH-1:0] d1,d2; output [DWIDTH-1:0] q1,q2; reg [AWIDTH-1:0] ad1,ad2; reg [DWIDTH-1:0] mem [WORDS-1:0]; always @(posedge clk) begin if(load1) mem[addr1] <= d1; ad1 <= addr1; end always @(posedge clk) begin if(load2) mem[addr2] <= d2; ad2 <= addr2; end assign q1 = mem[ad1]; assign q2 = mem[ad2]; endmodule
- 注1
- 記述をわずかに変更しても,論理合成ツール(XST)がブロックRAMとして実装できると判定しないことがあるので,注意が必要.たとえば,2つのalways文を1つのalways文にまとめることができるが,XSTは分散RAMとして実装してしまう.
- 注2
- メモリの初期化はram.v(シングルポートメモリ)と同様に行うことができる.ただし,write-firstの場合は正しく論理合成できない.(XSTのバグ?)
- 注3
- read-firstで記述しても,論理合成結果はwrite-firstになってしまうことがある.(XSTのバグ?)
最終更新時間:2008年05月25日 21時11分43秒