web-dev-qa-db-ja.com

Verilogでa RAMをコーディングするより良い方法

RAMの作成に適したコードはどれですか?

  1. alwaysブロック内にdata_outを割り当てる:

    module memory(
        output reg [7:0] data_out,
        input [7:0] address,
        input [7:0] data_in, 
        input write_enable,
        input clk
    );
        reg [7:0] memory [0:255];
    
        always @(posedge clk) begin
            if (write_enable) begin
                memory[address] <= data_in;
            end
            data_out <= memory[address];
        end
    
    endmodule
    
  2. assignステートメントを使用してdata_outを割り当てる:

    module memory(
        output [7:0] data_out,
        input [7:0] address,
        input [7:0] data_in, 
        input write_enable,
        input clk
    );
        reg [7:0] memory [0:255];
    
        always @(posedge clk) begin
            if (write_enable) begin
                memory[address] <= data_in;
            end
        end
    
        assign data_out = memory[address];
    
    endmodule
    

何かお勧めはありますか?

17
e19293001

それはあなたの要件に依存します。

  1. これにより、メモリ出力が登録されます。これをゲートに合成する場合、ケース2よりも16個多くのフリップフロップがあります。つまり、使用する領域が少し多くなります。これは、出力の伝搬遅延がケース2よりもクロックに比べて少ないことも意味します。さらに、出力データは次のクロックサイクルまで利用できません。

  2. 出力データは、クロックに比べて伝搬遅延が長くなりますが、書き込まれたのと同じクロックサイクル内で使用できます。

要件に基づいてどちらを使用するかを決定する必要があります。

3番目のオプションは、ハードマクロである生成されたRAMを使用することです。これには、ケース1と2の両方に比べて、面積、電力、場合によってはタイミングの利点があります。

9
toolic

ツールの答えに追加する-非同期読み取りメソッド(ケース2)を使用する場合、すべてのRAMブロックのように、FPGAのRAMブロックにマップされません。私が知っている主要なアーキテクチャには、同期読み取りがあります。

7
Martin Thompson

必要なパイプラインのタイプに応じて、両方の形式が有効です。ザイリンクスのRAMコーディングガイドラインに従うことを常にお勧めします。これは、コードが適切なFGPAコンストラクトに合成されるようにするための良い方法です。

たとえば、例1は同期読み取りであるためザイリンクスBRAM(つまり、専用ブロックRAM)に合成され、例2は(非同期読み取りであるため)ザイリンクス分散RAMに合成されます。

ザイリンクスドキュメントUG901(Vivado Design Suiteユーザーガイド)のRAM HDLコーディングテクニックセクション)のコーディングガイドラインを参照してください。また、RAMの同期読み取りと非同期読み取りの違いについても詳しく説明しています。 。

1
John Wallner

module mem_try(clk、// ramを同期アドレスにするための制御信号、//データをフェッチする必要のあるアドレスdata_in、//入力データrd、wr、//制御信号を高で書き込み、//低で読み取る; // rst 、//入力制御信号// rd_count、// wr_count、data_out //データ読み出し);

  parameter addr_length=32,data_width=32,ram_depth= 1 << addr_length;
  input [data_width-1:0]data_in;
  input clk,rd,wr;
  input [addr_length-1:0]addr;
  output reg [data_width-1:0]data_out;
  reg[data_width-1:0]ram[ram_depth-1:0];//ram variable decalaration 
  assign write_only =wr&~rd ;
  assign read_only =~wr&rd ;

  always@(posedge clk) begin

  if(write_only) begin
     ram[addr]<=data_in;
  end


  if(read_only) begin    
    data_out<=ram[addr];
  end

  end         

エンドモジュール

私はこのコードを32x32RAM用に作成し、ブロックRAMがデザインで推測されることを期待していましたが、vivadoはそれを分散RAMとして扱っています。

0