- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!ブロック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のバグ?)