数字设计基础——SRAM(1)

前言

ROM在需要信息恢复操作的应用中受限,而计算机和其它数字系统常常需要对数据进行恢复、处理、变换和存储等操作,因此需要一种可读可写的存储器。当然,寄存器和寄存器组也是也是支持快速随机存取的,但存储大量的数据会占用太多的硅片面积。而RAM占用的面积更小,速度也更快。

一、SRAM介绍

典型的RAM包括静态和动态两类,emmm…平时只接触了SRAM所以只说说静态RAM吧。它采用晶体管-电容结构实现,不需要刷新,一般用于计算机中的高速缓存,基本的电路结构如下。 SRAM基本电路结构
反馈结构使得两个反相器的输出互为相反值,bit_linebit_line_bar的电平确定了读写操作的结果。

二、单端口SRAM的Verilog模型

1、简单的SRAM单元模型

这里先给出一个没有考虑传播延时的RAM单元,它具有低电平有效的片选输入(CS_b)和写使能(WE_b),如下图。需要注意的是这里没有时钟信号,寄存器由触发器实现,RAM由锁存器实现。
简单的SRAM单元结构
如果CS_b无效则处于三态模式,CS_b和WE_b同时有效则处于透明模式,CS_b有效但WE_b无效则锁存,单元内的内容是随时可读的,但只有在WE_b无效时才会读取data_out。

代码如下:

module  ram_static(
    output data_out,
    input  data_in,
    input  cs_b,we_b
    );

    assign  data_out=(cs_b==0)?(we_b==0)?data_in:data_out:1'bz;

endmodule

testbench如下:

`timescale	1ns / 1ps

module  t_ram_static();

    wire    data_out;
    reg     data_in;
    reg     cs_b;
    reg     we_b;

    initial begin
        $fsdbDumpfile("ram_static.fsdb");
        $fsdbDumpvars();
    end

    ram_static  u_ram_static(
        .data_out   (data_out),
        .data_in    (data_in),
        .cs_b       (cs_b),
        .we_b       (we_b)
    );

    initial begin
        data_in=1'b1;   	cs_b=1'b1;  we_b=1'b1;
        #20 cs_b=1'b0;      we_b=1'b0;
        #40 data_in=1'b0;   cs_b=1'b1;  we_b=1'b1;
        #10 cs_b=1'b0;
    end

    initial begin
        #100    $finish;
    end

endmodule

仿真波形如下:

c

2.带双向数据端口的SRAM

现在我们引入一个稍微复杂点的,将模型修改为一个只包含双向数据端口的共享总线结构,如下图。
在这里插入图片描述
增加OE_b信号来控制数据通路,数据通道由原来的两个信号减少为一个。如果WE_b有效而OE_b无效,则data的值可以透明传输到latch_out,并在WE_b无效时被锁存,如下图。读类似。
双向端口写模型

代码如下:

module  ram_static_BD(
    inout   data,
    input   cs_b,
    input   we_b,
    input   oe_b
    );

    wire    latch_out=((cs_b==0)&&(we_b==0)&&(oe_b==1))?data:latch_out;

    assign  data=((cs_b==0)&&(we_b==1)&&(oe_b==0))?latch_out:1'bz;
endmodule

testbench如下:

module  t_ram_static_BD();
    reg bus_driver;
    reg we_b,oe_b,cs_b;

    wire data_bus=((oe_b==1)&&(we_b==0))?bus_driver:1'bz;

    ram_static_BD u_ram_static_BD(
        .data   (data_bus),
        .cs_b   (cs_b),
        .we_b   (we_b),
        .oe_b   (oe_b)
    );

    initial begin
        #100   $finish;
    end

    initial begin
        $fsdbDumpfile("ram_static_BD.fsdb");
        $fsdbDumpvars();
    end

    initial begin
        bus_driver=1'b0;		cs_b=1'b1;			we_b=1'b1;oe_b=1'b1;
        #10 cs_b=1'b0;			we_b=1'b0;			bus_driver=1'b1;
        #20 we_b=1'b1;			cs_b=1'b1;			bus_driver=1'b0;
        #40 bus_driver=1'b1;	cs_b=1'b0;
        #20 oe_b=1'b0;			bus_driver=1'b0;
        #10 cs_b=1'b1;			bus_driver=1'b1;
    end
endmodule

仿真波形如下:

双向端口sram仿真波形

先这样吧,如有错误啥的麻烦指出来我将及时修正,也期待各位大佬的指点,谢谢~


Beyond topic:

以后会不定期更新一些所学所悟,希望“说得清楚,看得明白”。
本来想利用周末把双端口SRAM也写一下的,码不完了,下周叭~

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钵仔gao

喜提钵仔糕一个~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值