赞
踩
DDS(Direct Digital Frequency Synthesizer)直接数字频率合成器,也可叫DDFS。 DDS是从相位的概念直接合成所需波形的一种频率合成技术。 不仅可以产生不同频率的正弦波,而且可以控制波形的初始相位。
DDS的原理如下:
相位累加器(Phase Accumulator):DDS的核心是一个相位累加器,它是一个计数器,用于不断累加一个固定的数值,该数值由所需的输出频率和时钟频率决定。
数字控制字(Digital Control Word):用户输入所需的频率、相位、幅度等信息,这些信息经过处理后生成一个数字控制字,用于控制相位累加器的行为。
相位到幅度转换(Phase-to-Amplitude Conversion):通过将相位信息转换成幅度信息,可以产生所需的波形。通常使用一个查找表(或者称为振幅表)来实现相位到幅度的转换。
数字-模拟转换(Digital-to-Analog Conversion):最终,经过相位到幅度转换后的数字信号需要转换成模拟信号。这一步通常由一个数模转换器(DAC)完成。
总的来说,DDS的工作原理就是通过累加相位并将相位映射到幅度,来生成高精度、可调频率的模拟信号。由于所有的操作都是在数字域进行的,因此DDS具有高精度、灵活性好、可编程性强等优点,被广泛应用于频率合成、信号调制、信号发生器等领域。
上文我们讲了DDS的设计框图,这一部分继续往下展开。
使用DDS设计基于FPGA的信号发生器是一种常见的应用,它允许您在数字域内生成各种类型的信号,如正弦波、方波、三角波等,并且可以通过FPGA进行实时控制和调整。下面是一个简单的步骤指南:
选择合适的FPGA平台:首先,选择适合您需求的FPGA开发板或芯片。确保该FPGA平台具有足够的资源和性能来实现DDS和其他所需的功能。
编写DDS核心模块:在FPGA中实现DDS需要编写相应的Verilog或VHDL代码。这个DDS核心模块通常包括相位累加器、振幅表、数字控制字的生成逻辑等。您可以根据您的需求选择不同的DDS算法和精度。
设计波形输出模块:在DDS核心模块之后,设计一个波形输出模块,用于将DDS生成的数字信号转换成模拟信号。这通常需要使用数模转换器(DAC),以便将数字信号转换为模拟信号输出到外部设备。
编写控制逻辑:如果您需要实现实时控制和调整DDS参数(如频率、相位、幅度等),则需要编写相应的控制逻辑。这可能涉及使用FPGA内部的时钟、计数器和其他逻辑资源。
验证和调试:在将所有模块集成到一起之后,进行验证和调试是非常重要的。确保DDS能够正确地生成您所需的信号,并且控制逻辑能够有效地调整参数。
集成到整个系统中:一旦验证通过,将DDS信号发生器集成到您的目标系统中。这可能涉及与其他模块的接口和通信,确保DDS与整个系统协调工作。
性能优化和调整:最后,对系统进行性能优化和调整,确保它能够满足您的性能要求,并且稳定可靠。
主要构成:
内部:相位累加器,正弦查找表
外围:DAC,LPF(低通滤波器)
框图显示了DDS的基本原理。以下是各个部分的简要说明:
Frequency Control Registers:这里存储了控制DDS输出频率的参数。这些参数可以由用户编程或者外部输入。
Phase Accumulator:这是DDS的核心部分。它通过累加频率控制寄存器中的值来生成一个相位累加器。这个累加器的值被用作相位到幅度转换的输入。
Phase-to-Amplitude Converter:相位累加器的值被输入到这个模块中,它将相位信息映射到相应的振幅值。通常,这里使用一个查找表(或者称为振幅表)来实现相位到幅度的转换。
Digital-to-Analog Converter (DAC):最后,经过相位到幅度转换后的数字信号需要转换成模拟信号。这个模块通过DAC将数字信号转换为模拟信号,输出到外部设备或者用于后续处理。
整体来说,DDS(Direct Digital Synthesis)的工作过程可以简述如下:
初始化:
相位累加器更新:
相位到幅度转换:
数字到模拟转换(DAC):
重复步骤2至4:
外部控制和调整:
而本文需要着重突出的过程在于:
1、将存于ROM中的数字波形,经DAC,形成模拟量波形。
2、改变寻址的步长来改变输出信号的频率。 步长即为对数字波形查表的相位增量。由累加器对相位增量进行累加,累加器的值作为查表地址。
3、DAC输出的阶梯形波形,经低通滤波,成为模拟波形。
频率控制是DDS(Direct Digital Synthesis)中的一个关键环节,它负责控制输出信号的频率。下面是频率控制环节的一般工作流程:
设定目标频率:
计算相位累加器的增量:
更新频率控制寄存器:
相位累加器的累加:
产生输出信号:
调整和反馈:
持续运行:
在程序中,采样时钟是50M,N相位累加器的位宽是32,M频率控制字的位宽是16位;可以控制的最大的频率就是65535*50000000/4294967296=762Hz;在该工程中,有四个文件时用来控制频率的,如下:
其中adder_32和reg32用来控制频率的快慢,请记住这样一个原理:
波形的产生是通过产生一个ROM的寻址信号对存放波形的ROM进行寻址,然后得到ROM中的数据。而寻址的快慢就是波形输出的频率,所以通过控制对ROM的寻址快慢就可以控制频率了。这里控制频率的实现是通过一个32位的加法器和一个32位的寄存器进行寻址的;32位加法器的加数分别来自控制频率信号set_f和reg32模块反馈回来32为数,其实set_f就是32位加法器的一个步进值,同时也是ROM寻址的步进尺度。通过控制这个尺度就可以控制频率了。当这个尺度越大,频率就越高,相反则越小,如果想确定有多高和有多小就得用下面这个公式进行计算:
为什么要把reg32的数重新加到adder_32呢?
因为要不断地去寻址,要把ROM里面的数据都读出来,而ROM里面的数据就是一个周期的波形,所以要不断地累加上去。
相位控制是DDS(Direct Digital Synthesis)中的另一个重要环节,它负责控制输出信号的相位。以下是相位控制的一般工作流程:
设定目标相位:
计算相位累加器的初始值:
更新相位控制寄存器:
相位累加器的累加:
产生输出信号:
调整和反馈:
持续运行:
相位的控制其实和频率一样,这里先讲一个故事,有两个人(A、B)同时从一个起点出发,他们的速度相同,跑了一半之后A突然加速,而B一直保持原速,A加速到和B相差10米后保持原速,然后两个人一直跑下去。
这里可以把他们等同于两个波形,本来寻址的速度是一样的,后来其中一个的步进值变大了(大了10米),这样就是相位超前了,A超了B十米。
工程中这部分的内容在:
这里还要讲一个知识点,就是截断,有没有发现,我们的ROM的地址是10位的,那怎么把前面所说的32位弄出来呢?请看一个图:
截断就是把32位累加器的高10位拿出来作为相位累加器的值进行相加,而相位控制字就是控制相位超前和延后的控制参数。
波形控制负责控制输出信号的波形形状,例如正弦波、方波、三角波等。以下是波形控制的一般工作流程:
选择波形类型:
根据波形类型生成振幅表:
选择振幅表:
相位到幅度转换:
数模转换:
调整和反馈:
持续运行:
波形的控制就是,采用编码的方法,0的时候为正弦波,1的时候为三角波,2的时候为方波,3的时候为锯齿波。按照DDS的原理,理论上是什么频率都可以到达的,当然这得看你的系统时钟有多高,频率累加器的位数有多宽了。工程总采用的是50M和32位,频率的分辨率是0.012的。因为频率控制字set_f我只用了16位,所以最大只能输出762Hz,如果你要提高输出频率,必须把32位都用上去。当然还要看DAC的最大转换频率了。其数据最大的更新速度就是1.21MHz。
波形存储涉及将波形数据存储在内部存储器中,以便后续使用。以下是波形存储的一般工作流程:
波形数据获取:
数据处理:
存储波形数据:
选择存储的波形:
相位到幅度转换:
数模转换:
调整和反馈:
持续运行:
正弦信号相位与幅度的对应关系
可以将正弦波波形看作一个矢量沿相位圆转动,相位圆对应正弦波一个周期的波形。波形中的每个采样点对应相位圆上的一个相位点。
相位累加器的值作为ROM的地址,读取ROM的相位幅度,实现相位到幅度的转换。
在DDS(Direct Digital Synthesis)系统中,AD(模数转换)和滤波是将数字信号转换为模拟信号的重要步骤。以下是它们的一般工作流程:
模数转换(AD转换):
滤波:
输出模拟信号:
分析:
DDS优点
DDS缺点
讲幅值的控制之前,要先科普一下DAC,DAC就是一个把数字信号编程模拟信号的器件,输出的电压范围和器件所接的参考电压,开发板上的DAC的工作电压是5V,参考电压也是5V。所以输出的电压范围也是0~5V。因为TLC5615是10位精度的DAC,所以其电压分辨率是5/1023=0.00489V。比如你要输出个2.5V,那你就必须把数512往里面送,输出大约就是2.5V了。
知道了DAC是怎么控制输出电压之后,再来了解怎么控制怎个波形的电压范围。因为ROM中存储的波形表最大的数为1023所以,能够输出的峰值是5V,y=kx。现在我们把这个5V分为10份,每一份就是0.5V,当我们要输出y=3V时,有计算得出,k=0.6。这种就是等比例放大与缩小输出控制法。
这部分在工程中是如何操作的呢?首先,将ROM的数据读出(怎么读出要看频率控制那一部分),然后将读出的数dds_data_reg乘以一个小于10的数,再除以10,因为在FPGA中你是无法直接进行小数运算的,也没有相关的描述语言可以描述,所以必须要这样做。
幅值控制负责控制输出信号的振幅。以下是幅值控制的一般工作流程:
设定目标幅值:
计算幅值控制寄存器的值:
更新幅值控制寄存器:
相位到幅度转换:
数模转换:
调整和反馈:
持续运行:
程序详见:
这样就可以很方便控制输出波形的电压范围了。当你想提高控制的精度时,你可以将小数点后增加一个,这时就乘以一个两位数,然后除以100了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。