トップ 一覧 検索 ヘルプ RSS ログイン

ブロックRAMの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!ブロックRAM(デュアルポート)
同期読み見出し同期書き込みのデュアルポートメモリ
論理合成結果,ブロックRAMとして実装される.

!!読み出し優先(read-first)
書き込み前の値が読み出される.

 module dpram(clk, load1, load2, addr1, addr2, d1, d2, 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
 
 endmodule

!!書き込み優先(write-first)
書き込み後の値が読み出される.

 module dpram(clk, load1, load2, addr1, addr2, d1, d2, 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 [AWIDTH-1:0] ad1,ad2;
  reg [DWIDTH-1:0] mem [WORDS-1:0];
 
  always @(posedge clk)
    begin
      if(load1) mem[addr1] <= d1;
      ad1 <= addr1;
   end
 
  always @(posedge clk)
    begin
      if(load2) mem[addr2] <= d2;
      ad2 <= addr2;
   end
 
  assign q1 = mem[ad1];
  assign q2 = mem[ad2];
 
 endmodule

::注1
:::記述をわずかに変更しても,論理合成ツール(XST)がブロックRAMとして実装できると判定しないことがあるので,注意が必要.
:::たとえば,2つのalways文を1つのalways文にまとめることができるが,XSTは分散RAMとして実装してしまう.

::注2
:::メモリの初期化はram.v(シングルポートメモリ)と同様に行うことができる.
:::ただし,write-firstの場合は正しく論理合成できない.(XSTのバグ?)

::注3
:::read-firstで記述しても,論理合成結果はwrite-firstになってしまうことがある.(XSTのバグ?)