目录
一:章节导读
二:ROM IP 核配置
2.1 创建 ROM 初始化文件
2.3 ROM IP 核配置步骤
三: ROM核的仿真与调用
3.1 三角波的产生
3.2 仿真验证结果
3.3 正弦波的产生
3.4 仿真验证结果
一:章节导读
?????? ROM 是只读存储器(
Read-Only Memory
)的简称,是一种只能读出事先所存数据的固态半导体存储器。
其特性是一旦储存资料就无法再将之改变或删除,且资料不会因为电源关闭而消失。而事
实上在
FPGA
中通过
IP
核生成的
ROM
或
RAM
,调用的都是
FPGA
内部的
RAM
资源,掉电内容都会丢失(这也很容易解释,
FPGA
芯片内部本来
就没有掉电非易失存储器单元)。用
IP
核生成的
ROM
模块只是提前添加了数据文件
(
.coe
格式),在
FPGA
运行时通过数据文件给
ROM
模块初始化,才使得
ROM
模块像个
“真正”的掉电非易失存储器;也正是这个原因,
ROM
模块的内容必须提前在数据文件中
写死,无法在电路中修改。?
?????? Xilinx 推出的
ROM IP
核分为两种类型:单端口
ROM
(
Single-Port Rom
)和双端口
ROM
(
Dual-Port ROM
)。对于单端口
ROM
提供一个读地址端口和一个读数据端口,只能
进行读操作;双端口
ROM
与单端口
ROM
类似,区别是其提供两个读地址端口和两个读数
据端口,基本上可以看做两个单口
RAM
拼接而成。下面是
ROM
不同配置模式存储器的接
口信号图,如下图
所示。
?????? 在 FPGA 的开发过程中,片上存储器的灵活运用是一项非常重要的开发能力。FPGA 最常用的片上存储器控制器包括 ROM,RAM 和 FIFO。本章将实现一组固定的数据(三角波形表)存储在 FPGA 中使用 IP 核构建的 ROM 中,开发板上电后,系统开始从 ROM 中读出数据,并将数据直接通过并
口输出。
二:ROM IP 核配置
2.1 创建 ROM 初始化文件
?????? ROM
作为只读存储器,在进行
IP
核设置时需要指定初始化文件,即写入存储器中的
数据,数据要以规定的格式才能正确写入
ROM
,这种格式就是
coe
文件。
coe
是
Vivado
规
定的一种文件格式,文件格式示意图,具体见下图
。
?????? 如上图
所示,该文件的格式较为简单,第一行是定义数据的格式,其中
16
表示
数据格式为
16
进制,也可将数据格式定义为二进制和八进制,只需将
16
改为
2
或
8
即
可。其中第
3
到第
18
行是
16*8bit
大小
ROM
的初始化数据。
2.3 ROM IP 核配置步骤
?????? 首先点击1 箭头所指的
IP Catalog
,点击后会出现
IP Catalog
页面;我们在
IP
核的搜索
框中搜索
block
,根据筛序,我们双击箭头
3
所指的
RAM & ROM
核“
Block Memory
Generator
”。双击之后会出现如下图
所示的配置界面。
1
框中我们输入
IP
核的命名,后面实例化
IP
核的时候都是使用的该名字,这里所取
的名字最好是和该
IP
核相关,因为本节我们主要讲解
ROM
,所以给该
IP 核取名为
rom_256x8
(
rom
是我们调用的
IP
核,
256
是调用的
IP
核容量,
8
是调用的
IP
核数据位
宽。这里这样命名是为了方便识别我们创建的
IP
核类型及资源量)。
2
框我们按默认选中“
Native
”
3
框中选择存储器类型,可供选择的类型有:
Single Port RAM
(单端口
RAM
)、
Simple Dual Port RAM
(简单双口
RAM
)、
True Dual Port RAM
(真双口
RAM
)、
Singl
Port ROM
(单端口
ROM
)、
Doul Port ROM
(双端口
ROM
)。这里我们选择“
Single Port
Rom
”单端口
ROM
。
4
框在
Algorithm
一栏中可选择用于实现内存的算法,其中
Minimum Area
为最小面积
算法;
Low Power
为低功耗算法;
Fixed Primitives
为固定单元算法。这里我们按默认选择
Minimum Area
即可。
设置完之后切换到“
Potr A Options
”页面。
1
框中是设置存储数据的位宽,这里我们设置为
8
位;
2
框中是设置数据深度,所谓深度其实就是个数的选择,即设置的
ROM
可以存储多
少个
8
位宽的数据,这里我们设置为
256
;这样我们设置的
ROM
和最大能存储的数据即为
256 x 8bit
。(注意:设置的容量需大于我们需要写入的数据文件的数据量)
3
框中选择是否创建端口使能信号,这里我们不创建,选择“
Always Enabled
”始终
使能。
4
框是选择是否创建输出端口寄存器,若创建了择输出数据则会延后一个时钟输出这里我们不创建。
5
框是选择是否生产复位信号,这里我们不创建。
设置完之后切换到“
Other Options
”页面。
?????? 如下图所示,1
框中选项是加载数据文件,即我们前面讲到的
ROM
初始化文件,
由于
ROM
是只读存储器,所以我们必须添加
ROM
初始化文件才行。勾选上“
Load Init
File
”点击
Browse
进行添加
.coe
初始化文件,文件格式我们之前已经讲解,大家可根据自
己想存入的数据进行生成该文件。该页面其余按默认设置即可。
设置完之后切换到“
Summary
”页面。
?????? 如下图所示,在“
Summary
”页面,从“
IP Symbol
”窗口可以看到我们最终创建
的
ROM
核的端口信号。点击“
OK
”完成
ROM
的创建设置。
?????? 创建之后接下来跳出如下图所示界面,我们点击“
Generate
”。
?????? 接下来出现如下图所示界面,我们点击“
OK
”完成生成。
?????? 如下图所示,生成之后可以在工程中看到我们正常的
IP
核,双击
IP
核可进入配置
界面,对
IP
核的相关参数进行更改。
三: ROM核的仿真与调用
3.1 三角波的产生
使用小梅哥生成的三角波的.coe文件然后进行仿真验证,代码如下
`timescale 1ns / 1ps
module blk_mem_gen_0_tb();
`define CLK_PERIOD 20
reg clk;
reg [7:0]addr;
integer i = 0;
initial clk = 1;
always #(`CLK_PERIOD/2) clk = ~clk;
wire [7:0]dout;
blk_mem_gen_0 rom (
.clka(clk), // input wire clka
.addra(addr), // input wire [7 : 0] addra
.douta(dout) // output wire [7 : 0] douta
);
initial begin
addr = 0;
#21;
for(i=0;i<2560;i=i+1)begin
#`CLK_PERIOD;
addr = addr + 1'b1;
end
#(`CLK_PERIOD * 50);
$stop;
end
endmodule
3.2 仿真验证结果
3.3 正弦波的产生
使用小梅哥的精灵软件生成的正弦波的.coe文件然后进行仿真验证。代码同
3.2节
3.4 仿真验证结果
至此rom IP调用仿真完毕
。