目录
一:章节导读
二: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)、SinglPort 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 / 1psmodule blk_mem_gen_0_tb();`define CLK_PERIOD 20reg 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 beginaddr = 0;#21;for(i=0;i<2560;i=i+1)begin#`CLK_PERIOD;addr = addr + 1'b1;end#(`CLK_PERIOD * 50);$stop; endendmodule
3.2 仿真验证结果
3.3 正弦波的产生
使用小梅哥的精灵软件生成的正弦波的.coe文件然后进行仿真验证。代码同3.2节
3.4 仿真验证结果
至此rom IP调用仿真完毕。