FPGA 之 DDS简易 原理阐述

DDS(Direct Digital Synthesizer) 即数字合成器 ,可以通过修改FWORD(频率控制字) 和 PWORD(相位控制字) 来较容易实现

频率、相位、以及幅度的控制,在通信领域运用较为广泛。其原理图如下图所示

 FPGA 之 DDS简易 原理阐述


下面以代码的形式来解释此图的原理 

假设Clk 时钟频率为100MHZ 周期为10ns ,假设 data 可以组成32点正弦波信号

[email protected](posedge Clk)

 time <= time +1'b1 ;

case(time)

0 :data =  0

1:data =  1

2:data = 2.5

3:data = 3.7

此处省略

31:data =0 ;

可知 : 一个正弦波周期为 32*10 即 320ns 频率为 1/320 * 10^9 hz ,要想使其变为周期为160ns 的正弦波 我们知道 每隔10ns 输出一个点 ,要想周期为160ns 则需输出 160/10 个点 即16个点 ,我们怎么控制系统输出16个点呢? 仔细想一想就知道只需要将 time <= time + 1 ;改为 time <= time + 2 即可 ;而time <= time + B正好对应的就是累加器的电路图 ,完全是DDS的思想 。

为了进一步理解DDS原理 , 仍以代码的形式进行理解 。

一般情况下 FWORD为32位 ,ROM为位宽11位  即2048个点来构成正弦波 ,也就是说一个固定的正弦波周期为2048*10ns ,要想生成频率为Fout 的正弦波只能更改要显示的正弦波的点数,怎么改变正弦波要显示的点数呢?只能通过time ,根据不同的需求来进行隔点采样 ,这样就可以得出 Fout = Fclk *2^N / B ;

上述公式可以这么理解 ,已知输出一个点所需时间为1/Fclk ,那么要输出多少个点才可以控制有个正弦波周期为1/Fout 呢 ?

即可以通过改变B值 ,来求出输出的点数 ,即 1/Fclk  * (实际输出点数) = 1/Fout ;而实际输出点数为 2^N /B (简单的数学知识

可以这么理解 一共输出2^N个点每隔B个点输出一个总共输出几个点? 就可以简单的理解了FPGA 之 DDS简易 原理阐述) 所以可得 : Fout = Fclk *2^N /B ;

而相位控制字相当于位便宜一个由2048个点组成的正弦波如果其实地址+1024的话 相当于翻转了180度 。通过更改相位控制字可以改变你要从哪个起始点开始显示 ,即改变了你要显示正弦波的相位 。

                                  (由于笔者能力有限 ,仅从自己理解的方向来简单的阐述了一下DDS的原理,存在不足的地方,望谅解)