FPGA21 嵌入式块Ram应用之Rom(Read only memory)
模块名称: romIP Core
主要功能 :调用内部的资源,实现只读功能
实验目的 :了解这些芯片专用硬件资源的情况下,将其合理的应用到对应的系统中.
主要应用: 系统一些初始化参数的配置的数据,DAC实现的任意信号的发送。
实验现象:
1、将一组固定的数据(三角波形表)存储在FPGA中使用IP核构建的片上ROM中,开发板上电后,系统开始从ROM中读出数据,并将数据直接通过并口输出。通过使用signalTapⅡl软件实时抓取并口上的数据,显示得到三角波形。
2、使用Quartusll软件中提供的 Iln-System Memory ContentEditor工具在线更改ROM中的数据(将数据更改为正弦波形表),再次观察signal Tap l工具抓取到的波形数据。
使用 signalTapⅡ 调试的一种方式:
知识点:
1、ROM存储器lP核的使用
2、In-system Memory Content Editor内存查看工具的使用。
3、SignalTap Ⅱ调试工具的简单使用
使用IP 核配置 单口ROM设计流程:
1、选中 Tools --> MegaWizard Plug-In Manager
2、开始下方的配置操作
2、rom模块的配置
1、首先,我们使用的是使用Ram 实现的Rom功能,也就是说,由原来的可【读/写】,变成 了只可以【读】功能。
所以在 图上可以看到输入端只有两个端口:
① address[] ② clock
输出端只有1个端口 : q[7:0].
所以在图上也可以看到rom的结构是 不支持写操作的,这个也是符合我们对rom 的理解
2、配置选项介绍
数据输出端的位宽 q
rom的字节大小
内存内部的结构类型 : 注,一般来说选择 auto 即可
输入和输出时钟的配置: 有两个选择; ① 选择单一时钟 ② 输入输出选择不同的时钟
3、选项配置操作
① 选择是否加入寄存器
② 是否创建时钟使能信号
③是否创建一个寄存器数据清零信号
④是否创建一个读使能信号
提示使用 hex文件或者是 mif 文件对rom 进行初始化。
所以我们要先创建一个mif数据初始化文件。
创建一个mif文件
配置生成的内存大小和数据位宽
可以看到生成的mif文件
接下来就是对所有的数据进行修改
本次我们使用excel 生成一个三角波信号
对生成的数据复制到mif文件中,结果如下:
再次进行上述的配置操作:即
设置位顶层文件,但是编译效果如下:
注:表示工程的mif 文件只能是存放在 prj/xxx.mif 中,而不能存放在其它文件中,即存放在更目录下。
rom 模块测试:
rom_tb.v文件
`timescale 1ns/1ns
`define clk_period 20
module rom_tb;
reg [7:0]addr;
reg clk;
wire [7:0]q;
rom rom(
.address(addr),
.clock(clk),
.q(q)
);
initial clk = 1;
always #(`clk_period/2) clk = ~clk;
integer i;
initial begin
addr = 0;
#21;
for(i=0;i<2550;i=i+1)begin
#`clk_period;
addr = addr + 1;
end
#(`clk_period * 50);
$stop;
end
endmodule
可以看到,数据数据会延迟一个时钟周期变化(注:不是两个时钟周期,数据到来之后,只有再次捕获到时钟上升沿才会变化)
将数据修改为可以理解的三角波形(我们实际效果的波形现阶段是三角波)的操作:
通过该地方进行修改,即可得到模拟的三角波,效果如下所示:
注: 这个是我们在仿真中可以做到和实际电路中运行的效果尽可能的保持一致,便于我们分析
我们切换 sin.mif 文件,再次编译和仿真,得到的效果如下所示:
发现波形很奇怪,我们需要修改显示的一个方式,具体操作如下所示:
修该显示的最小值和最大值:
调整完以后,显示的效果如下所示:
可以看到一个sin波形
当为我们仿真的时间拉长的时候,得到的效果如下所示:
2、In-system Memory Content Editor 内存查看工具的使用。
编写顶层文件
ROM_top.v
module ROM_top(Clk,Rst_n,q);
input Clk;
input Rst_n;
output [7:0]q;
reg [7:0]addr;
rom rom(
.address(addr),
.clock(Clk),
.q(q)
);
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)
addr <= 8'd0;
else
addr <= addr + 1'b1;
endmodule
创建文件,使用内部逻辑分析仪:
效果如下所示:
具体配置如下:
①配置时钟
② 配置要分析(抓取)的数据
可以看到,添加我们要检测的信号即可(根据实际情况来选中)
③ 选择采样的数据深度(根据自己设计的需求来进行设计即可)
配置添加好的文件如下:
再次对项目编译,烧写文件到芯片中后。
双击打开 stp1.stp文件
进行一定的设置,如下所示:
可以点击单词抓取或者连续抓取(注;一定要点击,不然下方的数据是无法显示的)
抓取的数据如下所示:
可以看到仅仅是个数据,但是我们想要看的是波形,便于我们进行分析
所以开启如下配置:
修改好后,就可以看到数据的波形了,如下所示:
在线修改Rom中的数据操作:
将三角波的数据修改成 正弦波的数据
① 选中 In-System Memory Content Editor
修改[xxx.mif]文件操作:
点击写入到fpga,即可完成rom中数据的修改。
此时再次观看波形
可以发现,数据修改成功了。