DDS发生器的频率控制字原理和基本结构(二)
在正弦波发生器的verilog实现(一)中已经实现了最基本的功能,这篇文章将主要讲解DDS发生器的频率控制字原理和基本结构。
在这里先给出DDS发生器的结构框图:
下面对结构框图的各部分进行解释:
- RAM部分:在正弦波发生器的verilog实现(一)部分,我们使用matlab产生了一个周期的正弦波信号,并且在一个周期中采集了256个样点,然后通过导入
.coe
文件,将这256个样点保存到RAM中,即:RAM中存放的是离散的正弦波信号(一个周期,256个样点),RAM使用的规格是256*8bit; - fc采样时钟:在FPGA中使用的是一个50MHZ的采样时钟,也就是在仿真时,每隔20ns,从RAM中读出一个采样值。
- 相位累加寄存器:相位累加器是整个DDS系统的核心,在这里完成相位累加功能。假设使用的是一个N为的寄存器(当我们采集的样点为256个,则可以使用一个8位的寄存器)。每来一个时钟脉冲fc,加法器(位于频率控制字和相位累加器寄存器之间)将频率控制字K和相位累加寄存器输出的结果相加,把相加后的结果送到相位累加寄存器中。相位累加器输出的数据就是合成信号的相位,相位累加器的溢出频率就是DDS输出的信号频率。对应到我的上一个文章,相位累计寄存器中的值就相当于RAM的地址(addr),通过该地址就可以找到波形的抽样值。
- 频率控制字M:频率控制字控制着DDS 所输出的正弦波的频率。为了便于理解,还是对应到前一篇文章,频率控制字就相当于
ex_dds
模块中给addr所加的步长值,比如我们定义的是addr <= addr + 1'b1
,其中,后面的1'b1
就可以理解为频率控制字M。
为了便于理解,我们从FPGA的角度说明。假设使用的FPGA的时钟频率是fc=50MHZ
,则每隔20ns从RAM中读出一个采样,而我们在RAM中从放的是离散的正弦波信号,存放了一个周期,一共256个样点。所以,在读取RAM时,读完256个样点所用的时间是固定的(所用时间是256*20ns = 5120ns,单位就不换算了,影响不大),当频率控制字M=1
时,即:addr <= addr + 1'b1
,则在5120ns
内,我们可以输出一个周期的正弦波信号;但是当我们改变频率控制字M=2
时,即:addr <= addr + 2'd2
,则同样在5120ns
内,我们可以输出两个周期的正弦波信号(因为此时addr的变化值是:0,2,4,…,254,当addr第一次到达254时,输出了一个周期的正弦波信号,用时2560ns
;接着addr因为溢出,所以又从0开始变化,当第二次到达254时,输出了一个周期的正弦波信号,用时2560ns
,所以在5120ns
内一共输出了两个周期的正弦波信号);所以通过改变频率控制字M的值,就可以改变DDS输出的正弦波的频率。
M=1时的仿真结果:可以看到5120ns内输出了一个周期
M=2时的仿真结果:可以看到5120ns内输出了两个周期
目标频率 f0
下面我们推倒DDS 输出的正弦波的频率公式:
假设采样时钟的频率为fc
,频率控制字为M
,相位累加寄存器的位宽为n
,则相位累加器中的最大值为2^n-1
,当超过该值时,相位累加寄存器中的值就会溢出,然后从0开始计数。
因为采样时钟的频率为fc,频率控制字为M,则每隔1/fc
,相位累计寄存器中的值就增加M,所以,在1s内,相位累加寄存器中的值增加的大小为(1/(1/fc))*M = fc * M
,又因为寄存器中最大表示的值为2^n-1
,所以可以计算出1s内溢出的次数为fc * M / 2^n
,因为寄存器中的值从0增加到2^n-1,刚好输出一个周期的正弦波信号。所以,寄存器溢出的次数就是输出正弦波的周期数。
1s内输出正弦波的周期数就为DDS输出的正弦波的频率,也就是我们的目标频率 f0 = fc * M / 2^n
。
比如我们上一篇中,fc = 50Mhz,M = 1,n = 8
,所以可以计算出目标频率f0 = 195Mhz
;当M = 2
时,f0 = 390Mhz
;M = 2
刚好是M = 1
时目标频率的2倍,
当已知目标频率,求频率控制字M时,M = f0 * 2^n / fc
。
下一篇将介绍DDS发生器的verilog实现
今天的文章dds频率控制字和频率的关系_基于单片机的dds信号发生器[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/76476.html