本人作为萌新。在这个寒假第一次接触FPGA,并且在仿真的过程中遇到了很多问题,并且通过互联网发现csdn上有许多大佬分享的心得与资料。虽然很多大佬的思路给了我启发,但是实现过程不够细致,导致仿真过程出现了很多难以搜索到的问题,而查找到的答案大多数是分散的,无法解决问题。虽然问题没办法解决,但是看过后仍然对一些问题的处理有对应的解决办法,通过自己不断整合、尝试,找到了部分问题的解决办法。现在FPGA方面的研究较少,资料也较少,所以想把得到的经验发出来和大家分享一下,希望能帮助到大家。
一、可以正常 start simulation时,如果modelsim窗口左边无➕或者输出信号为zzzzz高阻则说明例化失败
1.未成功例化模块,例如图片,双击u_filter查看所例化的子模块是否为真正包含功能的模块,而不是例化模块的模块例如_inst
2.在调用DDS目录下的IP核时(NCO、FIR等)会生成.v、.vhd、.vo等文件(一般用modelsim仿真都会勾选setup simulation)。在仿真的project中只需要添加.vo、.vhd作为本IP核的例化模块,否则可能会由于编译顺序导致例化错误模块。
二、无法正常进行start simulation,并且出现
unit was not found的字样
1.没有在project中加入库文件,例如:altera_mf.v、220model.v等。我的文件具体位置(D:\useful_software\FPGA\quartus\eda\sim_lib\altera_mf.v)。
2.如果是DDS目录下的IP核。加入过多的不需要的IP核生成文件。例如:
3.部分IP核必须与quartus创建工程生成的qpf在同一文件夹下,子文件夹也不行(受XX原子影响,一开始创建IP核专门用ipcore储存)。
4.例化模块时字母打错了。
三、仿真时输出为0
1.对于ROM核与NCO核来说都需要mif或者hex文件存储数据。如果其他输入信号均正常,输出信号为0,则代表没有读取到存储数据。点开vo文件搜索"init_file"可以发现存储数据自动给根目录地址。如果仿真文件与ip核、工程文件的qpf不在一个目录下,会造成读空的错误。解决办法有:(1)将sin.hex,cos.hex(即使单端输出也需要两个都复制)文件复制到与.mpf一个文件夹中(即仿真工程保存的文件夹)。
(2)重建仿真工程并且将其与qpf、hex保存在同一个文件夹下(不能是子目录)。
2.检查激励文件的rst_n与IP核的rst_n是不是相同意义。一般情况下rst_n是拉高状态,而部分IP核在rst_n拉低时才正常工作。比如PLL。
四、调用IP核FIR Compiler时,无法导入coef
设置IP核参数时发现滤波效果并不能达到预期,所以想使用matlab的filterDesigner生成coef后导入IP核进行系数配置。但导入时出现该问题,通过搜寻资料与参照IP核自动生成的coef发现是文本中数据格式错误。(不得不吐槽,这个IP核对文本格式要求真的严格)
这是IP核生成的coef。
这是matlab导出的xilinx的coef。
可以发现matlab的数据是16进制,而IP核所需的是十进制,并且数据之间的隔开方式也不相同。
因此我想让matlab自动导出十进制数据以便输入,点击第一个生成C文件。
然后打开该文件。
将其中的数据复制出来,再粘贴到matlab中,用ctrl+f把,全部替换成;。执行之后查看该矩阵的数据,最后将数据直接复制到txt文件即可。
若成功导入系数可以看到frequnecy response有明显变化。
最终解决办法:
(1)ip核就相当于C语言的库函数,都是人写出来的。如果实在没办法调用,就搞清楚其中的原理自己写一个简易的模块实现所需要的功能。
(2)如果身边实在没仪器不能直接上板实验,可以通过signal Tap II在线看波形
//*********************************************分割线*******************************************************//
(由于看过的资料太多了,这里就不给一些参考的网站了)
目前暂时发现了这些问题,后续如果再发现问题并解决会继续更新。有不懂的可以在评论区追问,其他小伙伴也有发现也可以发在评论区。