欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Verilog实现RAM(4-单端口异步读写SRAM)

程序员文章站 2022-04-01 16:38:43
...

在之前的工作中,我们对常见存储器件进行了名词扫盲,并通过调用IP核实现了简单的单端口同步读写SRAM、对单端口同步读写SRAM进行了Verilog描述、并进一步对单端口同步写,异步读SRAM进行了设计与分析;这部分工作见:

Verilog实现RAM(1)

Verilog实现RAM(2-单端口同步读写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

仿真输出为:

Verilog实现RAM(4-单端口异步读写SRAM)

可以看出, 单端口异步读写SRAM读写均与时钟无关;仿真正确!! 

RTL电路为:

Verilog实现RAM(4-单端口异步读写SRAM)

有点方!!!

三、参考文献:

感谢博主Reborn Lee的精彩讲解,感谢!附上大神的博客:

【FPGA】单端口RAM的设计(异步读、异步写)