- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!メモリ(ブロックRAM)
同期書き込み同期読み出しのメモリ.
論理合成により,FPGAの(シングルポート)ブロックRAMに変換される.
読み出し優先(read-first).
!!パラメータ
,パラメータ名,既定値,
,DWIDTH,16,データのビット幅
,AWIDTH,12,アドレスのビット幅
,WORDS,4096,ワード数(=2^AWIDTH)
!!入出力ポート
, ,ポート名,ビット数,
,入力,clk,グローバルクロック
,入力,load,1,1のときclkの立ち上がりでaddr番地にdを書き込む
,入力,addr,AWIDTH,アドレス指定
,入力,d,DWIDTH,データ指定
,出力,q,DWIDTH,addr番地のデータ
!!ソースコード
module ram(clk, load, addr, d, q);
parameter DWIDTH=16,AWIDTH=12,WORDS=4096;
input clk,load;
input [AWIDTH-1:0] addr;
input [DWIDTH-1:0] d;
output [DWIDTH-1:0] q;
reg [DWIDTH-1:0] q;
reg [DWIDTH-1:0] mem [WORDS-1:0];
always @(posedge clk)
begin
if(load) mem[addr] <= d;
q <= mem[addr];
end
integer i;
initial begin
for(i=0;i<WORDS;i=i+1)
mem[i]=0;
// ここにメモリの初期化(mem[12'h001]=16'h1234;など)を書く.
end
endmodule
::注1
:::意味を考えると,memの宣言は
::: reg [DWIDTH-1:0] mem [0:WORDS-1];
:::が正しいが,XSTでは正しく論理合成できない.
::注2
:::Verilog2001では,べき乗演算「**」が使えるので,WORDSの代わりに,
::: 2**AWIDTH
:::を用いることができる.
::注3
:::メモリの初期化をmemの全要素の行う必要あり.
:::メモリの初期化をmemの全要素に対して行う必要あり.
:::そのためfor文を用いて,あらかじめ全要素に0を代入している.
:::全要素に値を代入しないと,初期化が無視されてしまう.(限りなくバグに近い仕様)