DDS:直接数字合成,正弦波0-2pi周期内,相位到幅度是一一对应的。首先需要的将正弦波查询表存储起来,然后在时钟下,通过相位累加模块和地址查询模块实现正弦波信号。
正弦波查询表:存储的是量化的正弦波在一个周期的幅度信息(幅度的“地址”也蕴含相位)。幅度的地址数目决定了相位量化的误差。而存储每一个幅度的比特数决定了幅度的量化误差。可以通过Quartus II的IP核资源创建。
Verilog编写的DDS模块主要由三部分组成,
一、相位累加器,用于决定输出信号频率的范围和精度;
二、正弦函数功能表(波形存储器),用于存储经量化和离散后的正弦函数的幅值;
三、查表模块,相位累加器的输出地址查表。
两种方法可以改变输出信号的频率:
(1)改变查表寻址的时钟频率,可以改变输出波形的频率。
(2)改变寻址的步长来改变输出信号的频率。步长即为对数字波形查表的相位增量。由累加器对相位增量进行累加,累加器的值作为查表地址。
相位累加器是DDS 的核心所在,它由一个加法器和一个位相位寄存器组成,每来一个时钟,相位寄存器以步长K累加,相位寄存器的输出与相位控制字相加,然后输入到正弦查询表地址上。正弦查询表包含一个周期正弦波的数字幅度信息,每个地址对应正弦波中0-2pi范围的一个相位点。查询表把输入的地址相位信息映射成正弦波幅度的数字量信号。相位寄存器每经过2^N/K 个fc 时钟后回到初始状态,相应地正弦查询表经过一个循环回到初始位置,输出一个正弦波。
输出正弦波周期为fo=fc* K/2^N,最小分辨率为f=fc/2^N。(通过fc和K控制正弦波频率精度) 其中,N 为累加器位宽,K 为步长,fc 为时钟频率。计数模(最大值):M=2^N。
一般正弦波表幅度地址位宽与累加的查表地址位宽不同,按前者位宽取后者对应高位的位宽即可。
操作步骤: 1.用MATLAB生成符合要求的mif文件;
2.根据DDS原理设计Verilog代码;
3.modelsim仿真验证。
Quartus工程见附件,MATLAB程序见附件
仿真图如下所示:
在modelsim中进行插值:Format->Format->analog(custom)->analog interpolated