如果类推distributed RAM,要保证写操作同步,读操作异步。
如果类推block RAM,要保证写操作同步,读操作同步(寄存输出)或异步(寄存地址),存储空间至少2Kbit。
寄存输出的优点是,读写可使用不同时钟,支持enable、reset;而寄存地址不能。
对于single-port block RAM,要保证读写时钟、地址、使能分别相同。
可以使用syn_ramstyle属性。
单端口实例:
module ram_sp_infer #(
parameter DWIDTH = 8,
parameter AWIDTH = 8
)(
input clk,
input rst,
input en,
input wr,
input [DWIDTH-1:0] din,
input [AWIDTH-1:0] addr,
output reg [DWIDTH-1:0] dout
);
reg [DWIDTH-1:0] ram_reg [(2**AWIDTH-1):0];
always @(posedge clk)
if (en & wr)
ram_reg[addr] <= din;
always @(posedge clk)
if (en)
if (rst)
dout <= 0;
else
dout <= ram_reg[addr];
endmodule
双端口实例:
module ram_dp_infer #(
parameter DWIDTH = 8,
parameter AWIDTH = 8
)(
input clka,
input rsta,
input ena,
input wra,
input [DWIDTH-1:0] dina,
input [AWIDTH-1:0] addra,
output reg [DWIDTH-1:0] douta,
input clkb,
input rstb,
input enb,
input wrb,
input [DWIDTH-1:0] dinb,
input [AWIDTH-1:0] addrb,
output reg [DWIDTH-1:0] doutb
);
reg [DWIDTH-1:0] ram_reg [(2**AWIDTH-1):0];
always @(posedge clka)
if (ena & wra)
ram_reg[addra] <= dina;
always @(posedge clkb)
if (enb & wrb)
ram_reg[addrb] <= dinb;
always @(posedge clka)
if (ena)
if (rsta)
douta <= 0;
else
douta <= ram_reg[addra];
always @(posedge clkb)
if (enb)
if (rstb)
doutb <= 0;
else
doutb <= ram_reg[addrb];
endmodule
文章评论(0条评论)
登录后参与讨论