Verilog实现RAM(3-单端口同步写、异步读SRAM)
在之前的工作中,我们对常见存储器件进行了名词扫盲,并通过调用IP核实现了简单的同步读写SRAM;并进一步对同步读写SRAM进行了Verilog描述----实现一个位宽8bit,深度16bit的单端口SRAM;这部分工作见:
现在在之前工作的基础上,进一步实现单端口同步写,异步读SRAM
一、原理
异步SRAM,不是与特定的时钟信号同步运行,而是根据输入信号的状态运行的。因为没有信号表明读取时已确定了有效数据,也没有信号表明写入时已接收到数据,所以,需要获取制造商的数据手册,根据时序图,按“应该已读出有效数据”及“应该能接收数据”这样的条件,进行存储器的设计。(这段话摘自https://www.cnblogs.com/geekite/p/4384322.html)
与单端口同步读写SRAM类似,单端口同步写,异步读SRAM
输入端口有:
reg [3:0]a;//输入地址(RAM深度为16,对应地址位宽为4)
reg clk;//时钟
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;为增加灵活性,通过parameter定义位宽以及深度,实现SRAM位宽、深度可调;使用parameter定义参数以及参数重写见Verilog中Parameter用法-常量定义与参数传递(例化传递、defparam传递),此处只关心RAM的实现;
verilog描述如下:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer: CLL
//
// Create Date: 2020/02/24 11:50:27
// Design Name:
// Module Name: sram_sp_arsw
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module sram_sp_arsw
#(parameter DW = 8,AW = 4)
(
input [AW-1:0]a,//address
input clk,
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(posedge clk)
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
可以看出,与单端口同步读写SRAM相比,单端口同步写,异步读SRAM只是读RAM部分逻辑与时钟无关,变为组合(异步)逻辑;
测试文件不改变:
`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)
);
endmodule
仿真输出为:
作为参考, 单端口同步读写SRAM仿真结果如下;
对比可以看出, 单端口同步读写SRAM读写均与时钟上升沿对齐;单端口同步写,异步读SRAM写与时钟上升沿对齐,而读与时钟异步;仿真正确!!
RTL电路为:
作为参考, 单端口同步读写SRAMRTL电路如下;
对比可以看出, 单端口同步读写SRAM输出d(与三态门连接那一路)与clk相关;而单端口同步写,异步读SRAM的输出d与clk无关;
电路确实与同步异步相对应;
三、参考文献:
上一篇: Verilog实现RAM(4-单端口异步读写SRAM)
下一篇: Verilog实现RAM(1)