根据设计实现方案,DDS正弦信号发生器设计实现过程主要是完成两个底层模块和一个顶层设计文件,即存储正弦数据ROM、计数器和DDS顶层设计文件。
IP核调用可以使用文本方式例化,也可以采用Block原理图设计实现,在此以原理图设计方法详细介绍实现过程。
1.新建工程
新建一个工程名字为“dds_sin_block”,FPGA型号为“xc7z020clg 484-1”。
2.创建Block设计文件
执行【IP INTEGRATOR】→【Create Block Design】选项,创建名为“dds_sin”的图形设计文件。
3.添加Binary Counter IP核
在Diagram图形编辑窗口中单击工具栏中“”按钮,打开IP核资源库管理器,在“Search”查询对话框中,完整输入“Binary Counter”或输入“Bi”时,在列表中已经出现“Binary Counter”,如图3.9所示,双击添加到原理图设计文件中。
图3.9 查找Binary Counter IP核
双击调出的“Binary Counter”IP核元件符号,进行参数设置。根据正弦信号发生器设计方案,因为对输出信号频率无精度及可调控制要求,所以相位累加器位宽只要大于存储器中数据地址线位宽即可。同时因为存储器中数据深度为64,对应地址位宽为6位,所以计数器的数据输出位宽应大于等于6,“Output Width”设置为“6”,其他保持默认,单击“OK”按钮,如图3.10所示。
图3.10 Binary Counter参数设置
添加Binary Counter IP核定义的6位二进制计数器结果如图3.11所示。此时可以将计数器模块名字进行重命名,选择元件,在左侧的参数修改对话框中输入“address”,如图3.12所示。最后计数器元件名字重命名的效果如图3.13所示。
图3.11 计数器元件
图3.13 更名后的计数器元件
图3.12 重命名
4.添加ROM存储器IP核
在Diagram图形编辑窗口中单击工具栏中的“”按钮,打开IP核资源库管理器,在“Search”查询对话框中,输入“Block Memory”,在列表中将显示“Block Memory Generator”IP核,如图3.14所示。双击IP核添加到原理图设计文件中,元件符号如图3.15所示。
图3.14 调用Block Memory GeneratorIP核
图3.15 存储器元件符号
双击图3.15所示存储器元件符号,进行参数设置,弹出如图3.16所示的参数修改对话框。对存储器IP核通常需要有“Basic”“Port A Options”“Other Options”三个选项卡内容需要设置。
图3.16 Block Memory Generator参数设置对话框
1)Basic选项卡
Mode选项:包含“BRAM Controller”和“Stand Alone”两种模式,此处选择“Stand Alone”,如图3.17(a)所示。
Memory Type选项:在“Stand Alone”模式下一共有五种类型的存储器,例如可以定义为单端口ROM、双端口ROM或单端口RAM等。此处我们需要定义的是单端口ROM,因此存储器类型设置为“Single Port ROM”。如图3.17(b)所示,其他保持默认即可。
图3.17 Basic选项卡参数设置
2)Port A Options选项卡
Memory Size选项:主要设置存储器大小,包含端口数据位宽。因为.coe存储器初始化文件中正弦波形数据采样值最大值为255,所以数据位宽为8位二进制,此处“Port A Width”设置为“8”;“Port A Depth”表示存储深度,即存储数据单元个数,该参数决定存储器的地址位宽,因正弦波形采样为64点,故需要存储64个数据,与.coe文件中的数据格式对应,所以“Port A Depth”设置为“64”;“Enable Port Type”设置为“Always Enabled”。
PortA Optional Output Registers选项:去掉“Primitives Output Register”前面复选框中的“√”,其他保持默认,如图3.18所示。
图3.18 PortA Options选项卡参数设置
3)Other Options选项卡
Memory Initialization选项:存储器初始化参数设置。将“Load Init File”前复选框选中打“√”,表示加载ROM初始化数据文件,通过单击“Browse”,找到之前定义好的.coe初始化文件,将数据加载进ROM,其他保持默认,如图3.19所示。(www.xing528.com)
图3.19 加载ROM初始化.coe文件
注:COE文件提供了一种设置内存初始化值的高层次方法,但实际上并不能直接使用。当生成IP核时,VIVADO会将COE文件转换为MIF文件。MIF文件保存了原始值,用于存储类IP核的初始化和仿真模型。
完成上述参数设置后单击“OK”按钮,返回原理图设计文件,进行图形绘制。把鼠标移到ROM元件的端口“+ BRAM_PORTA”上,鼠标会变为如图3.20所示的向下箭头状,表示此端口是一个可以展开的端口,此时单击鼠标左键,会将此端口包含的所有端口展开,结果如图3.21所示,这样我们就可以进行图形绘制了。
图3.20 展开ROM端口
图3.21 ROM端口展示
选择ROM元件符号,在左侧的参数修改对话框中更改元件名为“sin_rom”,如图3.22所示,更改后的元件如图3.23所示。
图3.22 更改ROM元件名对话框
图3.23 sin_rom元件效果
5.绘制原理图
根据DDS正弦信号发生器设计方案,采用原理图绘制导线、添加端口和更改端口名的方法,完成如图3.24所示效果的原理图绘制,保存文件并做有效性检测。
图3.24 DDS正弦信号发生器顶层设计原理图
6.生成设计输出文件
在VIVADO设计界面的BLOCK DESIGN窗口中,右键单击【Sources】→【Design Sources】→【dds_sin】文件,弹出浮动菜单,执行“Generate Output Products…”,在弹出的“Generate Output Products”对话框中单击“Generate”按钮,再在弹出的生成结果信息提示框中单击“OK”按钮。
7.生成“dds_sin_wrapper.v”顶层文件
再次右键单击【Sources】→【Design Sources】→【dds_sin】文件,弹出浮动菜单,执行“Create HDL Wrapper…”选项,在弹出的“Create HDL Wrapper”对话框中,选择“Let Vivado manage wrapper and auto-update”,其余保持默认设置,单击“OK”按钮。
此时,在工程设计源文件目录中,生成了 “dds_sin_wrapper.v”文件,内容见【代码3-4】。
【代码3-4】dds_sin_wrapper.v
8.仿真测试
编写Testbench激励代码,内容见【代码3-5】,对刚刚生成的dds_sin_wrapper.v进行测试。
【代码3-5】DDS正弦信号发生器仿真测试代码
保存仿真测试文件,单击工程管理器界面的【SIMULATION】→【Run Simulation】→【Run Behavioral Simulation】,启动行为仿真,仿真结果如图3.25所示。
图3.25 正弦信号发生器仿真波形
从仿真波形可以看出随着计数器不断累加,ROM中的存储数据被有序地读取出来,证明设计是正确的。
为了更加直观地看到正弦波效果,在VIVADO仿真器波形观察界面中,允许对波形显示数据格式进行数字和模拟的切换。选中输出端Q[7:0],单击右键弹出浮动菜单,如图3.26所示。
图3.26 设置波形模拟显示格式
在浮动菜单中选择“Waveform Style”展开“Digital”“Analog”选项,默认是“Digital”类型,这里选择“Analog”,即将数据以模拟信号方式显示。此时,输出端波形发生了变化,出现了线条显示,再通过波形工具栏的缩放按钮,调节视图比例,可以看到一条光滑的正弦波形,如图3.27所示。
至此,完成了DDS正弦信号发生器设计。
图3.27 仿真结果正弦波
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。