同期書き込み同期読み出しのメモリ.
論理合成により,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の全要素に対して行う必要あり.そのためfor文を用いて,あらかじめ全要素に0を代入している.全要素に値を代入しないと,初期化が無視されてしまう.(限りなくバグに近い仕様)
最終更新時間:2009年01月28日 08時58分38秒