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