基于FPGA的DDS 信号发生器(三)

发布者:疯狂小马最新更新时间:2022-07-01 来源: csdn关键字:FPGA  DDS  信号发生器 手机看文章 扫描二维码
随时随地手机看文章

1 DDS原理

1.1 书上的解释

DDS(Direct Digital Synthesizer)技术是一种全新的频率合成方法,是从相位概念出发直接合成所需波形的一种频率合成技术,通过控制相位的变化速度,直接产生各种不同频率、不同波形信号的一种频率合成方法。

在这里插入图片描述

系统的核心是相位累加器,其内容会在每个时钟周期(system clock)更新。相位累加器每次更新时,存储在Δ相位寄存器中的数字字M就会累加至相位寄存器中的数字。假设Δ相位寄存器中的数字为00…01(即M=1),相位累加器中的初始内容为00…00。相位累加器每个时钟周期都会按00…01(M=1)更新。如果累加器为32位宽,则在相位累加器返回至00…00前需要2^32(超过40亿)个时钟周期,周期会不断重复。


相位累加器的截断输出用作正弦(或余弦)查找表的地址。查找表中的每个地址均对应正弦

波的从0°到360°的一个相位点。查找表包括一个完整正弦波周期的相应数字幅度信息。

(实际上,只需要90°的数据,因为两个MSB中包含了正交数据)。因此,查找表可将相位

累加器的相位信息映射至数字幅度字,进而驱动DAC。图3用图形化的“相位轮”显示了这

一情况。


考虑n = 32,M = 1的情况。相位累加器会逐步执行2^ 32 (2^n/M)个可能的输出中的每一个,直至溢出并重新开始。相应的输出正弦波频率等于输入时钟频率 2 ^ 32分频。若M=2,相位累加器寄存器就会以两倍的速度“滚动”计算,输出频率也会增加一倍。以上内容可总结如下:

在这里插入图片描述

1.2 自己的理解

DDS系统主要由相位累加器、波形存储器、数模(D/A)转换器和低通滤波器等四个大的结构组成,其结构框图如下图所示。

在这里插入图片描述参考时钟:

图中,参考频率f_clk为固定值,一般我们选择系统时钟(system clock),这里设置的是100MHz。

频率控制字:

用来调整输出信号的频率。如何根据参考频率得到输出频率,DDS IP的官方文档给出了相应公式。

在这里插入图片描述
在这里插入图片描述

相位控制字:

在这里插入图片描述

相位累加器:

由N位加法器与N位累加寄存器构成,它根据频率控制字k,完成相位值的累加,并将此累加值输入到波形存储器中。

波形存储器:

将相位累积器的值作为当地址,查找与相位值对应的信号数据,输出到D/A转换器。

D/A转换器:

将波形存储器输出的数字量转换为与之对应的模拟量。

低通滤波器:

由于D/A转换器存在量化误差,输出波形中存在混叠,需要在输出端使用低通滤波器进行滤波,提高信号的输出性能。


2 DDS IP的参数设置

在这里插入图片描述

需要注意的是,上面的频率分辨率(frequency resolution)的值是算出来的,这个值必须和summer的频率分辨率保持一致。100M/(2^20)=95.36743

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3 源码

程序结构

在这里插入图片描述

3.1 顶层文件

