RAMの作成に適したコードはどれですか?
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
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
何かお勧めはありますか?
それはあなたの要件に依存します。
これにより、メモリ出力が登録されます。これをゲートに合成する場合、ケース2よりも16個多くのフリップフロップがあります。つまり、使用する領域が少し多くなります。これは、出力の伝搬遅延がケース2よりもクロックに比べて少ないことも意味します。さらに、出力データは次のクロックサイクルまで利用できません。
出力データは、クロックに比べて伝搬遅延が長くなりますが、書き込まれたのと同じクロックサイクル内で使用できます。
要件に基づいてどちらを使用するかを決定する必要があります。
3番目のオプションは、ハードマクロである生成されたRAMを使用することです。これには、ケース1と2の両方に比べて、面積、電力、場合によってはタイミングの利点があります。
ツールの答えに追加する-非同期読み取りメソッド(ケース2)を使用する場合、すべてのRAMブロックのように、FPGAのRAMブロックにマップされません。私が知っている主要なアーキテクチャには、同期読み取りがあります。
必要なパイプラインのタイプに応じて、両方の形式が有効です。ザイリンクスのRAMコーディングガイドラインに従うことを常にお勧めします。これは、コードが適切なFGPAコンストラクトに合成されるようにするための良い方法です。
たとえば、例1は同期読み取りであるためザイリンクスBRAM(つまり、専用ブロックRAM)に合成され、例2は(非同期読み取りであるため)ザイリンクス分散RAMに合成されます。
ザイリンクスドキュメントUG901(Vivado Design Suiteユーザーガイド)のRAM HDLコーディングテクニックセクション)のコーディングガイドラインを参照してください。また、RAMの同期読み取りと非同期読み取りの違いについても詳しく説明しています。 。
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として扱っています。