电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

正弦波发生器ModelSim仿真

attachment download

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

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

        该正弦波发生器由两部分构成: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文件。后面的过程跟功能仿真一样。

博主
sust_alex
sust_alex's Blog
sust_alex
点击跳转