Verilog基础之十六、RAM实现

目录

一、前言

二、工程设计

2.1 RAM IP核使用

2.2 设计代码

2.3 仿真代码

2.4 综合结果

2.5 仿真结果


一、前言

    工程设计中除逻辑计算单元外,存储单元也是不可获取的部分,RAM(Random Access Memory)随机存取存储器即可以写入数据,也可读取数据,写入或读取的位置由输入的地址决定。

二、工程设计

    RAM作为常用的单元,器件都是自带对应的IP核,可直接创建例化使用,本文将介绍通过IP核以及RTL代码两种方式实现RAM。

2.1 RAM IP核使用

    先创建工程指定器件,然后在Flow Navigator中进入IP Catalog,进入创建界面

Verilog基础之十六、RAM实现_第1张图片

    进入IP Catalog,Search搜索框中输入查找的IP核RAM,显示相关的搜索结果,此处以“Distributed Memory Generator”为例。

Verilog基础之十六、RAM实现_第2张图片

进入IP核的设置窗口,Depth为存储器的深度,此处设置的值将决定左侧输入a的位宽,Data Width为存储数据的位宽,设置后即为左侧输入d的位宽。Port config和RST&Initialization为相关的设置

Verilog基础之十六、RAM实现_第3张图片

设置完后点击右下角的OK,成功生成IP核,在Sources窗口可看到生成的IP核,名称为dist_mem_gen_0;

Verilog基础之十六、RAM实现_第4张图片

2.2 设计代码

设计中包含了IP核和RTL生成RAM的方式,IP核的生成方式十分方便,对dist_mem_gen_0进行例化即可实现

module RAM(addr,d,d0,clk,we,spo_ip,spo,rst );
input [3:0] addr;
input clk,rst,we;
input [15:0] d;
input [4:0] d0;
output [15:0] spo_ip;
output reg [4:0] spo;
reg [4:0] addrtemp [0:15];
dist_mem_gen_0 ram_ip(.a(addr),.d(d),.clk(clk),.we(we),.spo(spo_ip)); //使用IP核调用RAM 

always@(posedge clk,negedge rst)    //RTL代码实现RAM,RAM的深度为16,数据位宽为4
begin
if(!rst)
     spo<=5'b0;    
else
    spo<=addrtemp[addr];   
end
always@(posedge clk)
 if(we==0)
begin
    addrtemp[addr]<=d0;
end
endmodule

2.3 仿真代码

`timescale 1ns / 1ns
module RAM_tb(  );
reg clk,rst,we;
reg [3:0] addr;   //RAM 读写地址
reg [4:0] d0;	  //RTL代码实现的RAM的数据输入
reg [15:0] d;	  //IP核实现RAM的数据输入
wire [15:0] spo_ip;   //IP核实现RAM的数据输出
wire [4:0] spo;		//RTL代码实现RAM的数据输出,位宽为5
initial
begin
clk=0;
rst=1;
we=0;
d=0;
d0=0;
addr=4'b0;
#20 we=1;
#80 we=0;
#100 rst=0;
#50 rst=1;
end
always #2 clk=~clk;   //时钟周期为4ns
always #5 d=d+16'h1111;  //IP核例化RAM的数据输入d每隔5ns变化一次
always #4 d0=d0+5'b00001; //RTL RAM的数据输入d每隔5ns变化一次
always #4 addr=addr+4'b0001;   //RAM读写地址每隔4ns改变一次
RAM RAM_test(.addr(addr),.d(d),.d0(d0),.clk(clk),.rst(rst),.we(we),.spo_ip(spo_ip),.spo(spo) );
endmodule

2.4 综合结果

IP核实现的RAM在Schematic中即为一个完整的模块

Verilog基础之十六、RAM实现_第5张图片

RTL代码实现依赖LUT和FF和RAM网表单元。

Verilog基础之十六、RAM实现_第6张图片

2.5 仿真结果

仿真结果如下图

1)在rst为1时非复位状态,we为1处于写入状态,因此输出spo一直为0

Verilog基础之十六、RAM实现_第7张图片

2)在we为0处于读取状态时,下图红框1,2,3分为别复位信号rst为1,0,1,为0时进行复位,在方框2处为复位状态,输出spo输出为0

Verilog基础之十六、RAM实现_第8张图片

3)在rst为1,we为0,即正常的读取状态时,地址addr范围为0-15,输入d0范围为0-31,当前地址addr的读取值为之前的写入值。

a.在序号1 439ns处,addr为13,输入d0为13,此时写入13;

b.在序号2 441ns处,addr为14,输入d0为14,此时写入14;

c.在序号3 502ns处,此时读取地址为13,根据之前存储的值为13,因此输出spo为13.

d.在序号4 506ns处,类似的读取之前存储的值14,符合预期

Verilog基础之十六、RAM实现_第9张图片

你可能感兴趣的:(Verilog学习笔记,Vivado,FPGA所知所见所解,fpga开发,RAM,随机存储器,modelsim)