`timescale 1ns / 1ps



module top(

    input           sys_clk         ,// 系统时钟

    input           rst_n           ,// 系统复位

    input  [1:0]    key_PINC        ,// 频率控制字对应的按键

    input  [1:0]    key_POFF         // 相位控制字对应的按键

    );

 

 


 //-----------频率控制字模块

wire  [23:0]   PINC ;  //频率字

Fword_set Fword_set_inst(

        //input

        .clk        (sys_clk            ),

        .rst_n      (rst_n              ),

        .key_PINC   (key_PINC           ),

        //output

        .PINC       (PINC               )

        );




 //-----------相位控制字模块

 wire  [23:0]   POFF ;  //相位字

POFF_set POFF_set_inst(

    //input

    .clk        (sys_clk   )    ,

    .rst_n      (rst_n     )    ,

    .key_POFF   (key_POFF  )    ,

    //output

    .POFF       (POFF      )

    );






 //-------------DDS模块

//input

wire [0:0]   fre_ctrl_word_en  ;    


//output

wire [0:0]   m_axis_data_tvalid    ;

wire [47:0]  m_axis_data_tdata     ;

wire [0:0]   m_axis_phase_tvalid   ;

wire [23:0]  m_axis_phase_tdata    ;


assign fre_ctrl_word_en=1'b1;


dds_sin dds_sin_inst (

  .aclk                 (sys_clk                ),    // input wire aclk

  .s_axis_config_tvalid (fre_ctrl_word_en       ),    // input wire s_axis_config_tvalid

  .s_axis_config_tdata  ({POFF,PINC}           ),    // input wire [47 : 0] s_axis_config_tdata

 

  .m_axis_data_tvalid   (m_axis_data_tvalid     ),    // output wire m_axis_data_tvalid

  .m_axis_data_tdata    (m_axis_data_tdata      ),    // output wire [47 : 0] m_axis_data_tdata

  .m_axis_phase_tvalid  (m_axis_phase_tvalid    ),    // output wire m_axis_phase_tvalid

  .m_axis_phase_tdata   (m_axis_phase_tdata     )     // output wire [23 : 0] m_axis_phase_tdata

); 

    

endmodule


3.2 频率控制字模块

`timescale 1ns / 1ps

//

// 通过按键来选择对应的频率控制字,进而选择对应的信号频率

//



module Fword_set(

    input               clk         ,

    input               rst_n       ,

    input  [1:0]        key_PINC    ,

    

    output reg [23:0]   PINC

    );

    

    

//always@(posedge clk or negedge rst_n)

//begin

//    if(!rst_n)

//        key_sel <= 4'd0;

//    else

//        key_sel <= key_sel;

//end

   

   

//  The output frequency(f_out ) , of the DDS waveform is a function of the system clock frequency(f_clk ) .

//  the phase width, that is, number of bits (B )  in the phase accumulator 

//  and the phase increment value (deta_theta) . 

//  The output frequency in Hertz is defined by:f_out=f_clk*deta_theta/(2^B)

//  fre_ctrl_word是如何确定的?

// 根据IP核的summery, phase width=20bits   Frequency per channel=100MHz

// 输出频率的计算公式f_out=f_clk*deta_theta/(2^B)=100M* 104857/(2^20 )= 10M             

always@(*)

begin

    case(key_PINC)

        0:  PINC <= 'h28f5;     //1Mhz  10485  每次相位增加的值  deta_theta

        1:  PINC <= 'h51eb;     //2Mhz  20971

        2:  PINC <= 'ha3d7;     //4Mhz  41943

        3:  PINC <= 'h19999;    //10Mhz  104857

    endcase

end


 

endmodule


3.3 相位控制字模块

`timescale 1ns / 1ps

//

// 通过按键来选择对应的相位控制字,进而选择对应的信号初始相位

/



module POFF_set(

    input               clk         ,

    input               rst_n       ,

    input  [1:0]        key_POFF    ,

    

    output [23:0]       POFF

    );

    

    

//always@(posedge clk or negedge rst_n)

//begin

//    if(!rst_n)

//        key_sel <= 4'd0;

//    else

//        key_sel <= key_sel;

//end


// 根据IP核的summery, phase_width=20bits   Frequency per channel=100MHz

// 输出相位的计算公式:POFF=phase*phase_modulus/360

// phase:想要输出的相位,输入0~360即可

// phase_modulus:相位系数为2^phase_width-1=2^20-1,

// phase_width即相位位宽,在生成IP的summary可以查看

reg  [8:0]   phase;    //0-360   

   

always@(*)

begin

    case(key_POFF)

        0:  phase <= 'h0;         //0

        1:  phase <= 'h5a;        //90

        2:  phase <= 'hb4;        //180

        3:  phase <= 'h10e;       //270

    endcase

end


assign POFF=phase*1048575/360;

 

endmodule


3.4 testbench文件

`timescale 1ns / 1ps



