我们首先来看看一个ROM的生成过程。当我们生成一个ROM模块时,在Memory Initialization选项中,会让开发者去指定COE文件的路径,
当我们指定好COE文件的路径,最后生成ROM后,会发现,在生成的ROM的IP核工程的文件夹列表中会同时生成MIF文件,
打开MIF文件,会发现里面内容与COE文件相同,这时不禁会让人感到疑惑:到底ROM会用哪个文件作为自己的初始化文件呢?
答案是MIF文件。
COE文件的作用,是困败生成IP核工程的时候,将其文件中的内容导入,生成MIF文件。也就是说,MIF文件是基于COE文件生成的,所以二者的内容才会相同(格式上是不汪基颤同的)。此后,在实际的使用中,只有MIF文件才会发挥作用,COE这时就已经“无用”了。由此可以推测,若想改变某个ROM模块的初始化文件,要么重新生成一遍ROM模块,导入新的COE文件,要么直接替换掉MIF文件,二者的作用是等效的,只是后者做法不太规范,由于COE文件未变,若再生成ROM模块会导致MIF文件会根据老的COE文件重生成。
总结起来,在使用过程中,需要注意以下几点:
1、 MIF文件是根据COE文件生成的。
2、 COE文件只会在锋野生成ROM模块时起作用,其作用就是根据文件内容生成相应的MIF文件,而ROM真正使用的是MIF文件。
3、 若想改变某个ROM模块的初始化内容,根本上来说是要改变MIF文件,有两种方法:一是替换掉原来的COE文件,再将ROM模块重新生成一遍;二是直接替换掉MIF文件。前者是比较规范的作法,因为后者的COE文件未变,若后面再去因为配置ROM参数而重新生成ROM模块会导致MIF文件又会回到“老样子”。切忌直接替换COE而不重新生成ROM模块的作法,这样MIF文件没变,所以初始化内容也会保持不变
设计DDS的核心就是调用IP ROM,vivado调用ROM的方法和ISE相类似,都是加载.coe文件,我这里特地做笔记,以防忘记。
这是DDS的原理图,DDS并没有像它的名字一样说的那么玄乎,它的核心便是控制频率的fword字输入,和相位字pword输入,最后调用IP核查找表即可,代码也十分简单,下面给出DDS design代码。
DDS_design
使用vivado调用IP核ROM教程如下
点击IP catalog
选择block memory,然后双击
将show disabled ports 选项勾选掉
输入ROM名,我这里为了演示重新配置一个方波ROM,命名为square_rom
这里选择single ports ROM
按如上图所示勾选参数,port width是数据宽度,我们根据代码要求设置为10位,
port width是数据深度,即有多少个这样的数据,我打开生成的square.coe文件可以清楚的看到一共有4096这样的数据。
always enable是ROM一直处于工作宏笑脊状态,不需要使能信号。
这里是加载.coe文件,勾选load init file 然后点击browse将刚才生成的square.coe文件加载到ROM中,最后点击OK。
选择generate生成IP核
打开如图所示文件,
将生成的IP核实例化,即可
最后编写测试文件进行测试
最后右键点击da_data选择wave style选择analog,将会看到模拟波形,但是有时候还是需要设置一下模拟波形的显升颂示,同样右键点击da_data选择wave style选择analog setting,选择如蔽渗下图所示参数。
最后便大功告成,即可得打方波的波形图
大家还可以按照这种方法将其他两种波形都做出来。
本人最近刚宏或开始学习ISE,需要调用Xilinx IP核设计一个正简FIR低通滤波器,滤波器系数我是利用MATLAB的FDATool工具得到的,把系数写入coe文件,然后在ISE中调用该coe文件来设计我想要的滤波器,并通过Modelsim仿真。应该说到现在为止整个过程我已经基本上完成了,也在Modelsim上得到了仿真结果。之后为了验证结果的正确性,我又用得到的系数在MATLAB上用filter函数得到了一个结果,现在的问题是两个结果不一样,而且差距很大,这个问题困扰了我很多天了,实在想不出问题出在哪里,现望高手指点。(说明一下:在调用IP核时,ISE有一组默认的滤波器系数,21阶的,系数全是整数蔽清伍,我用这组系数在ISE和MATLAB上得到的结果是一样的,而我自己设计的滤波器是35阶的,而且系数全是小数,个人认为应该跟这没关系)欢迎分享,转载请注明来源:内存溢出
评论列表(0条)