- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!デュアルポートメモリ(ブロックRAM)
同期書き込み同期読み出しのデュアルポートメモリ.
ポート1は読み書き可.ポート2は読み出しのみ可
論理合成により,FPGAのブロックRAMに変換される.
同時書き込みは読み出し優先.(同じ番地に読み出しと書き込みを同時に行うと,読み出しが先に行われる.)
同時書き込みは読み出し優先(read-first).(同じ番地に読み出しと書き込みを同時に行うと,読み出しが先に行われる.)
!!パラメータ
,パラメータ名,既定値,
,DWIDTH,16,データのビット幅
,AWIDTH,12,アドレスのビット幅
,WORDS,4096,ワード数(=2^AWIDTH)
!!入出力ポート
, ,ポート名,ビット数,
,入力,clk,グローバルクロック
,入力,load1,1,ポート1の書き込み許可(1のときclkの立ち上がりでaddr1番地にd1を書き込む)
,入力,load2,1,ポート2の書き込み許可(1のときclkの立ち上がりでaddr2番地にd2を書き込む)
,入力,addr1,AWIDTH,ポート1のアドレス指定
,入力,addr2,AWIDTH,ポート2アドレス指定
,入力,d1,DWIDTH,ポート1のデータ指定
,入力,d2,DWIDTH,ポート1のデータ指定
,出力,q1,DWIDTH,addr1番地のデータ
,出力,q2,DWIDTH,addr2番地のデータ
!!ソースコード
module dpram(clk, load1, addr1, addr2, d1, 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
integer i;
initial begin
for(i=0;i<WORDS;i=i+1)
mem[i]=0; // ここにメモリの初期化(mem[12'h001]=16'h1234;など)を書く.
end
endmodule