目的
1模拟实现一个宽度为32,深度为256的内存空间,先向内存空间写一批数据,再读出这批数据,并比较数据是否正确;
2完成ram的实现代码和tb_ram的仿真测试代码;
说明
提供输入: clk_i 时钟信号,100MHz;
rst_i 复位信号,高电平复位;
wr_en_i 写使能,表示data_io的数据有效;
rd_en_i 读使能,表示要求读出内存中的数据;
addr_i 地址信号表示要访问的数据所在地址;
要求 输出: data_io 当wr_en_i有效时,表示为写入到内存的数据;当rd_en_i有效时,表示要求读出在addr_i的内存数据;
实现
1 top模块
只需要定义好两个子模块之间的连线即可,不做过多描述。Verilog描述如下:
//tb_top
module tb_top;
wire clk;
wire rst;
wire wr_en;
wire rd_en;
wire[7:0] addr;
wire[31:0] data;
ram inst_ram(
.clk_i(clk),
.rst_i(rst),
.wr_en_i(wr_en),
.rd_en_i(rd_en),
.addr_i(addr),
.data_io(data)
);
tb_ram inst_tb_ram(
.clk_o(clk),
.rst_o(rst),
.wr_en_o(wr_en),
.rd_en_o(rd_en),
.addr_o(addr),
.data_io(data)
);
Endmodule
2 ram模块
使用双向口的话需要利用三态门进行输入输出的控制。使用条件操作符实现三态门的构造。在时钟上升沿,若写信号有效,则将当前地址线对应存储器的空间存入当前data_io上的数据;若读信号有效,则将地址线对应存储器空间的数据输出至data_io,读写无效时为高阻态。编写代码如下,部分说明包含在注释中:
//ram.v
module ram(
input clk_i,
input rst_i,
input wr_en_i,
input rd_en_i,
input [7:0] addr_i,
inout [31:0] data_io
);
reg [