简易DDS信号发生器记录

简易DDS信号发生器

学习资料:野火 升腾Pro《FPGA Verilog开发实战指南——基于Xilinx Artix7》2021.11.16

1. 理论知识

DDS 是直接数字式频率合成器(Direct Digital Synthesizer),也就是信号发生器,具有低成本、低功耗、高分辨率和快速转换时间等优点。
DDS 的基本结构主要由相位累加器、相位调制器、波形数据表 ROM、D/A 转换器等四大结构组成,其中较多设计还会在数模转换器之后增加一个低通滤波器。
基本结构示意图:
简易DDS信号发生器记录_第1张图片
频率字输入F_WORD一般为整数,控制输出信号的频率,数值越大频率越高,后面用K表示,其位宽为N。相位字输入P_WORD(后文用P表示),为整数,数值大小控制输出信号的相位偏移,主要用于相位的信号调制。系统时钟频率fclk,输出信号频率fout,两者的关系:**fout= K * fclk / (2 ^ N ).**对于P的计算,P= 相位偏移量 / (2π / 2 ^ M),M为ROM地址的位宽。
简易DDS信号发生器记录_第2张图片

2. 工程设计

实验目标:使用 FPGA 开发板和外部挂载的高速 AD/DA 板卡,设计并实现一个简易 DDS 信号发生器,可通过按键控制实现正弦波、方波、三角波和锯齿波的波形输出,频率相位可调。
波形文件的产生利用Matlab生成.coe格式文件,代码如下图:
简易DDS信号发生器记录_第3张图片
简易DDS信号发生器记录_第4张图片

  • 整体框架
    D/A模块由外部挂载AD/DA板卡处理,其余相位累加器、相位调制器、波形数据表 ROM 由FPGA 负责。
    整体模块框图,四个按键进行波形选择输出,
    简易DDS信号发生器记录_第5张图片

  • 按键控制模块
    四个输入,需要按键消抖,直接套用以前的模块即可。

  • dds模块
    内部实例化了波形数据表ROM,用于存储波形信号。
    简易DDS信号发生器记录_第6张图片
    其中 fre_add 表示相位累加器输出值,位宽为 32 位,系统上电后,fre_add 信号一直执行自加操作,每个时钟周期自加参数 FREQ_CTRL,参数FREQ_CTRL 就是在之前理论知识部分提到的频率字输入 K。
    寄存器变量 rom_addr_reg 表示相位调制器输出值,将相位累加器输出值的高 12 位与相位偏移量 PHASE_CTRL 相加,参数 PHASE_CTRL 就是我们之前提到过的相位字输入P。
    ROM 读地址 rom_addr 是输入波形数据表的 ROM 读地址,是在 rom_addr_reg 的基础上计算得到。我们之前将 4 种信号波形数据按照正弦波、方波、三角波、锯齿波的顺序写入 ROM。若需要读取正弦波波形数据,rom_addr_reg 可直接赋值给 rom_addr;但是要进行方波波形数据的读取,rom_addr_reg 需要再加上正弦波存储单元个数才能赋值给
    rom_addr。

  • 顶层模块
    直接实例化按键和dds模块即可,输出的dac_clk是DAC模块的时钟,该信号由系统时钟 sys_clk 取反得到。取反的原因是波形数据表 ROM 的读时钟为系统时钟 sys_clk,在系统时钟上升沿时对 ROM 进行数据读取,而 DA 模块也使用时钟上升沿进行数据处理,将系统时钟 sys_clk 取反得到dac_clk,那么dac_clk 的上升沿刚好采集到波形数dac_data 的稳定数据。

代码详见资料

你可能感兴趣的:(FPGA学习笔记,fpga开发)