Verilog实现RAM(4-单端口异步读写SRAM)
程序员文章站
2022-04-01 16:38:43
...
在之前的工作中,我们对常见存储器件进行了名词扫盲,并通过调用IP核实现了简单的单端口同步读写SRAM、对单端口同步读写SRAM进行了Verilog描述、并进一步对单端口同步写,异步读SRAM进行了设计与分析;这部分工作见:
Verilog实现RAM(3-单端口同步写、异步读SRAM)
现在在之前工作的基础上,进一步实现单端口异步读写SRAM
一、原理
单端口异步读写SRAM
输入端口有:(异步读写与时钟无关,没有clk)
reg [3:0]a;//输入地址(RAM深度为16,对应地址位宽为4)
reg we;// write enable,写使能时进行RAM写操作
reg oe;// output enable,输出使能时RAM读取的结果才能输出
reg cs;// 片选信号,选择读取哪一个RAM
输入输出端口有:
wire [7:0]d;//读取RAM时数据输出/写入RAM时数据输入
工作过程:
写异步,与时钟无关,判断cs/we/oe的值执行写操作:cs有效(为1)、we为1时,写使能,将d输入数据写入a对应地址处;
读异步,与时钟无关,直接判断cs/we/oe的值执行读操作:cs有效(为1)、we为0时,oe有效(为1)时读使能,将a地址处的数据读出到d上;
二、代码实现:
接着之前的工作,对单端口异步读写SRAM进行Verilog描述----实现一个位宽8bit,深度16bit的单端口SRAM;只需在之前的基础上修改读写逻辑与时钟无关即可;
verilog描述如下:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: CLL
//
// Create Date: 2020/02/24 11:49:17
// Design Name:
// Module Name: sram_sp_araw
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module sram_sp_araw
#(parameter DW = 8,AW = 4)
(
input [AW-1:0]a,//address
input cs,// chip select
input oe,// output enable
input we,// write enable
inout [DW-1:0]d// data
);
//
parameter DP = 1 << AW;// depth
reg [DW-1:0]mem[0:DP-1];
reg [DW-1:0]reg_d;
//initialization
// synopsys_translate_off
integer i;
initial begin
for(i=0; i < DP; i = i + 1) begin
mem[i] = 8'h00;
end
end
// synopsys_translate_on
//write declaration
aaa@qq.com(*)
begin
if(cs & we)
begin
mem[a] = d;
end
else
begin
mem[a] = mem[a];
end
end
//read declaration
aaa@qq.com(*)
begin
if(cs & !we & oe)
begin
reg_d = mem[a];
end
end
// tri-out
assign d = (cs & !we & oe) ? reg_d : {DW{1'bz}};
endmodule
测试文件:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: guoliang CLL
//
// Create Date: 2020/02/23 16:29:54
// Design Name:
// Module Name: sram_sp_srsw_tsb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module sram_sp_srsw_tsb(
);
// port declaration
reg [3:0]a;//address
reg clk;
reg cs;
reg oe;
reg we;// write enable
wire [7:0]d;//datain/out
// reg declaration
reg [7:0]din;
//
initial
begin
clk = 1'b0;
forever #10 clk = ~clk;//period = 20
end
//
assign d = (cs & we)?din:8'bzzzz_zzzz;
//
initial
begin
a = 4'b0000;
din = 8'd1;
we = 1'b0;
oe = 1'b1;
cs = 1'b1;
#20//read
repeat(15) #20 a = a+1'b1;
#20//write
we = 1'b1;
repeat(15) begin
#20 a = a-1'b1;
din = din+1'b1;
end
#20//read
we = 1'b0;
repeat(15) begin
#20 a = a+1'b1;
end
end
// instantation
// sram_sp_srsw inst (
// sram_sp_arsw inst (
// .a(a), // input wire [3 : 0] a
// .d(d), // input wire [7 : 0] d
// .clk(clk), // input wire clk
// .we(we), // input wire we
// .cs(cs),
// .oe(oe)
// );
sram_sp_araw inst (
.a(a), // input wire [3 : 0] a
.d(d), // input wire [7 : 0] d
.we(we), // input wire we
.cs(cs),
.oe(oe)
);
endmodule
仿真输出为:
可以看出, 单端口异步读写SRAM读写均与时钟无关;仿真正确!!
RTL电路为:
有点方!!!
三、参考文献:
感谢博主Reborn Lee的精彩讲解,感谢!附上大神的博客: