实验内容:测试IP核的RAM
软件版本:vivado 2019.2
顶层模块实例化RAM,通过ram_rdata输出读出来的数据,ram_en(RAM使能,高电平有效)、ram_we(RAM读写片选)、ram_addr(RAM地址)、ram_wdata(要写入的数据)由RAM的写模块提供
`timescale 1ns / 1ps
//
//
// Engineer: mankaichuang
// Create Date: 2020/11/30 11:34:31
// Module Name: ip_ram
// Description: IP核的RAM读写实验
//
//
module ip_ram(
input sys_clk,
input sys_rst_n
);
wire ram_en; //使能
wire ram_we; //读写片选
wire [4:0] ram_addr; //地址
wire [7:0] ram_wdata; //写数据
wire [7:0] ram_rdata; //读数据
ram_rw u_ram_rw(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.ram_en (ram_en),
.ram_we (ram_we),
.ram_addr (ram_addr),
.ram_wdata (ram_wdata)
);
blk_mem_gen_0 ip_ram_instance(
.clka(sys_clk), // input wire clka
.ena(ram_en), // input wire ena
.wea(ram_we), // input wire [0 : 0] wea
.addra(ram_addr), // input wire [4 : 0] addra
.dina(ram_wdata), // input wire [7 : 0] dina
.douta(ram_rdata) // output wire [7 : 0] douta
);
endmodule
RAM的写模块:
`timescale 1ns / 1ps
//
//
// Engineer: mankaichuang
// Create Date: 2020/11/30 11:35:21
// Module Name: ram_rw
// Description: ram数据读写操作
//
//
module ram_rw(
input sys_clk,
input sys_rst_n,
output ram_en, //使能
output ram_we, //读写片选
output reg[4:0] ram_addr, //地址
output reg[7:0] ram_wdata //要写入的数据
);
reg[5:0] rw_cnt;
assign ram_en = sys_rst_n;
assign ram_we = (rw_cnt <= 6'd31) ? 1'b1 : 1'b0;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
rw_cnt <= 6'b0;
else if(rw_cnt == 6'd63)
rw_cnt <= 6'b0;
else
rw_cnt <= rw_cnt + 6'b1;
end
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
ram_addr <= 5'b0;
else if(ram_addr == 5'd31)
ram_addr <= 5'b0;
else
ram_addr <= ram_addr + 5'b1;
end
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
ram_wdata <= 8'b0;
else if(rw_cnt < 5'd31)
ram_wdata <= ram_wdata + 8'b1;
else
ram_wdata <= 8'b0;
end
endmodule
仿真代码:
`timescale 1ns / 1ps
//
//
// Engineer: mankaichuang
// Create Date: 2020/11/30 15:58:39
// Module Name: tb_ip_ram
// Description:
//
//
module tb_ip_ram();
reg sys_clk;
reg sys_rst_n;
always #10 sys_clk = ~sys_clk;
initial begin
sys_clk = 1'b0;
sys_rst_n = 1'b0;
#20 sys_rst_n = 1'b1;
end
ip_ram tb_ip_ram(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n)
);
endmodule
仿真结果: