module bram3 (clka,clkb,ena,enb,wea,web,addra,dia,dib,doa,dob,rst);
input clka,clkb,ena,enb,wea,web,rst;
input [11:0] addra;
input [63:0] dia,dib;
output [63:0] dob, doa;
reg [32:0] ram [254:0];
reg [32:0] dob, doa;
reg [11:0] new_addr=0;
reg [11:0] number_of_lines=0;
always @(posedge clka)
begin
if (ena)
begin
if (wea) ram[addra] <= dia;
doa <= ram[addra];
end
end
always @(posedge clkb or negedge rst)
begin
if (!rst)
begin
new_addr<=0;
end
else if (enb)
begin
if (new_addr==0)
number_of_lines <= ram[0];
new_addr<=new_addr+1;
dob <= ram[new_addr];
if (new_addr==number_of_lines)
new_addr<=0;
end
end
endmodule
添加行
number_of_lines <= ram[0]
后,vivado将不会合成BRAM组件。相反,我得到了一个 LUT 方案。我知道我不能阅读超过 2 次。 (在我的代码中,我有 3 次读取),但我需要逻辑才能在我的代码中实现。我怎样才能重写逻辑来制作像照片中那样的可合成胸罩?
添加行
number_of_lines <= ram[0]
后,vivado将不会合成BRAM组件。相反,我得到了一个 LUT 方案。我知道我不能阅读超过 2 次。 (在我的代码中,我有 3 次读取),但我需要逻辑才能在我的代码中实现。我怎样才能重写逻辑来制作像照片中那样的可合成胸罩?
我为了对具有 N 个读取端口的 RAM 进行建模,对 RTL 进行编码,以便推断出 N 个 BRAM,并且所有 N 个 RAM 都获得相同的写入信号。使用 Vivado 将其识别为单个双端口 BRAM 的编码风格对读取侧 RAM 控制逻辑进行编码。根据需要使用 RTL 控制逻辑将 N 个读取路径合并为一个。
您可以有 N 个内存变量,但是有更好的方法来编码。将一个 BRAM 的逻辑放置在其自己的模块中,并在父模块中实例化该模块 N 次。不要将复位传递给内存模块,如果存在复位,Vivado 将不会推断 BRAM。这是一种更干净且不易出错的方法,为每个内存声明单独的变量。
这不是一种有效的方法(就 BRAM 利用率而言),因为相同的数据被冗余存储,但它在推断 BRAM 的同时提供了所需的 N 端口读取。