【边学边记_11】——DDS基本原理与FPGA实现

这篇具有很好参考价值的文章主要介绍了【边学边记_11】——DDS基本原理与FPGA实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DDS基本原理与FPGA实现

一.DDS基本原理

DDS(Direct Digital Synthesizer)即数字合成器,是一种新型的频率合成技术,具有相对带宽大,频率转换时间短、分辨率高和相位连续性好等优点。较容易实现频率相位以及幅度的数控调制,广泛应用于通信领域。
DDS 的基本结构主要由相位累加器相位调制器波形数据表 ROMD/A转换器等四大结构组成,其中较多设计还会在数模转换器之后增加一个低通滤波器。DDS 结构示意图见下图
fpga dds生成带宽信号,【FPGA边学边记】笔记,fpga开发
先对其中各参数做一下说明。系统时钟 CLK 为整个系统的工作时钟,频率为 f_CLK;频率字输入 F_WORD,一般为整数,数值大小控制输出信号的频率大小,数值越大输出信号频率越高,反之,输出信号频率越低;相位字输入P_WORD,为整数,数值大小控制输出信号的相位偏移,主要用于相位的信号调制;设输出信号为 CLK_OUT,频率为 f_OUT
这里相位累加器位数为N位(N的取值范围实际应用中一般为24~32),相当于把正弦信号在相位上的精度定义为N位。

1.频率控制

f O U T = F w o r d × F c l k 2 N f_{OUT}=F_{word}\times \frac{F_{clk}}{2^N} fOUT=Fword×2NFclk
关于这个公式该如何理解,我们通过下面的例子来掌握。
下图为一个完整周期的正弦信号的波形,总共有33个采样点,其中第1点和第33点的值相同,第33点为下一个周期的起始点,因此,实际一个周期为32个采样点(1~32)。
fpga dds生成带宽信号,【FPGA边学边记】笔记,fpga开发
现在有以下几种输出情况:
<1>当使用FPGA控制DAC输出一个周期的正弦信号时,每1ms输出一个数值。如果每个点都输出,则总共输出这一个完整的周期信号需要输出32点,因此输出一个完整的信号需要32ms,可知输出信号的频率为1000/32 Hz。这里Fclk = 1000Hz(周期是1ms),Fo = 1000/32 (2^N N=5)
<2>如果需要用这一组数据来输出一个2*(1000/32)Hz的正弦信号,因为输出信号频率为2*(1000/32)Hz,那么输出一个完整的周期的正弦波所需要的时间为32/2,即16ms。因为FPGA控制DAC输出信号的频率固定为1ms,所以我们选择隔点输出,输出(1、3、5、7……29、31)这些点,因为采用这些点,我们还是能够组成一个完整的周期的正弦信号,而输出时间缩短为一半,即频率提高了一倍。这里Fclk = 1000Hz(周期是1ms),Fo =2*1000/32 (2^N N=5),F_WORD=2。

2.相位控制

对于相位的调整,则更加简单。只需要在每个取样点的序号上加上一个偏移量,便可实现相位的控制。例如,上面默认的是第1ms时输出第一个点的数据,假如我们现在在第1ms时从第9个点开始输出,则将相位左移了90度,这就是控制相位的原理。

实现DDS输出时,将横坐标上的数据作为ROM的地址纵坐标上的数据作为ROM的输出,那么指定不同的地址就可实现对应值的输出。而我们DDS输出控制频率和相位,归结到底就是控制ROM的地址。

二.模块功能设计

在本设计中参考时钟F_clk频率为50 MHz,相位累加器位数取32位,相位控制字位数取12位,由于自用DAC模块要求14位,所以Data取14位。
fpga dds生成带宽信号,【FPGA边学边记】笔记,fpga开发

1.设计代码

先配置ROM IP核
这里配置的是块ROM ,可参考我前一篇文章:IP核的使用之ROM(Vivado)

module DDS_Module(
    Clk,
    Reset_n,
    Fword,
    Pword,
    Data
    );
    
    input Clk;
    input Reset_n;
    input [31:0] Fword;
    input [12:0] Pword;
    output [13:0] Data;   //这里14位是因为我后续使用的DAC模块为14位
    
    //频率控制字同步寄存器
    reg [31:0] Fword_r;
    always@(posedge Clk)
        Fword_r <= Fword;
       
    //相位控制字同步寄存器
    reg [12:0] Pword_r;
    always@(posedge Clk)
        Pword_r <= Pword;    
    
    //相位累加器
    reg [31:0] Freq_ACC;
    always@(posedge Clk or negedge Reset_n)
        if(!Reset_n)
            Freq_ACC <= 0;
        else
            Freq_ACC <= Fword_r + Freq_ACC;
            
    //波形数据表地址
    wire [12:0] ROM_Addr;
    assign ROM_Addr = Freq_ACC[31:20] + Pword_r;                
                    
    blk_mem_ROM rom(
      .clka(Clk),
      .addra(ROM_Addr),
      .douta(Data)
    );
    
endmodule

2.激励仿真

