!!!ブロック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のバグ?)