2011-10-03 16 views
17

RAM書き込みにはどのコードが優れていますか?VerilogでのRAMコーディングの改善方法

  1. alwaysブロック内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 
    

どれ勧告:

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 
  • assignステートメントを使用してdata_outを割り当てますか?

  • +4

    256のメモリ位置にアクセスするのに16アドレスビットは必要ありません。あなたは 'input [7:0] address;'を使うべきです。 – toolic

    答えて

    8

    要件によって異なります。

    1. これは、メモリ出力を登録します。これをゲートに合成すると、ケース2よりも16個のフリップフロップが増えます。つまり、もう少し面積を増やすことになります。また、出力がケース2よりもクロックに対する伝播遅延が少ないことを意味します。さらに、出力データは次のクロックサイクルまで使用できません。

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

    要件に応じて使用するものを決定する必要があります。

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

    5

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

    -1

    2番目のプログラムでは、 'Reg'に値を割り当てることができないため、コンパイルエラーが発生します。 それは言ってエラーになります:「登録が連続割り当ての左側では違法である」

    1

    をどちらの形式は、あなたがしたいパイプラインの種類に応じて、有効です。ザイリンクスのRAMコーディングガイドラインに従うことを常にお勧めします。コードが適切なFGPA構造に確実に合成されるようにするには良い方法です。

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

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

    関連する問題