module sim_top;


    reg         sys_clk ;

    reg         rst_n   ;

    reg [1:0]   key_PINC; 

    reg [1:0]   key_POFF; 


    //例化源文件

    top top_inst(

       .sys_clk      (sys_clk      ),

       .rst_n        (rst_n        ),

       .key_PINC     (key_PINC     ),

       .key_POFF     (key_POFF     )

        );

        

             

    initial

        begin

            //初始化

            sys_clk=0;

            rst_n=0;

            key_PINC=2'd0;

            key_POFF=2'd0;  //30

            

            

            

            #100

            rst_n=1;

            key_PINC=0;  //1Mhz  10485  每次相位增加的值  deta_theta

            #4000

            key_PINC=1;  //2Mhz  20971

            #4000

            key_PINC=2;  //4Mhz  41943

            #4000

            key_PINC=3;   //10Mhz  104857

            

            #4000

            key_POFF=1;  //60

            #4000

            key_POFF=2;  //90

            #4000

            key_POFF=3;   //180

        end

        

        

        // create clock;

        always #5 sys_clk=~sys_clk;//每次间隔5ns,取一次反,也就是周期为10ns,所以频率为100MHz


endmodule


4 结果

在这里插入图片描述
在这里插入图片描述

关键字:FPGA  DDS  信号发生器 引用地址:基于FPGA的DDS 信号发生器(三)

上一篇:MATLAB信号发生器仿真
下一篇:基于FPGA的简易 DDS 信号发生器的设计

推荐阅读最新更新时间:2024-11-18 12:46

基于FPGA的mif文件创建与使用
  1 引言   在一些需要特殊运算的应用电路中,只读存储器ROM是关键元件,设计人员通常利用ROM创建各种查找表,从而简化电路设计,提高电路的处理速度和稳定性。FPGA是基于SRAM的可编程器件。掉电后FPGA上的配置信息将全部丢失,所以由FPGA构造的数字系统在每次上电后要依赖于外部存储器来主动配置或在线被动配置。真正意义上的ROM应具有掉电后信息不丢失的特性,因此利用FPGA实现的ROM只能认为器件处于用户状态时具备ROM功能。使用时不必要刻意划分,而ROM单元的初始化则是设计人员必须面对的问题。本文讨论FPGA的ROM初始化问题,详细介绍mit文件的创建与使用。   2 基于FPGA的ROM的实现   基于MAX
