基于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-05 11:54

深入浅出带你了解FPGA架构
数字集成电路有两种类型:ASIC和FPGA(现场可编程门阵列)。专用集成电路(ASIC)有一个预先定义的特定硬件功能,在生产后不能重新编程。但FPGA可以在制造后可无限编程。 FPGA是一种集成电路,一种可编程芯片,它允许工程师对定制的数字逻辑进行编程,可以根据程序改变其硬件逻辑。主要目的是允许工程师重新设计和重新配置他们的芯片更快,更便宜,只要他们想要,然而世界上没有什么理想的,FPGA芯片也有局限性! FPGA最早出现于20世纪80年代,其最初的应用是允许工程师拥有通用可编程逻辑芯片。然而,这需要大量的编程才能执行简单的功能,所以工程师们尽量避免使用这些功能。但是,虽然在1980年的FPGA是一个简单的接口设备,
[嵌入式]
深入浅出带你了解<font color='red'>FPGA</font>架构
基于高速FPGA的PCB设计技术的研究
       如果高速PCB设计能够像连接原理图节点那样简单,以及像在计算机显示器上所看到的那样优美的话,那将是一件多么美好的事情。然而,除非设计师初入PCB设计,或者是极度的幸运,实际的PCB设计通常不像他们所从事的电路设计那样轻松。在设计最终能够正常工作、有人对性能作出肯定之前,PCB设计师都面临着许多新的挑战。这正是目前高速PCB设计的现状--设计规则和设计指南不断发展,如果幸运的话,它们会形成一个成功的解决方案。       绝大多数PCB是精通PCB器件的工作原理和相互影响以及构成电路板输入和输出的各种数据传输标准的原理图设计师与可能知道一点甚至可能一点也不知道将小小的原理图连线转换成印刷电路铜线后将会发生什么的专业
[嵌入式]
基于FPGA的多按键状态识别系统设计方案
   1 引言   按键作为普通的输入外设,在仪器仪表工业设备和家用电器中得到广泛应用。目前,按键输入电路Ⅲ主要有2种:一种是非扫描方式可以判断多键状态(允许多键同时动作),但是不适用于大量按键情况,所需I/0端口多;另一种是扫描阵列方式,适用于大量按键,但不能多键同时动作。因此,需要开发一种既适合大量按键又适合多键同时动作,并能节省单片机(MCU)的口线资源的多按键状态识别系统。这里提出一种利用FPGA的I/0端口数多和可编程的特点,采用VHDL语言的多按键状态识别系统,实现识别60个按键自由操作,并简化MCU的控制信号。    2 系统设计方案   FPGA是一种可编程逻辑器件,它具有良好性能、极高的密度和极大的灵活性,
[嵌入式]
基于<font color='red'>FPGA</font>的多按键状态识别系统设计方案
基于FPGA的数字正交混频变换算法的实现
0 引 言 传统的正交下变频是通过对模拟I、Q输出直接采样数字化来实现的,由于I、Q两路模拟乘法器、低通模拟器本身的不一致性、不稳定性,使I、Q通道很难达到一致,并且零漂比较大,长期稳定性不好,不能满足高性能电子战设备的要求。为此,人们提出了对中频信号直接采样,经过混频来实现正交数字下变频的方案,这种下变频的方法可以实现很高精度的正交混频,能满足高镜频抑制的要求。采用可编程器件FPGA对该算法流程进行实现,能满足在高采样率下的信号时实处理要求,在电子战领域中有着重要的意义。 1 数字正交混频变换原理 所谓数字正交混频变换实际上就是先对模拟信号x(t)通过A/D采样数宁化后形成数字化序列x(n),然后与2个正交本振序列cos(
[应用]
介绍音频分析仪测量问题
  本内容介绍了7723 音频分析仪 测量问题,在测量时读数亮灭闪烁无法读取,仪器无法继续进行测量。   1. VP-8194D信号发生器接受VP-7723D音频分析仪的OSC(晶振)信号触发并输出AM/FM标准信号到分析仪;   2.播放汽车音视频,并经交换器输入到音频分析仪AC信号输入端;   3.使用 计算机 编程通过GPIB控制音频分析仪;   4. 在此自动化系统中,VP-7723D按计算机预先编好的程序依次改变测试条件,自动测量汽车音频各项指标(测试条件与测量指标可交叉);   5. 当测试条件为HPF:200Hz,LPF:20KHz,测量AC LEVEL,REL LVL时FREQUENCY/AMPL
[测试测量]
OFDM水声通信定时同步的FPGA实现
  正交频分复用(Orthogonal Frequency DivisionMultiplexing,OFDM)技术是一种多载波调制技术,它将宽带信道分解为相互正交的一组窄带子信道,利用各个子信道进行并行数据传输,因此其频谱利用率高、抗多径衰落能力强。目前已经在数字视频广播(DVB-T2)、无线局域网(802.11a/g)等系统中成功得到应用,并且成为第四代移动通信的核心技术之一。水声信道是一个时、空、频变的多径信道,它具有强多径、窄频带和强噪声等特点,将OFDM传输技术应用到水声通信中,已成为水声通信的研究热点之一。    OFDM 系统 自身的正交多载波调制特点,决定了其对同步误差十分敏感。能否实现准确的符号定时同步和载波
[网络通信]
一种基于FPGA的全光纤电流互感器控制电路设计
  电流 互感器 作为高压电网检测主要设备,不仅为电能的计量提供参数,而且是为继电保护提供动作的依据。随着国家智能电网和特高压电网的发展,传统电磁式电流 互感器 逐渐暴露出其致命缺陷,例如高电压等级时绝缘极为困难、更高电压下易磁饱和导致测量精度下降等。相比之下,光纤电流 互感器 具有抗电磁干扰能力强、绝缘可靠、测量精度高、结构简单和体积小巧等诸多优点,是当前研究热点。作为光纤电流互感器的核心部件,其检测和控制电路对电流检测精度和范围具有非常重要的影响。   目前检测和控制电路实现主要有两种方案,一种是以数字信号处理芯片( DSP )为核心,由于 DSP 的速度越来越快,使得 DSP 成为很多数据处理和信号检测方案
[嵌入式]
一种基于<font color='red'>FPGA</font>的全光纤电流互感器控制电路设计
基于FPGA的分布式算法FIR滤波器设计
0 引 言 FIR(finite impulse response)滤波器是数字信号处理系统中最基本的元件,它可以在保证任意幅频特性的同时具有严格的线性相频特性,同时其单位冲激响应是有限的,没有输入到输出的反馈,是稳定的系统。因此,FIR滤波器在通信、图像处理、模式识别等领域都有着广泛的应用。 目前FIR滤波器的硬件实现有以下几种方式: 一种是使用单片通用数字滤波器集成电路,这种电路使用简单,但是由于字长和阶数的规格较少,不易完全满足实际需要。虽然可采用多片扩展来满足要求,但会增加体积和功耗,因而在实际应用中受到限制。 另一种是使用DSP芯片。DSP芯片有专用的数字信号处理函数可调用,实现FIR滤波器相对简单,但是由于程序
[应用]
小广播
最新测试测量文章
换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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