赞
踩
DDS(Direct Digital Synthesis,直接数字合成)是一种用于生成可编程频率输出信号的数字信号处理技术。它通过在数字域中直接生成数字信号,并通过数字到模拟转换器(DAC)将其转换为模拟信号输出。DDS利用累加器和相位累加器生成数字相位值,并通过查表或数学运算将其转换为模拟输出信号。DDS具有高分辨率、频率稳定性和相位连续性的优势,可广泛应用于通信系统、测试设备、音频设备、雷达系统等领域。通过数字控制,DDS实现了灵活、精确的信号生成和调节,具有快速频率切换和低谐波失真等特点。
如图可以看出该模块有三个输入端:系统时间CLOCK;频率控制字FWORD;相位控制字PWORD; 与一个输出端:信号输出。
主要由四部分组成:相位累加器;相位调制器;波形数据表ROM;D/A转换器。
其中相位累加器由 N 位加法器与 N 位寄存器构成。每个时钟周期的时钟上升沿,加法器就将频率控制字与累加寄存器输出的相位数据相加,相加的结果又反馈至累加寄存器的数据输入端,以使加法器在下一个时钟脉冲的作用下继续与频率控制字相加。这样,相位累加器在时钟作用下,不断对频率控制字进行线性相位累加。即在每一个时钟脉冲输入时,相位累加器便把频率控制字累加一次。
相位累加器输出的数据就是合成信号的相位。相位累加器的溢出频率,就是DDS输出的信号频率。相位累加器输出的数据,作为波形存储器的相位采样地址,这样就可以把存储在波形存储器里的波形采样值经查表找出,完成相位到幅度的转换。波形存储器的输出数据送到D/A转换器,由D/A转换器将数字信号转换成模拟信号输出。
相位累加器位数为N位(N的取值范围实际应用中一般为24~32),相当于把正弦信号在相位上的精度定义为N位,所以其分辨率为。
若DDS的时钟频率为,频率控制字FWORD为1,则输出频率为
,这个频率相当于”基频“。若FWORD为B,则输出频率为
。
推导:当使用FPGA控制DAC输出一个周期的正弦信号时,每1ms输出一个数值。如果每个点都输出,则总共输出这一个完整的周期信号需要输出32个点,因此输出一个完整的信号需要32ms,可知输出信号的频率为1000/32Hz。
现要求输出信号的频率翻倍(16ms将这个正弦波输出完),DAC的输出固定(1ms输出一个数值)。
如果需要用同样一组数据来输出一个2*(1000/32)Hz的正弦信号,因为输出信号频率为2*(1000/32)Hz,那么输出一个完整的周期的正弦波所需要的时间为32/2,即16ms。为了保证输出信号的周期为16ms,我们需要对我们的输出策略进行更改,上面输出周期为32ms的信号时,我们采用的为逐点输出的方式,以32个点来输出一个完整的正弦信号,而我们FPGA控制DAC输出信号的频率固定为1ms。因此,我们要输出周期为16ms的信号,只能输出16个点来表示一个完整的周期。我们就选择以每隔一个点输出一个数据的方式来输出即可。我们可以选择输出(1、3、5、7.....9、31)这些点,因为采用这些点,我们还是能够组成一个完整的周期的正弦信号,而输出时间缩短为一半,即频率提高了一倍。最终结果如图所示。
- 取点间隔为1
= 1000HZ(周期是1ms)
= 1000/32
N=5
=
/
- 取点间隔为2
= 1000HZ(周期是1ms)
= 1000/(32 / 2)
N=5
=
/ (
/ 2)
- 取点间隔为0.5
= 1000HZ(周期是1ms)
= 1000/(32 / 0.5)
N=5
=
/ (
/ 0.5)=
/ (
/ 0.5*2)
频率控制字FWORD B
=
/ (
/ B) =
* B /
N = 32//输出32个点,每1ms输出一个点Fo = Fclk/(2^32/2^27)B= 2^27
一个完整的周期,被分成了2^32个点,输出32个点,每1ms输出一个点,得到一个完整周期的波形。
2^32/32= 2^27
取ROM地址加偏移值(相位控制字)。
根据DDS的基本结构来写:
- //频率控制字同步寄存器
- always@(posedge sys_clk)
- Fword_r <= Fword;
-
- //相位控制字同步寄存器
- always@(posedge sys_clk)
- Pword_r <= Pword;
相位累加器
- //相位累加器
- always@(posedge sys_clk or negedge sys_rst_n)
- if(!sys_rst_n)
- Freq_ACC <= 0;
- else
- Freq_ACC <= Freq_ACC + Fword_r;
波形数据表地址
- // 波形数据表地址
- assign Rom_Addr = Freq_ACC[31:20] + Pword_r ;
例化三个波形数据表
- rom_sine rom_sine (
- .clka(sys_clk), // input wire clka
- .addra(Rom_Addr), // input wire [11 : 0] addra
- .douta(Data_sine) // output wire [13 : 0] douta
- );
-
- rom_square rom_square (
- .clka(sys_clk), // input wire clka
- .addra(Rom_Addr), // input wire [11 : 0] addra
- .douta(Data_square) // output wire [13 : 0] douta
- );
-
- rom_triangular rom_triangular (
- .clka(sys_clk), // input wire clka
- .addra(Rom_Addr), // input wire [11 : 0] addra
- .douta(Data_triangular) // output wire [13 : 0] douta
- );

