トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

ram.v

メモリ(ブロック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の全要素に対して行う必要あり.そのためfor文を用いて,あらかじめ全要素に0を代入している.全要素に値を代入しないと,初期化が無視されてしまう.(限りなくバグに近い仕様)

最終更新時間:2009年01月28日 08時58分38秒