DDS信号发生器的实现(内含代码资料)
2017-04-18 14:29
746 查看
本案例节选明德扬深圳FPGA培训班。
一、功能描述
本工程实现DDS直接数字式频率合成器,利用正弦波相位线性增加的特点,产生正弦波和余弦波。本工程主要由3部分组成:相位累加器,相位幅度转换,数模转换器DAC(FPGA外部实现)。其中,相位累加器的高10比特用于ROM的索引地址。
二、波形调制说明
模块将一个正弦波采样1024个点,然后保存到内部一个8比特、1024深度的ROM当中,通过改变时序和相位控制字,即可生成不同频率的波形。 生成波形的公式是: FO=TCLK*FCW/655360 上面公式中,TCLK是指本模块的工作时间,FCW是相位控制字,FO即是生成的信号频率。
相位控制字FCW可以改变每次步进数M。如果FCW=128,则模块内部累加器每次加128,则经过M=16’hffff/128=512个时钟,就可以循环一个周期,也就是512个时钟完成一个正弦波输出。假如FCW为256,则代表1024/4=128个时钟周期就输出一个正弦波。
三、应用举例
设定是FCW=128,CLK=50M的时钟频率,由公式计算得出F0=10KHZ。实际测量出一个波形时间为10332000ps,最终波形的频率为10KHZ。 如果是FCW=128,CLK=5M的时钟频率,由公式计算得出F0=1KHZ。输出实际测量一个波形时间为51898054ps,最终波形的频率为1KHZ。
如果是FCW=128,CLK=100M的时钟频率,由公式计算得出F0=0.2MHZ。输出实际测量一个波形时间为5167188ps,最终波形的频率为0.2MHZ。 以此类推,通过对频率控制字的改变来控制波形频率。
四、平台效果图
五、实现过程
首先根据所需要的功能,工程顶层的输入输出信号列表。
我们可以把工程划分成三个模块,分别是Sin相位转波形模块和Cos相位转波形模块和相位累加器模块。
1. 相位累加器模块
本模块根据设置好的相位控制字FCW来进行相位累加,以此控制波形的相位,sum <= sum + fcw;对相位不断累加,然后将累加的sum数据实时传到另外两个模块中去 以此本模块实现了相位累加,并将数据传输给其它模块的功能。
本模块信号列表如下:
2.Sin相位转波形模块
本模块实际上是一个RAM,事先将相位和相应相位上的幅值关系写入,然后通过从相位累加模块传来的相位累加数据sum进行查表,得到对应的幅值,以此当一个sin波的相位全部转换一遍后即可得到一个完整的sin波形。
信号列表如下:
3. Cos相位转波形模块
本模块实际上是一个RAM,事先将相位和相应相位上的幅值关系写入,然后通过从相位累加模块传来的相位累加数据sum进行查表,得到对应的幅值,以此当一个cos波的相位全部转换一遍后即可得到一个完整的cos波形。
信号列表如下:
一、功能描述
本工程实现DDS直接数字式频率合成器,利用正弦波相位线性增加的特点,产生正弦波和余弦波。本工程主要由3部分组成:相位累加器,相位幅度转换,数模转换器DAC(FPGA外部实现)。其中,相位累加器的高10比特用于ROM的索引地址。
二、波形调制说明
模块将一个正弦波采样1024个点,然后保存到内部一个8比特、1024深度的ROM当中,通过改变时序和相位控制字,即可生成不同频率的波形。 生成波形的公式是: FO=TCLK*FCW/655360 上面公式中,TCLK是指本模块的工作时间,FCW是相位控制字,FO即是生成的信号频率。
相位控制字FCW可以改变每次步进数M。如果FCW=128,则模块内部累加器每次加128,则经过M=16’hffff/128=512个时钟,就可以循环一个周期,也就是512个时钟完成一个正弦波输出。假如FCW为256,则代表1024/4=128个时钟周期就输出一个正弦波。
三、应用举例
设定是FCW=128,CLK=50M的时钟频率,由公式计算得出F0=10KHZ。实际测量出一个波形时间为10332000ps,最终波形的频率为10KHZ。 如果是FCW=128,CLK=5M的时钟频率,由公式计算得出F0=1KHZ。输出实际测量一个波形时间为51898054ps,最终波形的频率为1KHZ。
如果是FCW=128,CLK=100M的时钟频率,由公式计算得出F0=0.2MHZ。输出实际测量一个波形时间为5167188ps,最终波形的频率为0.2MHZ。 以此类推,通过对频率控制字的改变来控制波形频率。
四、平台效果图
五、实现过程
首先根据所需要的功能,工程顶层的输入输出信号列表。
信号名 | I/O | 位宽 | 说明 |
clk | I | 1 | 系统工作时钟50M |
rst_n | I | 1 | 系统复位信号,低电平有效 |
da_clk | O | 1 | 输出D/A工作时钟 |
cos | O | 8 | 输出cos波形信号 |
sin | O | 8 | 输出sin波形信号 |
1. 相位累加器模块
本模块根据设置好的相位控制字FCW来进行相位累加,以此控制波形的相位,sum <= sum + fcw;对相位不断累加,然后将累加的sum数据实时传到另外两个模块中去 以此本模块实现了相位累加,并将数据传输给其它模块的功能。
本模块信号列表如下:
信号名 | I/O | 位宽 | 说明 |
clk | I | 1 | 相位累加时钟 |
rst_n | I | 1 | 系统复位信号,低电平有效 |
fcw | I | 16 | 相位控制字 |
sum | O | 16 | 相位累加数据 |
本模块实际上是一个RAM,事先将相位和相应相位上的幅值关系写入,然后通过从相位累加模块传来的相位累加数据sum进行查表,得到对应的幅值,以此当一个sin波的相位全部转换一遍后即可得到一个完整的sin波形。
信号列表如下:
信号名 | I/O | 位宽 | 说明 |
address | I | 10 | 系统复位信号,低电平有效 |
clock | I | 1 | RAM工作时钟 |
q | O | 8 | 输出sin数据 |
本模块实际上是一个RAM,事先将相位和相应相位上的幅值关系写入,然后通过从相位累加模块传来的相位累加数据sum进行查表,得到对应的幅值,以此当一个cos波的相位全部转换一遍后即可得到一个完整的cos波形。
信号列表如下:
信号名 | I/O | 位宽 | 说明 |
address | I | 10 | 系统复位信号,低电平有效 |
clock | I | 1 | RAM工作时钟 |
q | O | 8 | 输出cos数据 |
相关文章推荐
- QT5(4)代码实现应用及信号槽实例
- QT入门笔记--信号和槽(附简单的C++类实现代码)
- python 实现的比特币代码 及 加密货币学习线路图及书籍资料
- PIC单片机实现带反馈控制的PWM信号发生器源码
- 手把手教你用R实现标记化(附代码、学习资料、语料库)
- 撸代码--类QQ聊天实现(基于linux 管道 信号 共享内存)
- C/C++ -- Gui编程 -- Qt库的使用 -- 纯代码实现信号槽
- 一个利用信号捕获实现循环定时器代码阅读笔记
- 高效率素数筛法 代码实现,内含干货
- 机器学习经典 PRML 最新 Python 代码实现,附最全 PRML 笔记视频学习资料
- 代理模式--JDK动态代理(内含详细实现步骤及代码)
- DDS正弦信号发生器
- qt creator 信号与槽 代码实现 (二)
- 信号总结及其实现代码
- 【二代示波器教程】第12章 示波器设计—DAC信号发生器的实现
- GAN代码解析(tensorflow实现)文章结尾有GAN资料合集
- 用C语言开发一个BT下载软件 (四) ------ 代码实现-4-信号处理模块
- 撸代码--类QQ聊天实现(基于linux 管道 信号 共享内存)
- 代码实现android手机信号监听
- 决策树(CART)、随机森林、GBDT(GBRT)新手导读及资料推荐,附加python实现代码