基于lpm_rom的八选一波形发生器


最近一直在学stm32,怕时间久了FPGA 生疏,就重新做了下八选一的波形发生器,用lpm_rom做,做完之后再用quartus进行功能仿真和时序仿真,主要是把实验流程记录下来。以免过阵子又忘了。

 

一、设计输入

Step1 打开Quartus软件,新建工程:File -> New Projiect Wizard,设置工程文件夹存放位置以及工程名

一路Next,到Page3 of 5选器件,我的是Cyclone II EP2C8Q208C8,然后又是Next直到Finish

 

Step2 新建文件*.bdf文件,采用原理图输入:File -> New -> Design -> Block Diagram/Schematic FileOK!新建一个*.bdf文件。

 

Step3 新建mif文件,这个文件用来装lpm_rom初值:File -> New -> Memory Files -> Memory Initialization FileOK

字数为256,字的位数为8,一会儿建lpm_rom再细讲。点OK。用MATLAB生成sin波形的初始值,装入mif文件。总共有256个值,装好之后如下

 

wave_sel_8_1工程文件夹下新建一个mif文件夹,用来装初始化文件。把新建的mif文件保存到mif文件夹下,名字为sin.mif。这个文件用来装sin波形的初始值。

 

Step4 对新建的*.bdf文件进行编辑。双击空白部分,出现Symbol窗口,在Libraries一栏选择d:/altera/90/quartus/libraries... -> megafunctions -> storage -> lpm_rom。点OK,出现下图

进行lpm_rom配置:output file 选择VHDLVerilog HDL,这个是没什么影响的。lpm_rom_sin是修改后的名字。

Next

Output 位宽为8位,memory256个字。由于位宽是8位,所以每个字也是8位,256个字即memory的深度,需要8位地址线可寻址,2^8 = 256。所以地址线宽度为8,说明可寻址深度是2^8 = 256。输出宽度为8,说明每个存储单元是8位。

一路Next直到这里

这是新建的memory初始化,点Browse,在mif文件夹下,找到sin.mif文件。路径如下:

一直Next到最后一步

    这几个文件暂时还搞不清楚,都选上吧。暗色的是不能更改的。

    Finish之后出现

选Yes,在bdf文件上单击鼠标,刚才新建的lpm_rom_sin就放到工程里了。

 

Step5 到此为止,一个完整的lpm_rom_sin做好了,现在最重要的是要保存成果。把这个bdf文件保存在wave_sel_8_1文件夹下,名字为wave_sel_8_1.bdf。重复step3 step4,依次把lpm_rom_triangularlpm_rom_squarelpm_rom_sawtooth1lpm_rom_sawtooth0lpm_rom_ladderlpm_rom_stair1lpm_rom_stair0剩下的7lpm_rom做好。这8个波形依次是正弦波、三角波、方波、锯齿波1(向上)、锯齿波0(向下)、梯形波、阶梯波1(向上)、阶梯波0(向下)。就是麻烦,小心仔细一点就OK了。

 

好了,8个波形ROM产生了,还差一个计数模块和一个选择模块。最麻烦的部分已经做完了,Ctrl + S一下,然后休息一下。

 

Step6 新建计数模块,File -> New -> Design -> VHDL Files

保存为count.vhd,放在wave_sel_8_1下。

 

右键count.vhd -> Create Symbol Files for Current File

回到bdf文件下,双击空白部分 

选择Project -> COUNT,点击OK。放入工程中。Crtl + s。养成保存的好习惯。

 

Step7 新建选择模块,File -> New -> Design -> VHDL Files

保存为SEL8_1.vhd。剩下步骤同step6

 

Step8 所有的模块都已经做好了,就剩下输入、输出管脚了。还是双击bdf文件的空白部分

直接在Name中输入input,点OKOutput也一样,总共需要3个输入,一个输出。3个输入分别是CLKCLRnin_sel[2..0](这个是总线,3跟,器选择作用)。一个输出是output[7..0]。选中的波形就通过这个output输出。

 

Step9 连线,最后结果是

有事没事就按Ctrl + S。现在看一下整个工程的目录结构

 

然后就得仿真了,仿真的目的是在软件环境下验证电路的行为和设想中的是否一致。功能仿真是在设计输入之后,是没综合、布局布线之前的仿真,又叫行为仿真或前仿真,不考虑电路的逻辑和门的时间延时,着重考虑电路在理想环境下的行为和设计构想的一致性。时序仿真又称后仿真,是在综合、布局布线时候,即电路以及映射到特定的工艺环境后,考虑期间延时的情况下对布局布线的网标文件的一种仿真,器件延时信息是通过反标时序延时信息来实现的。

 

二、功能仿真

我用的是Quartus II 9.0,以前装过Quartus II 11.0,根本就没有波形文件这一说,当然就仿不了真了,所以又换回来了。

Step1 新建一个波形文件:File -> New -> Verification/Debugging Files -> Vector Waveform File

 

Step2 添加节点,双击红色区域,出现下图

点击Node Finder

一路OK返回

保存为

 

Step3 设置仿真截止时间:Edit -> End time。截止时间为1ms

 

Step4 设置时钟周期为20ns,如下

 

Step5 设置复位信号CLKn

 

 

Step6 设置选择信号in_sel


设置选择信号设置为10.24us1024ns)加1,时钟周期为20ns,即每512个周期选择信号加1,而每个波形的取样值为256个,所以最终结果是每个波形出现两次然后接着出现下一个波形。

 

Step7 设置仿真模式Assignments -> Settings -> Simulator Settings

 

Step8 生成功能仿真网表。

 

Step9 到现在为止都没有编译过整个工程,功能仿真只是验证它的行为是不是符合设计要求,不需要编译,查看Task

点击开始功能仿真。漫长的等待,这个时候总是相当紧张的。

OK,看波形之前进行简单的设置

出现

OK

Y

OK

8个波形依次出现,每个波形两个周期。如果把in_sel信号的时间设为512ns,则每个波形出现一次,如下

出现的顺序很有意思,可以想一下为什么是这样。最先建波形的却最后出现。

 

三、时序仿真

时序仿真之前得综合、布局布线。

Step1 综合,右键 -> start

 

Step2 布局布线,,同上

完了之后任务栏状态为

 

Step3 设置仿真模式Assignments -> Settings -> Simulator Settings

 

Step4 点击仿真,经过一些简单的设置后出现波形

整个过程没有管脚分配及时序约束,这应该是在设计输入中完成的。编程与配置也没做。

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM