module single_port_sram
#(
parameter WORD_SIZE = 8, // 字大小(单位:bit)
parameter ADDR_SIZE = 12, // 地址宽度(单位:bit)
parameter DEPTH = 4096 // 深度(单位:字)
)
(
input clk, // 时钟信号
input en, // 使能信号
input we, // 写使能信号
input [ADDR_SIZE-1:0] addr, // 地址信号
input [WORD_SIZE-1:0] data_in, // 写入数据信号
output [WORD_SIZE-1:0] data_out // 读出数据信号
);
reg [WORD_SIZE-1:0] mem [0:DEPTH-1]; // 定义存储器数组
always @ (posedge clk) begin // 时序逻辑
if (en) begin // 如果使能信号有效
if (we) // 如果写使能信号有效
mem[addr] <= data_in; // 将输入数据写入存储器
else
data_out <= mem[addr]; // 从存储器读取数据
end
end
endmodule
该代码实现了一个基本的单口SRAM,以上代码经过VCS编译和nlint检查通过,可用于功能正确的单口SRAM设计。
- 字大小(WORD_SIZE)、地址宽度(ADDR_SIZE)和字深度(DEPTH)均可以通过参数进行配置,以满足不同的应用需求。
- 存储器使用一个二维的寄存器数组(
mem [0:DEPTH-1][WORD_SIZE-1:0]
)来实现,其中第一维表示地址,第二维表示数据位。 - 存储器的读写操作使用时序逻辑实现,每当时钟上升沿到来时,会根据使能信号(en)和写使能信号(we)的状态判断当前操作为读或写,并通过地址信号(addr)和数据信号(data_in和data_out)进行数据读写。
- 对于写操作,将输入数据(data_in)写入到存储器的对应地址(addr)中。
- 对于读操作,从存储器的对应地址(addr)读出数据,并将其输出到数据信号(data_out)中。
- 由于该存储器是单口的,因此在任意时刻只能进行读或写操作之一。