[嵌入式]
基于<font color='red'>FPGA</font>的mif文件创建与使用
借助赛灵思第二代目标设计平台赢取新的市场
为帮助客户评估最符合需求的 FPGA,并让客户的设计快速启动和运行,赛灵思公司推出了首批三种支持 28nm 7 系列 FPGA 的目标设计平台。其中Virtex®-7 和 Kintex™-7 FPGA 基础套件包括灵活混合信号子卡以及行业标准的 FMC 接插件。除了这些基础套件之外,安富利也推出了 Xilinx® Kintex-7 FPGA DSP 套件,可帮助客户充分利用 FPGA 在多 DSP 任务处理和更快运行速度方面的优势。 这三款全新套件意味着赛灵思第二代 FPGA 系统开发平台的首次发布。赛灵思早在 2009 年即推出了支持 6 系列器件的目标设计平台 (TDP) 战略(见中国通讯第33期封面报道:用目标设计平台加速
[嵌入式]
借助赛灵思第二代目标设计平台赢取新的市场
CY7C68013和FPGA的数据通信
通用串行总线(USB)具有快速、双向、大批量传输、廉价以及可实现热插拔等优点,Cypress公司的FX2系列芯片之一CY7C68013是最早符合USB2.0标准的微控制器,集成了符合USB2.0的收发器、串行接口引擎(SIE)、增强型8051内核以及可编程的外围接口,实现基于USB2.0的接口数据通信,CY7C68013可配置成3种不同的接口模式;Ports(端口模式)、GPIF Master(可编程接口模式)和Slave FIFO(主从模式),其中,后两种模式利用其内部集成的可以独立于微处理器而自动处理USB事务的硬件(USB核),数据的传输通过执行USB本身的协议来完成,微处理器可不参与数据传输,从而使数据的传输速率大大地提高
[模拟电子]
CY7C68013和<font color='red'>FPGA</font>的数据通信
借助物理综合提高FPGA设计效能
  随着FPGA密度的增加,系统设计人员能够开发规模更大、更复杂的设计,从而将密度优势发挥到最大。这些大规模设计基于这样的设计需求——需要在无线通道卡或者线路卡等现有应用中加入新功能,或者通过把两种芯片功能合并到一个器件中,减小电路板面积,或者针对新应用开发新设计。   这些不同的设计含有应用程序已有代码,或者是对延时要求较高的DSP。对于这类设计,综合工具可能无法优化设计,使其达到最优,导致关键通路出现较长的延时。关键通路延时较长的原因在于逻辑综合工具依靠估算的延时来综合设计。   这些延时较长的关键通路带来了时序逼近问题,导致性能劣化,迫使设计人员重新编写RTL代码以改进这些延时较长的关键通路。此外,用户在得到满足时序规范
[嵌入式]
借助物理综合提高<font color='red'>FPGA</font>设计效能
一种基于DDS的宽带频率合成的设计
摘要:针对高性能DDS芯片AD9858设计宽带频率合成器,分析DDS的工作原理,给出宽带频率合成器的原理框图和实现过程,并对软件控制流程进行了详细说明,结合理论时系统的相位噪声和杂散性能做了简要分析和计算,最后获得测试结果验证了基于AD9858宽带频率合成器有较好的相位噪声和杂散,达到了预期的目标。 关键词:直接数字频率合成;AD9858;YTO;鉴相     目前频率合成主要有3种方法:直接模拟合成法、锁相环合成法和直接数字合成法。直接模拟合成法利用倍频(乘法)、分频(除法)、混频(加法与减法)及滤波,从单一或几个参数频率中产生多个所需的频率。该方法频率转换时间快(小于100 ns),但杂散谱太多,难以抑制。锁相环合成法通过锁相
[电源管理]
一种基于<font color='red'>DDS</font>的宽带频率合成的设计
基于Python 定点平方根的FPGA实现
FPGA 作为可编程的逻辑器件,它具有功耗低、便于修改、调试等特点,并能在上面实时完成大量的算法,平方根运算作为信号和图像处理中的常见算法,目前在FPGA上有许多实现,但是这些实现方法通常采用目前硬件设计中普遍采用的Verilog和VHDL语言进行硬件设计,这种设计方法存在着仿真和校验效率低,对于复杂的算法和软件设计者之间的沟通较为困难等问题。 Python是一种简单易学并且功能强大的编程语言,并具有强大的软硬件描述能力,MyHDL采用Python扩展包的形式使其能支持硬件设计和仿真并在仿真结果符合要求后可将软件算法自动转换为相应的Verilog 或VHDL硬件描述。 本文试图采用这种新的基于Python的软硬件设计方法在FPGA
[电源管理]
基于Python 定点平方根的<font color='red'>FPGA</font>实现
什么是可编程信号发生器
信号发生器是一种常见的信号源,是由振荡器、频率合成单元、调制单元等组成的综合性电子仪器,其基本功能是提供正弦波信号和调制波信号,在生产实践、科技领域和教学方面都有着广泛的应用。可编程信号发生器是指通过编程可以输出多种波形的信号。本文我们介绍一下信号发生器的种类、波形和相关产品产品的推荐。 1、信号发生器是什么?信号发生器是频率不同的设备,在实验应用中,也被称为信号源和振荡器,各种波形用三角函数表示。三角波、锯齿波等各种各样的波形都可以。在矩形波等无线电,通信,电视,工业农业、生物医学等领域,功能信号发生器在实验室和设备测试中起着非常重要的作用。信号发生器根据输出输出波形可以分为:正弦信号发生器、函数信号发生器、脉冲信号发生器和
[测试测量]
什么是<font color='red'>可编程</font><font color='red'>信号</font><font color='red'>发生器</font>
基于SOPC的运动视觉处理系统设计
1 引言 随着深亚微米工艺的发展, FPGA的容量和密度不断增加,以其强大的并行乘加运算(MAC)能力和灵活的动态可重构性,被广泛应用于通信、图像等许多领域。但是在复杂算法的实现上,FPGA不如嵌入式处理器方便,所以在设计具有复杂算法和控制逻辑的系统时,往往需要和嵌入式处理器结合使用,这就是 SOPC(System on a Programmable chip,可编程片上系统)技术。 SoPC是 SoC和 FPGA结合的产物,由单个可编程重构的芯片完成整个系统的主要功能。SoPC设计灵活多变,可以用原理图,硬件描述语言甚至是 C/C++高级语言进行设计;同时还具有可重构、可裁减、可扩充等特点,升级方便。 SoPC兼备 S
[嵌入式]
小广播
最新测试测量文章
换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved