fpga_feixiang 发表于 2020-6-22 14:28:24

DDS频率可调原理

如何得到我们想要的任意频率的波形发生器呢?   因为事先的波形数据是存在ROM里面的,每给rom一个地址,就可以读出ROM里的相应的数据,rom的深度是事先定好的256,地址范围是0-255。所以DDS就是循环读取ROM里的数据,系统时钟是50MHZ,若每个时钟地址加1,则有输出的信号为50M/256=195.3K。此时的频率就是这么大,但是我们不想要这个频率怎么办?

观察上述描述,我们看到最后的输出时钟是由采样时钟和地址深度决定的,所以可以通过对这两个地方着手更改,首先先看下采样时钟,原来是每个时钟的作用下,采集数据加1,现在可以通过对时钟计数,然后让地址在两个时钟作用下采集1,这样就可以实现分频的目的。

说完采样时钟,那么看下地址深度的问题,因为地址深度是由定制ROM时,就已经确认下来的,所以不能直接更改地址深度,但是可通过更改读取ROM的地址,使其只读其中的一半等,也可以达到效果。有奈奎斯特采样原理我们知道,在做ADDA转换的过程当中,采样频率要大于信号最高频率的两倍,才能保证信号不失真,这个方法说白了其实就是改变采样的点数,然后达到倍频的目的,不过因为这样做,点数采样的比较少,会导致波形失真。

   说完前面两种方法,也只是实现了整数倍频,和分数分频的目的,并不能实现我们所说的任意分频,那么怎么实现任意分频呢,这里就要介绍一种相对简单并且实用的方法。

首先需要明确的是输出信号的频率计算公式:







频率控制字fword和幅度控制字pword

前面介绍的两种方法中,一个是让时钟计数,时钟记多次地址加一下,另一种是地址每次加,但是不是加1 而是2,3,4这样的加,也可以实现分频。不过这两种方法都有各自的坏处,不能实现任意分频,现在我们介绍一种比较简单的调频原理,前面那个公式说了输出信号 = 50M/256。这里的256 = 2^8。所以我们的地址之前定义就够了,前面两种都是通过计数的方式实现的调频,现在我们改变下思路,可以通过改变地址位宽的方法,然后读取的时候取数据地址的高八位,是否就可以实现功能。假设我们拓展为32位,最终输出的地址 取高8位。那么输出信号的最低频率是不是 = 50M/2^32 = 0.01164HZ。如果我们想要其他的频率,再在这个基础上乘就行了。怎么乘前面是不是已经讲过了,如果我要得到1K的,1K/0.01164 = 85911,我们让地址计数器每个时钟来了加85911。这样就可以实现比较方便的调频原理。

调相原理:

   调相相对来说比较简单,无外乎就是改变初始相位就可以了,实现方法就是定义一个调相控制字,当复位赋初值的时候将想要的初始相位赋给地址初值就可以了,实现起来相对简单。

zhangyukun 发表于 2020-6-22 17:14:01

DDS频率可调原理

zxopenhl 发表于 2020-6-22 17:39:08

DDS频率可调原理
页: [1]
查看完整版本: DDS频率可调原理