利用Quartus中的IP核完成正弦波参考的生成,是通过查表完成的。
![](https://i-blog.csdnimg.cn/blog_migrate/6470f7f179be931921f060ed36f88ec2.png)
其中用到的sin.mif可以参考本站利用matlab产生正弦波信号.mif文件的教程。此处存在一个问题,有的教程分析modelsim仿真无法读取.mif文件,只能使用.hex文件,这一点与笔者遇到的情况并不相同(使用.mif文件也能完成正弦波的生成)。
简单的测试程序编写完成后,运行仿真出现了一系列警告(多次尝试解决的过程中),包括不限于:Could not open WLF file: vsim.wlf , # ERROR: cannot read ./simulation/modelsim/sin.hex(总之输出一直为XXXXX)。
![](https://i-blog.csdnimg.cn/blog_migrate/f174fd66ca0ec348aeb60bf9121aba81.png)
使用SingalTap观察信号,发现输出是正常的(观测时钟是g_clk,只能看到比较缓慢的数据变化),正弦波的生成与输出是没有问题的。问题还是出在仿真身上。
![](https://i-blog.csdnimg.cn/blog_migrate/aba2b5a41938e23f478aea1e84770ca9.png)
在站内查找问题的解决方案,如http://t.csdn.cn/1ax0q ,http://t.csdn.cn/rrYZE ,http://t.csdn.cn/MVPGO 等文章都有相关说明,对于modelsim的仿真可能使用hex文件更为合适。但是笔者仍然没有出现想象的正弦波:
![](https://i-blog.csdnimg.cn/blog_migrate/e4974cd822edbc2a7d8965b6fe8406e8.png)
查询以后看到不少文章都在谈论初始化的问题,甚至有些使用.mif文件的仿真也是因为初始化失败导致输出不正常。笔者加入初始化(上图存在初始化步骤,不过笔者没get初始化是对ROM内容的初始化),仍然没有解决问题。还有说hex文件必须放在modelsim的文件夹下。在http://t.csdn.cn/VBhSF文章的指导下,切实解决了相对路径绝对路径导致的文件调用失败问题(可以直接使用.mif文件)。笔者无法显示正常正弦波的原因主要是程序进入always块的条件只有posedge clk,clk开始状态不定,没有完成查表的初始化(讲解初始化问题的文章可以参考http://t.csdn.cn/YstYm)。
always@(posedge g_clk or negedge rst_n)
//always@(posedge g_clk)
begin
if(!rst_n)
begin count<=8'b0;end
else if(count==8'd146)
begin count<=8'b0;end
else begin count<=count+1'b1;end
end
将源码改成always@(posedge g_clk or negedge rst_n)以后,正弦仿真顺利生成:
![](https://i-blog.csdnimg.cn/blog_migrate/803837539b4981f4a2d7b0883ef186f4.png)