原创 Synplify类推Xilinx RAM

2012-5-25 09:17 1990 12 12 分类: FPGA/CPLD

如果类推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

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
12
关闭 站长推荐上一条 /3 下一条