#155. RAM

    ID: 155 Type: Default 1000ms 256MiB

RAM

题目描述

RAM全称为随机访问存储器,可以对其内部的单元进行读写访问,根据读写端口数量和类型,可以分为单端口(读写端口共用地址信号)、简单双端口(读写端口独立,可同时进行读写操作)、全双端口(有两套读写端口)等不同类型。

下图是三种不同RAM的接口信号对比,图中列出的都是基本接口信号,根据具体要求,还可以增加复位、读使能、字节使能等端口信号。

image

下例是一个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