差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 后一修订版 两侧同时换到之后的修订记录 | ||
波形信号发生器设计 [2018/10/23 09:55] anran [实验原理] |
波形信号发生器设计 [2018/11/04 20:11] gongyu [实验目的] |
||
---|---|---|---|
行 4: | 行 4: | ||
* 任务:基于 STEP-MAX10M08核心板 和 STEP BaseBoard V3.0底板 完成波形信号发生器设计并观察调试结果 | * 任务:基于 STEP-MAX10M08核心板 和 STEP BaseBoard V3.0底板 完成波形信号发生器设计并观察调试结果 | ||
- | * 要求:通过底板上的旋转编码器控制串行DAC芯片DAC081S101基于DDS技术产生波形可选、频率可调的常见波形信号。 | + | * 要求:通过底板上的旋转编码器控制串行[[DAC]]芯片DAC081S101基于[[DDS]]技术产生波形可选、频率可调的常见波形信号。 |
- | * 解析:FPGA驱动旋转编码器得到操作信息,通过逻辑控制波形和频率寄存器,设计DDS模块根据波形和频率寄存器控制波形数据的输出,波形数据通过串行DAC驱动模块传送到底板的DAC芯片进行转换,得到波形信号输出。 | + | * 解析:[[FPGA]]驱动旋转编码器得到操作信息,通过逻辑控制波形和频率寄存器,设计[[DDS]]模块根据波形和频率寄存器控制波形数据的输出,波形数据通过串行DAC驱动模块传送到底板的[[DAC]]芯片进行转换,得到波形信号输出。 |
====实验目的==== | ====实验目的==== | ||
- | 前面章节我们学习了旋转编码器的工作原理及驱动方法,本实验主要学习DDS技术的原理及实现,IP核rom模块的例化使用,串行DAC芯片DAC081S101的驱动设计。 | + | 前面章节我们学习了旋转编码器的工作原理及驱动方法,本实验主要学习[[DDS]]技术的原理及实现,IP核rom模块的例化使用,串行[[DAC]]芯片DAC081S101的驱动设计。 |
- | * 学习数模转换器DAC的相关知识 | + | * 学习数模转换器[[DAC]]的相关知识 |
- | * 串行(SPI接口)DAC芯片DAC081S101的驱动设计 | + | * 串行([[SPI]]接口)[[DAC]]芯片DAC081S101的驱动设计 |
- | * 学习DDS技术的原理及实现 | + | * 学习[[DDS]]技术的原理及实现 |
* 完成波形信号发生器设计实现 | * 完成波形信号发生器设计实现 | ||
行 133: | 行 133: | ||
===DDS设计实现=== | ===DDS设计实现=== | ||
- | {{:8-波表数据示意图.png?800|波表数据示意图}} | + | {{:8-波表数据示意图.png?600|波表数据示意图}} |
如上图所示,以8位DAC为例,将一个周期的正弦波分割成256份,得到256个相位波形量化数据,设计一个存储器,宽度为8,深度为256,将256个相位波形量化数据放入存储器中,我们就得到了一个正弦波波表。我们可以通过例化rom的IP核实现波表的设计,具体的操作如下: | 如上图所示,以8位DAC为例,将一个周期的正弦波分割成256份,得到256个相位波形量化数据,设计一个存储器,宽度为8,深度为256,将256个相位波形量化数据放入存储器中,我们就得到了一个正弦波波表。我们可以通过例化rom的IP核实现波表的设计,具体的操作如下: | ||
行 151: | 行 151: | ||
第三步更改配置模式,因为例化了rom的IP核,需要初始化数据,所以需要更改配置模式。打开Assignments菜单下的Device选项,点击Device and Pin Opetions,找到Configuration → Configuration mode,下拉列表中选择最后一项,点击OK保存。 | 第三步更改配置模式,因为例化了rom的IP核,需要初始化数据,所以需要更改配置模式。打开Assignments菜单下的Device选项,点击Device and Pin Opetions,找到Configuration → Configuration mode,下拉列表中选择最后一项,点击OK保存。 | ||
- | {{:8-配置模式.png?800|设置FPGA配置模式}} | + | {{:8-配置模式.png?600|设置FPGA配置模式}} |
打开rom核中的Verilog文件,端口声明如下: | 打开rom核中的Verilog文件,端口声明如下: | ||
行 163: | 行 163: | ||
其中clock为存储器时钟,address为存储器地址,q对应address地址中的数据输出,到这里我们的正弦波表就创建好了。 | 其中clock为存储器时钟,address为存储器地址,q对应address地址中的数据输出,到这里我们的正弦波表就创建好了。 | ||
- | {{:8-并行DAC应用框图.png?400|并行DAC应用框图}} | + | {{:8-并行DAC应用框图.png?500|并行DAC应用框图}} |
如果我们有上图电路的硬件,当FPGA按照时钟的节拍产生波形数据,就可以得到对应的模拟输出了,我们来看一个简单的DDS产生锯齿波例子: | 如果我们有上图电路的硬件,当FPGA按照时钟的节拍产生波形数据,就可以得到对应的模拟输出了,我们来看一个简单的DDS产生锯齿波例子: | ||
行 186: | 行 186: | ||
上面程序中累加器phase_acc随时钟clk自加1,传输给并行DAC的数据同样自加,最后得到锯齿波输出,当clk为100MHz时,锯齿波频率为100MHz / 2^24 = 5.96Hz。 | 上面程序中累加器phase_acc随时钟clk自加1,传输给并行DAC的数据同样自加,最后得到锯齿波输出,当clk为100MHz时,锯齿波频率为100MHz / 2^24 = 5.96Hz。 | ||
- | 锯齿波输出:{{:8-锯齿波.png?500|锯齿波}} | + | 锯齿波输出:{{:8-锯齿波.gif?500|锯齿波}} |
想要输出三角波,只需要把DAC数据输出赋值的语句改为: | 想要输出三角波,只需要把DAC数据输出赋值的语句改为: | ||
行 194: | 行 194: | ||
</code> | </code> | ||
- | 三角波输出:{{:8-三角波.png?500|三角波}} | + | 三角波输出:{{:8-三角波.gif?500|三角波}} |
想要输出方波,只需要把DAC数据输出赋值的语句改为: | 想要输出方波,只需要把DAC数据输出赋值的语句改为: | ||
行 202: | 行 202: | ||
</code> | </code> | ||
- | 方波输出:{{:8-方波.png?500|方波}} | + | 方波输出:{{:8-方波.gif?500|方波}} |
想要输出正弦波,只需要把DAC数据输出赋值的语句改为波表存储器的例化: | 想要输出正弦波,只需要把DAC数据输出赋值的语句改为波表存储器的例化: | ||
行 329: | 行 329: | ||
====实验现象==== | ====实验现象==== | ||
+ | |||
+ | 将设计加载到FPGA中,使用示波器观察底板DAC射频端子信号输出,按动旋转编码器观察不同的波形输出,转动旋转编码器观察频率的变化。 | ||
+ | |||
+ | {{:8-波形输出.png?600|默认输出}} | ||
+ | |||
+ | {{:8-正弦波输出.png?500|正弦波输出}} {{:8-锯齿波输出.png?500|锯齿波输出}} | ||
+ | {{:8-三角波输出.png?500|三角波输出}} {{:8-方波输出.png?500|方波输出}} |