#155. RAM
RAM
题目描述
RAM全称为随机访问存储器,可以对其内部的单元进行读写访问,根据读写端口数量和类型,可以分为单端口(读写端口共用地址信号)、简单双端口(读写端口独立,可同时进行读写操作)、全双端口(有两套读写端口)等不同类型。
下图是三种不同RAM的接口信号对比,图中列出的都是基本接口信号,根据具体要求,还可以增加复位、读使能、字节使能等端口信号。
下例是一个4*8bit的单端口RAM的实例,采用外部文件进行初始化
module ram_one_port(
input clk,
input [1:0] addr,
input wr_en,
input [7:0] wr_data,
output [7:0] rd_data);
reg [7:0] mem[3:0];
initial
begin
$readmemh("memfile.dat",mem);
end
assign rd_data = mem[addr];
always@(posedge clk)
begin
if(wr_en)
mem[addr] <= wr_data;
end
endmodule
上例中使用系统函数$readmemh,该函数可以将文件中的数据初始化到存储器数组中,memfile.dat为RAM的初始化文件,内容如下(16进制格式,可以使用文本工具编辑):
0123
4567
7654
3210
试根据上述示例,设计一个8*16bit的简单双端口RAM,并使用memfile.dat文件对其初始化,在本例中,该文件已在后台提供,用户可直接使用。
代码模板:
module ram_one_port(
input clk,
input wr_en,
input [2:0] wr_addr,
input [15:0] wr_data,
input [2:0] rd_addr,
output [15:0] rd_data);
endmodule
输入格式
时钟信号clk 使能信号wr_en 3位宽写地址wr_addr 16位宽写数据wr_data 3位宽读地址rd_addr
输出格式
16位宽读数据rd_data
示例代码
module ram_one_port(
input clk,
input wr_en,
input [2:0] wr_addr,
input [15:0] wr_data,
input [2:0] rd_addr,
output [15:0] rd_data);
endmodule