在前面的课程,我们已经学习了锁相环,接下来我们一起来学习另一个IP核的使用—片内存储器ROM。 首先,还是新建一个工程 然后建立起顶层文件 由于ROM是一种只读存储器,所以我们需要一个初始化文件来配置ROM中的存储数据,因此接下来,我们需要首先建立这样的配置文件,在Quartus中,配置文件可以选择MIF文件,具体操作如下 8 r0 P) n( U1 S* [! N5 S
点击File->New 弹出如下界面 我们选择 ![]() ,点击OK,弹出如下界面
0 _) \4 V. o6 M4 n5 i! G通过该界面,我们可以设置ROM中有效数据的位宽和数据深度,在这里我们选择数据深度为1024,数据位宽为8位,如下图所示 点击OK,弹出如下界面 右键点击addr行或列,可以改变行/列的进制显示,如图所示: 我们这里采用默认设置即可,接下来我们需要在配置文件中填充具体数据, 填充具体数据的方法有以下三种,大家可以去尝试 1. 直接手动输入 2. 从别的文本中复制、粘贴 3. 利用软件自带功能,直接推译出所有数据
" o3 Y5 {+ `% b* c9 z由于前两种方法相对简单,在此不再赘述,我们主要来学习一下第三种方法的实现方式,如图所示,右键点击任意单元格,弹出如下界面: 点击选择 Custom Fill Cells,弹出如下界面
* z* m1 d/ U5 l- x5 d% c$ w/ D
; W; t* n7 l2 E ~, n# I/ Q% F# t由于MIF文件的深度为1024,因此我们需要设置起始地址为0,截止地址为1023 接下来我们需要设置准备填充的具体数据,在这里我们设置数据从0开始递增,步进为1,如图所示 点击OK,可以看到数据填充完毕,如图所示 点击Save,保存 到此为止,ROM的初始化文件已经建立好,接下来我们就可以开始调用ROM,点击TOOLS-> ![]() ,弹出如下界面 * m9 v& R; }+ m& |2 v7 ] x
点击Next,创建一个新的IP核,弹出如下界面:
. T' ~9 T: W e! D: S我们选择单口ROM,如图所示 2 n7 i7 W7 Z) n) M. n; f: y- w- }
点击Next,弹出如下界面 设置空间大小为1024*8 点击Next 取消掉Q输出端的寄存器,如下图所示 点击Next 8 d7 |. v- l- ^; B! T) z
点击Browse,添加初始化配置文件 点击Next 点击Finish,结束配置。接下来我们需要编写ROM的驱动控制模块,具体代码如下:
3 m% y- T2 y6 G" U1 uROM控制器的功能就是不断地输出0—1023递增的地址数据,遍历ROM所有存储空间,因此我们需要在顶层模块中实例化rom_contral和my_rom,具体代码如下
+ S: o5 W S' w. a U) b编译整个工程,检查是否有语法错误 编译通过,接下来我们需要编写测试代码,通过仿真查看ROM中数据读取是否正确。具体测试代码如下 调用modelsim,查看仿真波形 由波形图可以看出,数据从q端被正确读出
# y) k; ?% ?0 w; I% q' F5 ^6 V* ^$ O/ b! O5 e
6 G- Y1 }9 S7 Y3 }& v" O, p: s |