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

Verilog实现RAM(1)

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

学习FIFO设计时遇到了RAM设计的知识,因此首先对RAM相关知识进行学习与记录

一、概念解释

基础概念不清,所以查阅了一些大神的博客与资料,先进行扫盲,基本照搬如下:

ROM:只读存储器
    ROM内部的数据是在ROM的制造工序中,在工厂里用特殊的方法被烧录进去的,其中的内容只能读不能改,一旦烧录进去,用户只能验证写入的资料是否正确,不能再作任何修改。如果发现资料有任何错误,则只有舍弃不用,重新订做一份。ROM是在生产线上生产的,由于成本高,一般只用在大批量应用的场合。

PROM:可编程ROM
    由于ROM制造和升级的不便,后来人们发明了PROM(Programmable ROM,可编程ROM)。最初从工厂中制作完成的PROM内部并没有资料,用户可以用专用的编程器将自己的资料写入,但是这种机会只有一次,一旦写入后也无法修改,若是出了错误,已写入的芯片只能报废。PROM的特性和ROM相同,但是其成本比ROM高,而且写入资料的速度比ROM的量产速度要慢,一般只适用于少量需求的场合或是ROM量产前的验证。

EPROM:可擦除可编程ROM
    EPROM(Erasable Programmable ROM,可擦除可编程ROM)芯片可重复擦除和写入,解决了PROM芯片只能写入一次的弊端。EPROM芯片有一个很明显的特征,在其正面的陶瓷封装上,开有一个玻璃窗口,透过该窗口,可以看到其内部的集成电路,紫外线透过该孔照射内部芯片就可以擦除其内的数据,完成芯片擦除的操作要用到EPROM擦除器。
 
EEPROM:电可擦除可编程ROM
    鉴于EPROM操作的不便,后来出的主板上的BIOS ROM芯片大部分都采用EEPROM(Electrically Erasable Programmable ROM,电可擦除可编程ROM)。EEPROM的擦除不需要借助于其它设备,它是以电子信号来修改其内容的,而且是以Byte为最小修改单位,不必将资料全部洗掉才能写入,彻底摆脱了EPROM Eraser和编程器的束缚。
 
 FLASH ROM:
     FLASH ROM则属于真正的单电压芯片,在使用上很类似EPROM,因此,有些书籍上便把FLASH ROM作为EPROM的一种。事实上,二者还是有差别的。FLASH ROM在擦除时,也要执行专用的刷新程序,但是在删除资料时,并非以Byte为基本单位,而是以Sector(又称Block)为最小单位,Sector的大小随厂商的不同而有所不同;只有在写入时,才以Byte为最小单位写入;FLASH ROM芯片的读和写操作都是在单电压下进行,不需跳线,只利用专用程序即可方便地修改其内容;FLASH ROM的存储容量普遍大于EPROM,约为512K到至8M KBit,由于大批量生产,价格也比较合适,很适合用来存放程序码,近年来已逐渐取代了EPROM,广泛用于主板的BIOS ROM,也是CIH攻击的主要目标。

RAM:随机访问内存
    随机访问内存(RAM)相当于PC机上的移动存储,用来存储和保存数据的。在任何时候都可以读写,RAM通常用作操作系统或其他正在运行的程序的临时存储介质(可称作系统内存)。不过,当电源关闭时时RAM不能保留数据,如果需要保存数据,就必须把它们写入到一个长期的存储器中(例如硬盘)。正因为如此,有时也将RAM称作"可变存储器"。RAM内存可以进一步分为静态RAM(SRAM)和动态内存(DRAM)两大类。

SRAM:静态随机存取存储器

    静态随机存取存储器(Static Random-Access Memory,SRAM)是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。相对之下,动态随机存取存储器(DRAM)里面所储存的数据就需要周期性地更新。然而,当电力供应停止时,SRAM储存的数据还是会消失(被称为volatile memory),这与在断电后还能储存资料的ROM或闪存是不同的。

