ram的使用
1.使用ip核的步骤
在ipcatlog那里搜索memory选择blockmemory genderator
Dual Port ROM(双端口 ROM),这里选择 Single Port RAM,即配置成单端口 RAM。
2.然后是选择位宽跟深度
3.ip核就配置好了。然后写使用的步骤。
当ena为高的时候可以使用ip核,wea为高的时候开始写入数据,wea为低的时候读出数据。
地址是0-31.注意小于31的时候就要换了不能是等于要不然时序会差一点。
module ram_use(
input clk,
input rst_n,
output reg [7:0] wdata,
output [7:0]rdata,
output reg [4:0]addra,
output enram,
output wea
);
reg [6:0]cnt;
assign wea = (cnt<=6'd31&rst_n)?1'b1:1'b0;
assign enram = rst_n;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
cnt<=0;
else if(cnt<7'd63)
cnt<=cnt+1'b1;
else
cnt<=1'b0;
end
always @(posedge clk or negedge rst_n) begin
if(rst_n == 1'b0)
addra <= 1'b0;
else if(addra == 5'd31)//在计数器的 0-31 范围内,RAM 写地址累加
addra <= 1'b0;
else
addra <= addra + 1'b1;
end
always @(posedge clk or negedge rst_n) begin//自己写的往里面添加的数据
if(rst_n == 1'b0)
wdata <= 1'b0;
else if(cnt < 6'd31)
wdata <= wdata + 2'd2;
else
wdata <= 1'b0 ;
end
endmodule
顶层调用,又加了一个ila探针来看波形。ILA的使用就不写了
module ip_ram100t(
input clk,
input rst_n
);
wire [7:0] wdata;
wire [7:0] rdata;
wire [4:0] addr;
wire enram;
wire wea;
ram_use ram_use_u(
.clk (clk) ,
.rst_n(rst_n) ,
.wdata(wdata) ,
.rdata(rdata) ,
.addra(addr) ,
.enram(enram) ,
.wea (wea)
);
blk_mem_gen_0 your_instance_name (
.clka(clk), // input wire clka
.ena(enram), // input wire ena
.wea(wea), // input wire [0 : 0] wea
.addra(addr), // input wire [4 : 0] addra
.dina(wdata), // input wire [7 : 0] dina
.douta(rdata) // output wire [7 : 0] douta
);
ila_0 ILA_123 (
.clk(clk), // input wire clk
.probe0(rst_n), // input wire [0:0] probe0
.probe1(enram), // input wire [0:0] probe1
.probe2(wea), // input wire [0:0] probe2
.probe3(addr), // input wire [4:0] probe3
.probe4(wdata), // input wire [7:0] probe4
.probe5(rdata) // input wire [7:0] probe5
);
endmodule
ila时序图