总的代码:
- module DDS_Module(
- input sys_clk,
- input sys_rst_n,
- input [1:0] Mode_Sel,
- input [31:0] Fword,
- input [11:0] Pword,
-
- output reg [13:0] Data
- );
-
- reg [31:0] Fword_r;
- reg [11:0] Pword_r;
- reg [31:0] Freq_ACC;
- wire [11:0] Rom_Addr;
-
- wire [13:0] Data_sine,Data_square,Data_triangular;
-
-
- //频率控制字同步寄存器
- always@(posedge sys_clk)
- Fword_r <= Fword;
-
- //相位控制字同步寄存器
- always@(posedge sys_clk)
- Pword_r <= Pword;
-
- //相位累加器
- always@(posedge sys_clk or negedge sys_rst_n)
- if(!sys_rst_n)
- Freq_ACC <= 0;
- else
- Freq_ACC <= Freq_ACC + Fword_r;
-
- // 波形数据表地址
- assign Rom_Addr = Freq_ACC[31:20] + Pword_r ;
-
- rom_sine rom_sine (
- .clka(sys_clk), // input wire clka
- .addra(Rom_Addr), // input wire [11 : 0] addra
- .douta(Data_sine) // output wire [13 : 0] douta
- );
-
- rom_square rom_square (
- .clka(sys_clk), // input wire clka
- .addra(Rom_Addr), // input wire [11 : 0] addra
- .douta(Data_square) // output wire [13 : 0] douta
- );
-
- rom_triangular rom_triangular (
- .clka(sys_clk), // input wire clka
- .addra(Rom_Addr), // input wire [11 : 0] addra
- .douta(Data_triangular) // output wire [13 : 0] douta
- );
-
- always@(*)
- case(Mode_Sel)
- 0:Data = Data_sine;
- 1:Data = Data_square;
- 2:Data = Data_triangular;
- 3:Data = 8192;
- endcase
-
-
-
- endmodule

Textbench代码:
- `timescale 1ns / 1ps
- module DDS_Module_tb(
- );
-
- reg sys_clk;
- reg sys_rst_n;
- reg [1:0] Mode_SelA,Mode_SelB;
- reg [31:0] FwordA,FwordB;
- reg [11:0] PwordA,PwordB;
-
- wire [13:0] DataA,DataB;
-
-
- DDS_Module DDS_ModuleA(
- .sys_clk (sys_clk) ,
- .sys_rst_n (sys_rst_n) ,
- .Mode_Sel (Mode_SelA) ,
- .Fword (FwordA) ,
- .Pword (PwordA) ,
-
- .Data (DataA)
- );
-
- DDS_Module DDS_ModuleB(
- .sys_clk (sys_clk) ,
- .sys_rst_n (sys_rst_n) ,
- .Mode_Sel (Mode_SelB) ,
- .Fword (FwordB) ,
- .Pword (PwordB) ,
-
- .Data (DataB)
- );
-
- initial sys_clk = 1;
- always #10 sys_clk = ~sys_clk;
-
- initial begin
- sys_rst_n = 0 ;
- FwordA = 65536;
- PwordA = 0 ;
- FwordB = 65536;
- PwordB = 1024;
- Mode_SelA = 2'b00;
- Mode_SelB = 2'b00;
- #201
- sys_rst_n = 1;
- #5000000
- FwordA = 65536 * 1024;
- FwordB = 65536 * 1024;
- PwordA = 0;
- PwordB = 2048;
- #1000000
- $stop;
- end
-
-
- endmodule

根据测试文件可知 ,建立了双通道输出信号:
A通道与B通道均采用正弦波波形ROM表,前5ms B通道的相位与A相差90°;
后1ms AB通道的频率增加1024倍,B通道与A的相位差180°。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。