不用MegaWizard实现单口RAM的Verilog语句和注意事项
0赞Verilog语句如下:
module ram(q, a, d, we, clk);
output reg [7:0] q;
input [7:0] d;
input [6:0] a;
input we, clk;
reg [6:0] read_add;
reg [7:0] mem [127:0];
always @(posedge clk) begin
if (we)
mem[a] <= d;
read_add <= a;
end
assign q = mem[read_add];
endmodule
其中 reg [7:0] mem [127:0]; 为内存建模,[7:0]为内存宽度,[127:0]为内存的深度
mem[a] <= d;向内存单元写入数据
assign q = mem[read_add]; 为读出内存单元数据
注意事项:
在下面语句中不能用复位
always @(posedge clk) begin
if (we)
mem[a] <= d;
read_add <= a;
end
用了复位情况,如
always @(posedge clk or negedge rst) begin
if(!rst)
mem[a] <= 0;
else if (we) begin
mem[a] <= d;
read_add <= a;
end
end
则不能综合到FPGA期间中的RAM单元,而是直接用LE和寄存器代替
因为RAM单元结构不带复位功能
这样做会造成占用大量的寄存器资源,所以要避免
