您的当前位置:首页正弦波发生器ModelSim 仿真

正弦波发生器ModelSim 仿真

2022-12-08 来源:乌哈旅游


正弦波发生器ModelSim仿真

要求:使用ModelSim对Quartus工程正弦波发生器进行功能仿真(前仿真)和时序仿真(后仿真)。

1 在Quartus工程中建立正弦波发生器

lpm_counter_6bitsclockINPUTVCCclockinstup counterlpm_rom_sinaddress[5..0]clockinst1q[5..0]q[7..0]OUTPUTq[7..0] 该正弦波发生器由两部分构成:6位二进制计数器(lpm_counter_6bits)和ROM(lpm_rom_sin)。该计数器作为地址产生器产生递增的地址,ROM中存放正弦波的幅度数据,地址相当于正弦波的相位,相位递增幅度进行变化,这样便形成正弦波。 1.1 lpm_counter_6bits的创建

新建一个“.bdf”文件,并另存为。双击空白处,显示如下对话框,选择“lpm_counter”,点击OK。然后按照如图所示操作。

后面一直点击“Next”,直到“Finish”,完成6位二进制计数器的生成。 1.2 lpm_rom_sin的创建

利用同样的方法创建lpm_rom_sin。所不同的是在创建该模块之前,首先应建立一个初始数据文件,这里可直接在Quartus中创建Memory Initialization File,输入正弦波的幅度值,也可以用C++中的函数生成数据。我们使用第二种方式,如下:

运行后生成sindata.mif文件,然后装在初始文件。

点击“Finish”后生成。 1.3 编译生成网表文件

(1) 选定芯片(这里选用EP2C8Q208C8),并将不用管脚置三态。 (2) 选择第三方的仿真工具:

由于我们只做系统仿真,所以不用分配管教,编译后发现编译过程多了这样一步:产生DEA第三方工具所需要的网表。

在下方消息栏中可以看出该过程产生了两个文件:“sin_wave.vo”文件和“sin_wave.sdo”文件。

这时打开我们所建工程的目录,发现多了一个“simulation”文件夹,打开发现有一个“modelsim”文件夹,打开后发现有“sin_wave.vo”文件(设计文件,记载芯片中的布线信息,在后面的仿真我们就利用该文件来代替我们原始的设计文件)和“sin_wave.sdo”文件(芯片布线间的延迟文件)。 1.4 建立仿真的激励文件:

1.5 加入仿真模型库

我们使用的CycloneII系列的器件,所以我们需要加入cycloneii_atoms.v文件。而且我们还用到了Altera的ip核(lpm_counter和lpm_rom),所以我们需要加入altera_mf.v文件。复制到“modelsim”文件夹中。

2 ModelSim功能仿真

使用ModelSim做仿真,可以新建一个工程进行仿真,还可以直接编译文件进行仿真。第二种方法比较简单,我们这里采用该方法。

直接点击编译按钮,出现如下界面:

在“Workspace”的work中找到我们需要的顶层模块——wave_top。

因为我们做的是前仿真,不加入延迟信息,所以我们还需将“sin_wave.vo”文件做些修改:改完后重新编译下修改过的文件。

双击“wave_top”后,可成功打开如下界面:

添加信号到波形窗口,在命令栏中输入“run 10us”,回车,便产生仿真波形。

3 ModelSim时序仿真

首先把刚才修改过的”sin_wave.vo”文件修改回来(加入延迟信息),并且重新编译。选择“Library”栏,双击“wave_top”模块。这时我们发现仿真出现了错误:(读取.SDF文件错误)。

这时,我们关掉仿真。新建一个ModelSim工程来避免该错误。

点击“Compile All”。

点击“Simulate/Start Simulation”,同样在“work”路径下选择我们的顶层模块——wave_top。

在SDF选项卡中加入“sin_wave.sdo”文件。

点击OK后我们便发现成功的Loading了SDF文件。后面的过程跟功能仿真一样。

因篇幅问题不能全部显示,请点此查看更多更全内容