`timescale 1ns / 1ns
module DDS_Module_tb;
    
    reg Clk;
    reg  Reset_n;
    reg [31:0]FwordA,FwordB;
    reg [12:0]PwordA,PwordB;
    wire [13:0]DataA,DataB;   
    
    DDS_Module DDS_ModuleA(
        Clk,
        Reset_n,
        FwordA,
        PwordA,
        DataA
    );
    
    DDS_Module DDS_ModuleB(
        Clk,
        Reset_n,
        FwordB,
        PwordB,
        DataB
    );
    
    initial Clk = 1;
    always #10 Clk = ~Clk;
    
    initial begin
        Reset_n = 0;
        FwordA = 65536;
        PwordA=0;
        FwordB = 65536;
        PwordB=1024;
        #201;
        Reset_n = 1;
        #5_000_000;
        FwordA = 65536 *1024;  
        FwordB = 65536 *1024; 
        PwordA=0;
        PwordB=2048;
        #1_000_000;
        $stop;        
    end
    
    
endmodule

3.仿真结果

fpga dds生成带宽信号,【FPGA边学边记】笔记,fpga开发
根据公式得到:
f o u t = F w o r d × F c l k 2 N = 65536 × 50 × 1 0 6 2 32 = 762.939    H z f_{out}=F_{word}\times \frac{F_{clk}}{2^N}=65536\times \frac{50\times 10^6}{2^{32}}=762.939\,\,Hz fout=Fword×2NFclk=65536×23250×106=762.939Hz
与仿真结果图中周期时间取对数得到的值一样,故可验证结果正确。文章来源地址https://www.toymoban.com/news/detail-734571.html

到了这里,关于【边学边记_11】——DDS基本原理与FPGA实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FM调制的FPGA-DDS实现

    本文是作者最近的课程设计,花费了不少时间,以下是自己的一些思路,希望可以帮助到正在学习的你,理解关于FM调制的FPGA-DDS实现,接着往下看吧! 平台为  Quartus 17.1 波形生成软件为 Mif_Maker2010 FPGA芯片的型号为5CEFA5F23I7,系统时钟为50MHZ 关于FM: 简单来说就是: 幅度改

    2024年02月04日
    浏览(30)
  • 【FPGA】 十二、Vivado DDS IP核实现扫频信号

    文章目录 前言 一、DDS IP核概述 二、DDS IP核配置 三、调用DDS IP核 总结     在我前面的工程中,都是一些比较通用的设计工程,没有用到哪一家的IP核,所以代码具有很好的移植性;今天我就来讲一下基于Xilinx厂家的芯片做一期DDS的设计与验证,这里我所采用的EDA工具是Viva

    2024年02月03日
    浏览(34)
  • 基于FPGA的DDS原理信号发生器设计 quartusII 9.1平台 Verilog HDL语言编程 可产生正弦波

    基于FPGA的DDS原理信号发生器设计 quartusII 9.1平台 Verilog HDL语言编程  可产生正弦波、方波、锯齿波以及三角波   频率幅度可调节   代码+原理图 在现代电子技术领域,针对各种应用的信号发生器是一种非常核心的设备,而基于现场可编程逻辑门阵列(FPGA)的直接数字合成(

    2024年04月27日
    浏览(44)
  • 【Qt】边学边写之Qt教程(零基础)

    打开Qt Creator 界面选择 New Project或者选择菜单栏 【文件】-【新建文件或项目】菜单项 弹出New Project对话框,选择Qt Widgets Application, 选择【Choose】按钮,弹出如下对话框 设置项目名称和路径,按照向导进行下一步, 选择编译套件 向导会默认添加一个继承自QMainWindow的类,可

    2024年01月23日
    浏览(28)
  • 基于FPGA的DDS开发和实现,可修改输出正弦的频率和相位,包含testbench

    目录 1.算法仿真效果 2.算法涉及理论知识概要 3.Verilog核心程序 4.完整算法代码文件 vivado2019.2仿真结果如下: 输出2个不同频率的正弦信号:  修改相位,得到如下所示。      直接数字频率合成技术 (Direct Digital Synthesis)完全不同于我们己经熟悉的直接频率合成技术和锁相环频

    2024年02月04日
    浏览(40)
  • 写点东西《边学边写7 种常见的攻击前端的安全性攻击》

    随着网络应用程序对业务运营变得越来越关键,它们也成为网络攻击更具吸引力的目标。但不幸的是,许多网络开发人员在构建安全前端方面落后于他们的后端和 DevOps 同行。这种差距增加了破坏性数据泄露的风险。 最近发生的事件,例如 Balancer Protocol 漏洞,揭示了攻击者在

    2024年02月02日
    浏览(36)
  • 学英语赚钱,SOL链边学边赚应用Let Me Speak详解

    概述 1.基本情况 1.1项目简介 1.2基本信息 2.项目详情 2.1 团队 2.2 投资方及合作伙伴 2.3 资金 2.4 产品 3.项目发展 3.1Roadmap 3.2 现状 4.经济模型 4.1代币功能 4.2代币分配 5.项目风险 概述 Let Me Speak 是第一个Learn to Earn 元宇宙,应用建立在SOL链上。在 LMS Metaverse 中,用户可以在世界各

    2024年02月15日
    浏览(36)
  • FPGA——DDS

    DDS DDS 是直接数字式频率合成器(Direct Digital Synthesizer)的英文缩写,是一项关键的数字化技术。利用数字方式累加相位,再以相位之和作为地址来查询正弦函数表得到正弦波幅度的离散数字序列,最后经D/A变换得到模拟正弦波输出。在系统时钟一定的情况下,输出频率决定于

    2024年02月08日
    浏览(33)
  • 基于FPGA的DDS设计

    1. 简介         DDS(direct digital synthesizer),直接数字合成器,实现快速频率切换,容易实现频率、相位、幅度的数控调制。DDS在通信领域应用尤为广泛。 2.DDS原理                                                                     图2.1 基本DDS结构         

    2024年02月08日
    浏览(28)
  • FPGA中一些基本概念原理的区分

    在 Verilog 中,wire 和 reg 是两种不同类型的变量,它们有着不同的特性和用途 wire 变量用于连接模块中的输入、输出以及内部信号线。 它主要用于表示连续赋值的逻辑连接,类似于硬件电路中的导线。 wire 变量不能在 always 块或 initial 块中赋值,它们只能通过连续赋值“assig

    2024年02月21日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包