21

RAM の書き込みに適したコードはどれですか?

  1. ブロックdata_out内の割り当て:always

    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. ステートメントをdata_out使用して割り当て:assign

    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
    

推奨事項はありますか?

4

4 に答える 4

12

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

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

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

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

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

于 2011-10-03T13:05:33.087 に答える
8

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

于 2011-10-05T12:27:14.200 に答える
-2

2 番目のプログラムでは、値を「Reg」に「代入」できないため、コンパイル エラーが発生します。次のようなエラーが表示されます

于 2014-09-29T21:51:40.380 に答える