DRAM:动态随机存取存储器

    SRAM不需要刷新电路即能保存它内部存储的数据。而DRAM(Dynamic Random Access Memory)每隔一段时间,要刷新充电一次,否则内部的数据即会消失,因此SRAM具有较高的性能,但是SRAM也有它的缺点,即它的集成度较低,功耗较DRAM大   ,相同容量的DRAM内存可以设计为较小的体积,但是SRAM却需要很大的体积。同样面积的硅片可以做出更大容量的DRAM,因此SRAM显得更贵。

以上内容,来自:

ROM、PROM、EPROM、EEPROM、RAM、SRAM、DRAM的区别

【Verilog HDL 训练】第 13 天(存储器、SRAM)

https://wenku.baidu.com/view/d5ec5fe4ad51f01dc281f1cd.html

二、调用IP核实现单端口SRAM

对SRAM的端口设置、工作机理等均不熟悉;因此首先通过调用IP核,实现一个位宽8bit,深度16bit的单端口SRAM;

IP核界面选择Memories & Storage Element分类下的RAMS & ROMS文件,点击进入配置界面

Verilog实现RAM(1)

设置模块名称、位宽、深度以及类型后,点击OK;

Verilog实现RAM(1)

IP核生成后,可以选择IP Sources,选择展开Instantiation Template中的xxx.veo文件,即可以打开实例化模板文件。(其中.veo文件是verilog的使用模板,.vho是VHDL实例模板)

Verilog实现RAM(1)

可以看出:

输入端口有:

    reg [3:0]a;//输入地址,RAM深度为16,地址位宽为4
    reg [7:0]d;//输入8位数据,作为写RAM时的输入
    reg clk;//时钟
    reg we;// write enable,写使能时进行RAM写操作

输出端口有:
    wire [7:0]spo;//读取RAM时数据输出

工作过程如下:

时钟来临时,根据we的值执行不同的操作;we为1时,写使能,将d输入数据写入a对应地址处;we为0时,读使能,将a地址处的数据读出到spo上;

测试文件如下:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: guoliang CLL
// 
// Create Date: 2020/02/20 15:22:30
// Design Name: 
// Module Name: sram_tsb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module sram_tsb(

    );
// port declaration
reg [3:0]a;//address
reg [7:0]d;//data
reg clk;
reg we;// write enable
wire [7:0]spo;//dataout 
// 
initial
begin
    clk = 1'b0;
    forever #10 clk = ~clk;//period = 20
end
//
initial
begin
    a = 4'b0000;
    d = 8'd1;
    we = 1'b0;
    #20//read
    repeat(15) #20 a = a+1'b1;
    #20//write
    we = 1'b1;
    repeat(15) begin
        #20 a = a-1'b1;
        d = d+1'b1;
    end
    #20//read
    we = 1'b0;
    repeat(15) begin
        #20 a = a+1'b1;
    end   
end
// instantation
SRAM 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
  .spo(spo)  // output wire [7 : 0] spo
);

endmodule

 测试过程为:从地址0-15进行读SRAM;随后从15-0逐个写SRAM,输入为1-16;最后再次按照0-15读取数据;

仿真结果如图:

读:

Verilog实现RAM(1)

写:

Verilog实现RAM(1)

写入完成,再次读:

 Verilog实现RAM(1)

发现:

第一次读SRAM,输出为0,与分析一致;

写SRAM时,输出spo也改变了(时钟高电平期间为写入数据d的值;低电平期间为0),没找到原因;

再次读SRAM时,地址0-15对应数据16-1与设计一致;但是输出数据的改变与时钟上升沿并不一致

查阅对应IP核手册发现,单端口SRAM设置时,输出spo为异步输出,与仿真现象一致!

如下:

Verilog实现RAM(1)

SRAM的Verilog实现会在后续记录给出

参考文献:

如何使用 Xilinx Documentation Navigator 查找下载官方PDF文档

vivado IP核调用

vivado使用自带IP核和创建自己定义的IP核 

【Verilog HDL 训练】第 13 天(存储器、SRAM)