Enable Port Type;使能端口类型。有两种可选,分别为 Use ENA pin(添加使能端口 A 的信号)和 Always Enabled(取消使能信号,端口 A 一直处于使能状态)。 (2)“Port A Optional Output Register”:用于为 RAM 的输出端添加寄存器,Port A 不支持。 (3)“Port A Output Reset Options”:用于配置端口的复位信号。,Port A 不支持 (4)“READ Address Change A”:用于更改端口的读地址,这个功能只在 UltraScale 设备上使用。
“Port B Options”选项卡,Port B 只支持读操作。 (1)“Memory Size(内存大小)”:用于指定端口宽度和深度、运行模式和使能端口类型。
Port B Width;数据位宽,其位宽设置必须与 Port A 数据位宽存在倍数关系,通常情况下保持一致。
Port B Depth;深度,当 Port B 数据位宽、Port A 数据位宽和深度的值确定后,Port B 深度的值就会自动确定。
Operating Mode;RAM 运作模式,Port B 不可配置。
Enable Port Type;使能端口类型。有两种可选,分别为 Use ENA pin(添加使能端口 A 的信号)和 Always Enabled(取消使能信号,端口 B 一直处于使能状态)。 (2)“Port B Optional Output Register”:用于为 RAM 的输出端添加寄存器。其作用是提高 BRAM 的运行频率和改善时序,当然为此付出的代价就是每勾选一个寄存器,输出就会延迟一拍。
在伪双口 RAM IP读写代码先例化一个伪双口 RAM IP核,在复位完成后开始通过 Port A 周期写入数据,当第一次写入到一半时启动 Port B 进行周期读数据,波形图如下:
module ram_ip_rw(
input sys_clk,
input sys_rst_n
);//端口 A 时钟
wire clka;//端口 A 使能,高电平使能
reg ena;//端口 A 写使能,高电平写入
reg wea;//端口 A 地址
reg [5:0]addra;//写入端口 A 的数据
wire [7:0]dina;//端口 B 时钟
wire clkb;//端口 B 使能,高电平使能
reg enb;//端口 B 地址
reg [5:0]addrb;//端口 B 读出的数据
wire [7:0]doutb;//端口 A 时钟
assign clka = sys_clk;//端口 A 使能
always @(posedge sys_clk) begin
if(!sys_rst_n)
ena <=0;else
ena <=1;
end
//端口 A 写使能
always @(posedge sys_clk) begin
if(!sys_rst_n)
wea <=0;else
wea <=1;
end
//端口 A 地址,0~63
always @(posedge sys_clk) begin
if(!sys_rst_n)
addra <=0;elseif((addra <63)&&(wea ==1))
addra <= addra +1;else
addra <=0;
end
//端口 A 写入数据,从地址0~63依次写入如0~63
assign dina =(wea ==1)? addra :0;//端口 B 时钟
assign clkb = sys_clk;//端口 B 使能
always @(posedge sys_clk) begin
if(!sys_rst_n)
enb <=0;elseif(addra ==31)
enb <=1;
end
//端口 B 地址,0~63
always @(posedge sys_clk) begin
if(!sys_rst_n)
addrb <=0;elseif((addrb <63)&&(enb ==1))
addrb <= addrb +1;else
addrb <=0;
end
//例化伪双口RAM IP核
blk_mem_gen_0 u_blk_mem_gen_0_inst0(.clka(clka),.ena(ena),.wea(wea),.addra(addra),.dina(dina),.clkb(clkb),.enb(enb),.addrb(addrb),.doutb(doutb));
endmodule