目录
一、前言
二、工程设计
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,进入创建界面
进入IP Catalog,Search搜索框中输入查找的IP核RAM,显示相关的搜索结果,此处以“Distributed Memory Generator”为例。
进入IP核的设置窗口,Depth为存储器的深度,此处设置的值将决定左侧输入a的位宽,Data Width为存储数据的位宽,设置后即为左侧输入d的位宽。Port config和RST&Initialization为相关的设置
设置完后点击右下角的OK,成功生成IP核,在Sources窗口可看到生成的IP核,名称为dist_mem_gen_0;
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中即为一个完整的模块
RTL代码实现依赖LUT和FF和RAM网表单元。
2.5 仿真结果
仿真结果如下图
1)在rst为1时非复位状态,we为1处于写入状态,因此输出spo一直为0
2)在we为0处于读取状态时,下图红框1,2,3分为别复位信号rst为1,0,1,为0时进行复位,在方框2处为复位状态,输出spo输出为0
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,符合预期