Altera中rom的使用
一、ROM简介
由于工作需要,需要持续发送一些固定数据,所以需要使用ROM,在quartus中,ROM可以分为两类,其一为单端口,其二为双端口,如下图所示:
ROM是一种嵌入式memory,在实际中只能对其进行读数据,而不能写数据,而ROM中的数据是在生成IP时候进行配置的。在ROM初始化时候,可以选择两种数据,其一为mif文件,其二为hex文件。
而mif和hex文件可以通过quartus生成,具体生成方法:打开quartus,然后新建文件,如下图所示,上面的生成的是hex文件,下面生成的是hex文件。
Hex文件格式如下图所示:
Mif文件格式如下图所示,其中WIDTH为数据位宽,DEPTH表示ROM的深度,和address相关,4096表示地址位宽为12.
二、ROM的仿真
ROM的仿真和其他IP仿真不同,此时需要做一些修改,这个是因为modelsim无法识别mif文件,如果需要使用modelsim仿真,rom的初始值必须为hex文件。如果需要仿真ROM需要先做以下几个步骤:
1、 下载convert_hex2ver.dll
该文件功能为将hex转换为modelsim能够识别的ver文件,该文件可以在网上下载。
2、 修改modelsim.ini文件
1、 将convert_hex2ver.dll文件放在modelsim安装路径的win32目录下
2、 修改ini文件
需要注意的是,网上有些教程是错误的!!!在ini文件中找到[vsim]
在它下一行输入:Veriuser = C:/modeltech_10.1c/win32/convert_hex2ver.dll
如下图所示,具体路径根据modelsim的安装路径进行修改。
3、生成rom IP和hex文件
该部分由quartus完成,首先生成rom初始化文件,然后生成rom的IP核。打开quartus,然后新建文件,选择Hex文件如下图所示:
弹出下图,选择默认,点击OK
此时hex文件里面的值都为0,鼠标点中数据部分的任意一个格子,例如我选择第二个,然后右击,弹出下图,然后选择custom fill cells。
弹出下图,并修改如下,然后保存,就完成hex生成和初始化。
接着生成rom IP,如果单纯仿真IP,可以不用新建工程,直接新建IP,按一般的方式生成IP,直到这一步,需要点击browse,选择刚刚保存的hex文件
点击finish,完成IP的生成。
4、编写testbench
5、新建modelsim工程
这里需要注意的是,在工程中需要添加的文件:
1、 IP核的v文件
2、 Testbench文件
3、 Hex文件
4、 altera_mf.v文件
第四个文件为altera的库文件,可以在quartus安装路径下搜索获得。
最后仿真结果如下图所示,如何看图形,可以在FFT文档中查看。
6、仿真正弦波
在实际使用中,我们需要使用的更多的是sin或者cos信号,如果要仿真sin信号,就需要修改hex文件的初始化文件。具体做法使用matlab生成sin或者cos信号。
Matlab生成sin信号:
网上的代码如下:
index = linspace(0,2*pi,257);
temp1 = sin(index);
temp2= temp1*63+64;
temp2=temp2+0.5;
temp3=fix(temp2);
dlmwrite('d:\\sin.txt',temp3,'delimiter','\t');
还可以使用其他的代码:
fc=10e6;
nn=1/fc/256
t=[0:256]*nn;
x=sin(2*pi*fc*t);
xx=fix(128+(2^7-1)*x);
dlmwrite('d:\\sin.txt',xx,'delimiter','\t');
这里需要注意的是,由于我们的rom深度为256,但是我们生成的txt文件的长度为257,所以txt文件的长度要比rom多一个数据,否则无法对hex文件赋值。
三、ROM下板测试
最后还是可以将rom生成bit文件,然后下到FPGA中,然后使用signaltap进行抓取数据,结果如下图所示。