DDS信号发生器的原理及其公式推导(学习笔记)

1 篇文章 0 订阅
1 篇文章 0 订阅

1.DDS发生器结构图

DDS信号发生器结构图

        上图是DDS信号发生器结构图。相信很多没接触过的同学看到这些名词:频率字输入,累加寄存器,相位累加器等等的名词都懵了,也不知道DDS发生器中的公式:F_out=F_clk/2^n*A是怎么来的一会我将详细介绍DDS的原理,理解了原理看懂DDS发生器的结构图就手到擒来了。我们先了解这些名词的作用:

频率字输入F_WORD:输入的F_WPRD越大,所输出波形频率越高。

相位字输入P_WORD;输入的P_WORD越大,初相位越大。

2.DDS信号发生器的基本原理

        首先我们要理解一个问题:DDS信号发生器是怎么通过数字信号产生模拟波形的?很显然,是由波形数据表ROM跟DA转换器来形成的,首先我们介绍什么是波形数据表ROM。

        波形数据表ROM就是一块用于存储波形数据表的只读存储器,那么波形数据表中的数据从何而来?我们可以通过matlab或者python等一系列软件生成对应的波形信号数据,把这些数据写入到rom当中,并通过控制rom的地址来实现数据的输出,把数据输出到DA转换器后,DA转换器会把波形数据表中的数据转换成电压信号,并通过低通滤波器来实现模拟信号的产生。

        由此我们又产生了一个新的问题,如何控制rom的地址?并且如何改变频率跟初相位呢?

        首先回答第一个问题:如何控制地址?我们可以通过一个计数器来实现。每次时钟信号有效时计数器+1,地址+1,这样就实现了地址的控制。虽然这样实现了地址的控制,但是频率如何改变呢?

        所以引出了第二个问题,如何改变频率跟初相位呢?我们假设rom中有2048个数据,每个数据大小为1个字节,假设我们的时钟是100Mhz,由计数器的思路我们知道,每一次上升沿我们使地址+1,也就是10ns地址+1,这样我们得到我们把rom中的数据输出成波形需要2048*10ns,频率也就是48,828.125HZ,那么这个频率跟什么有关?没错,就是这个周期内数据采样的次数。这2048个数据我们每个数据都采样一次,频率是48828,那么我们每个数据采样两次呢?频率是不是就减少一倍?我们每隔一个数据采样,是不是频率就翻倍?这就是DDS频率控制的基本原理。那么又引出了一个新的问题:如何控制地址达到一个数据多次采样或者隔位采样呢?

        如何控制地址达到一个数据多次采样或者隔位采样呢?我们可以用累加寄存器的方法,也就是我们图中不懂的那个名词,那么究竟是什么方法?在verilog语言中我们可以这样表述:

reg [31:0] data_add;//地址信号,用于累加
wire [10:0] data_add_reg;//rom实际地址控制信号

always@(posedge sys_clk or negedge sys_rst_n)//sys_clk是时钟,sys_rst_n是复位信号
    if(sys_rst_n == 1'b0)
    data_add <= 32'd0;
    else
    data_add <= data_add + A;

assign data_add_reg = data_add[31:21];

        这里是以rom中有2048个数据,每个数据大小为1个字节为例。我们看到,我们定义了两个信号data_add,data_add_reg,有的同学会问这不是多此一举吗?直接用一个信号控制不就行了?而且这个信号的位数为什么这么取?

        首先data_add_reg为什么取11位呢,我们知道我们rom中有2048个数据,对应了2048个地址,地址就是0~2047,地址最大就是2047,对应的二进制就是11_111_111_111,所以取11位,那么为什么取data_add这个信号?而且为什么取了32位这么大,而且A是什么意思?

        首先我们回答A是什么,A其实就是我们结构图中的频率字输入F_WORD,这里我们的计数器不是+1了,而是加A,并且实际地址我们取了data_add的高11位,那么有的同学会问这样的目的是什么?假设我们的A是1,我们要加2^21次方次是不是才能使得data_add_reg增加1?那么我们岂不是在2^21次的上升沿过后地址才移位一次?也就是同一个数据采样了2^21次?那么2048个数据采样的时间是不是特别特别长?所以频率是不是就很低?同理,当我们A等于2^21次方时,是不是就是一个上升沿data_add_reg增加1?这不就是跟我们之前算的一样?这时的频率是48828HZ,同理,当我们A更大时,是不是一个上升沿data_add_reg增加2或者3或者更多,这样是不是实现了隔位采样?这样是不是实现了频率的提高?所以,你看,我们仅仅通过A的改变就实现了频率的增减,并且这个频率的增减不单纯是倍数的改变,而是很线性的。这也是公式F_out=F_clk/2^n*A的由来,这个n就是我们data_add取的位数,当然我们可以不取32位,可以取更高或者更低,取得更高可以提高我们调频的精度,取得更低可以节省资源。

        所以我们把这种+A而不是+1的计数器叫做累加寄存器,这也是图中这个名词的由来。那么我们解决了调节频率的问题,我们又如何控制调相呢?

        这个问题相对来说很简单,只需要data_reg_reg+B就可以,B就是我们的相位字输入P_WORD,当我们B等于0的时候,相当于从地址0开始取样,当我们B不是0的时候,相当于从地址B开始取样,这样就实现了相位的改变。

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值