DDS结构的FPGA实现

本文介绍了DDS(直接数字合成)技术的工作原理,包括其基本结构、相位累加器、频率控制和相位控制的运用。详细讲解了如何通过FPGA实现DDS,以及如何调整频率和输出策略以满足不同需求。最后展示了在FPGA上双通道输出信号的应用实例,包括相位差和频率变化。
摘要由CSDN通过智能技术生成

一. DDS介绍

        DDS(Direct Digital Synthesis,直接数字合成)是一种用于生成可编程频率输出信号的数字信号处理技术。它通过在数字域中直接生成数字信号,并通过数字到模拟转换器(DAC)将其转换为模拟信号输出。DDS利用累加器和相位累加器生成数字相位值,并通过查表或数学运算将其转换为模拟输出信号。DDS具有高分辨率、频率稳定性和相位连续性的优势,可广泛应用于通信系统、测试设备、音频设备、雷达系统等领域。通过数字控制,DDS实现了灵活、精确的信号生成和调节,具有快速频率切换和低谐波失真等特点。

二.DDS的基本原理

DDS基本结构:

        如图可以看出该模块有三个输入端:系统时间CLOCK;频率控制字FWORD;相位控制字PWORD; 与一个输出端:信号输出。

        主要由四部分组成:相位累加器;相位调制器;波形数据表ROM;D/A转换器。

   其中相位累加器由 N 位加法器与 N 位寄存器构成。每个时钟周期的时钟上升沿,加法器就将频率控制字与累加寄存器输出的相位数据相加,相加的结果又反馈至累加寄存器的数据输入端,以使加法器在下一个时钟脉冲的作用下继续与频率控制字相加。这样,相位累加器在时钟作用下,不断对频率控制字进行线性相位累加。即在每一个时钟脉冲输入时,相位累加器便把频率控制字累加一次。
        相位累加器输出的数据就是合成信号的相位。相位累加器的溢出频率,就是DDS输出的信号频率。相位累加器输出的数据,作为波形存储器的相位采样地址,这样就可以把存储在波形存储器里的波形采样值经查表找出,完成相位到幅度的转换。波形存储器的输出数据送到D/A转换器,由D/A转换器将数字信号转换成模拟信号输出。

  DDS原理流程图:  

         相位累加器位数为N位(N的取值范围实际应用中一般为24~32),相当于把正弦信号在相位上的精度定义为N位,所以其分辨率为1/2^{N}。  

频率控制字

        若DDS的时钟频率为F_{clk},频率控制字FWORD为1,则输出频率为F_{out}=\frac{F_{clk}}{2^{N}},这个频率相当于”基频“。若FWORD为B,则输出频率为F_{out}=B\times \frac{F_{clk}}{2^{N}}

推导:当使用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. 取点间隔为1

    F_{clk} = 1000HZ(周期是1ms)

    F_{0} = 1000/32    2^{N}        N=5

    F_{0} = F_{clk} / 2^{N}

  2. 取点间隔为2

    F_{clk} = 1000HZ(周期是1ms)

    F_{0} = 1000/(32 / 2)    2^{N}        N=5

    F_{0} = F_{clk} / (2^{N}/ 2)

  3. 取点间隔为0.5

    F_{clk} = 1000HZ(周期是1ms)

    F_{0} = 1000/(32 / 0.5)    2^{N}        N=5

    F_{0} = F_{clk} / (2^{N}/ 0.5)=  F_{clk} / (2^{N+1}/ 0.5*2)

        频率控制字FWORD B  

        F_{0} = F_{clk} / (2^{N} / B) = F_{clk} * B / 2^{N}

N = 32//输出32个点,每1ms输出一个点Fo = Fclk/(2^32/2^27)B= 2^27

一个完整的周期,被分成了2^32个点,输出32个点,每1ms输出一个点,得到一个完整周期的波形。
                                                        2^32/32= 2^27

相位控制字

 

取ROM地址加偏移值(相位控制字)。

三.FPGA的DDS实现

根据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°。

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA DDS (数字信号处理器直接数字合成)是一种可调波形的技术。DDS是一种通过数字方式实现信号合成的技术,它使用数字技术来产生不同频率的信号波形。 FPGA (可编程逻辑门阵列)是一种可重构硬件设备,可以使用Verilog或VHDL等硬件描述语言来编程实现不同的功能。在FPGA实现DDS功能可以实现高灵活性和高性能的可调波形。 FPGA DDS可调波形使用相位累加器和查找表来生成一个精确的、连续的信号波形。相位累加器根据设定的频率和相位来控制输出波形的精度,而查找表则存储了预先计算好的采样值。通过不断修改相位累加器的值,DDS可以精确地生成不同频率和相位的信号。 FPGA DDS可调波形具有以下优点: 1. 高灵活性:DDS可以通过修改相位累加器的值来实现任意频率和相位的合成信号波形,使得其在各种应用中具有广泛的适应性。 2. 高精度:DDS使用数字方式进行信号合成,可以实现非常精确的波形合成,具有较低的相位和频率误差,使其在需要高精度的应用中得到广泛应用。 3. 高性能:FPGA作为硬件设备,具有高速的计算和处理能力,可以实现实时的、高性能的DDS波形合成,满足对实时性能要求较高的应用场景。 总之,FPGA DDS可调波形技术是一种利用FPGA实现的数字信号合成技术,在灵活性、精度和性能方面具有明显优势,广泛应用于通信、雷达、医疗等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值