DDS信号的发生器(验证篇)——FPGA学习笔记8

news2025/1/17 3:38:47

前言:第一部分详细讲解DDS核心框图,还请读者深入阅读第一部分,以便理解DDS核心思想

三刷小梅哥视频总结!

小梅哥icon-default.png?t=N7T8https://www.corecourse.com/lander

一、DDS简介

        DDS(Direct Digital Synthesizer)即数字合成器,是一种新型的频率合成技术,具有低成本、低功耗、高分辨率、频率转换时间短、相位连续性好等优点,对数字信号处理及其硬件实现有着很重要的作用。 DDS的基本结构主要由相位累加器、相位调制器、波形数据表 ROM、 D/A 转换器等四大结构组成,其中较多设计还会在数模转换器之后增加一个低通滤波器(LPF)。 DDS 基本结构图如下图所示。

        由上图可以看出, DDS 主要由相位累加器、相位调制器、波形数据表以及 D/A 转换器构成。其中相位累加器由 N 位加法器与 N 位寄存器构成。每来一个时钟,加法器就将频率控制字与累加寄存器输出的相位数据相加,相加的结果又反馈至累加寄存器的数据输入端,以使加法器在下一个时钟脉冲的作用下继续与频率控制字相加。这样,相位累加器在时钟的作用下,不断对频率控制字进行线性相位累加。即在每一个时钟脉冲输入时,相位累加器便把频率控制字累加一次。当相位累加器累加满量时就会产生一次溢出,完成一个周期的动作。相位累加器输出的数据就是合成信号的相位。相位累加器的溢出频率,就是 DDS 输出的信号频率。

        通过改变相位控制字 P_WORD 可以控制输出信号的相位参数。令相位加法器的字长为 M,当相位控制字由 0 跃变为 P_WORD 时,波形存储器(ROM)的输入为相位累加器的输出与相位控制字 P_WORD 之和,因而其输出的幅度编码相位会增加 P_WORD/2M,从而使输出的信号产生相移。

        用相位调制器输出的数据,作为波形存储器的相位采样地址,这样就可以把存储在波形存储器里的波形采样值经查表找出,完后相位到幅度的转换。 N 位的寻址 ROM 相当于把 0° -360°的正弦信号离散成具有 2N个样值的序列。若波形存储器中有 D 位数据位,则 2N 个样值的幅值以 D 位二进制数值固化在波形存储器当中。按照地址的不同可以输出相应相位的正弦信号幅值。相位—幅度变换原理图如下图所示:

        数模转换器(D/A)的作用是把合成的正弦波数字量转化为模拟量。正弦幅度量化序列经数模转换器转换后变成了包络为正弦波的阶梯波。频率合成器对数模转换器的分辨率有一定的要求,其分辨率越高,合成的正弦波台阶数就越多,输出的波形精度也就越高。 DDS 信号流程图如下图所示:

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

若 DDS 的时钟频率为Fclk,频率控制字 fword 为 1,则输出频率为Fout =1*\frac{ Fclk}{2^{N}} ,这个频率相当于“基频”。若 fword 为 B,则输出频率为Fout =B*\frac{ Fclk}{2^{N}}

因此理论上由以上三个参数就可以得出任意的f_{0}输出频率。且可得出频率分辨率由时钟频率和累加器的位数决定的结论。当参考时钟频率越高,累加器位数越高,输出频率分辨率就越高。

从上式分析可得,当系统输入时钟频率Fclk不变时,输出信号频率由频率控制字 B 所决定,由上式可得: B =2^{N}*\frac{ Fout}{Fclk}。 其中 B 为频率字且只能取整数。为了合理控制 ROM 的容量,此处选取 ROM 查询的地址时,可以采用截断式,即只取 32 位累加器的高 M 位。这里相位寄存器输出的位数一般取 10~16 位。

频率控制字理解:

此变量A可以控制取点速度,实际就是对应框图中的频率控制字fword。time_r截取寄存器高11位与ROMd11位地址线对接,time_r低位做累加控制高位变化速率实现频率调控。

此为DDS核心所在!!

此部分正是框图中的相位累加器!!!!

相位控制字理解:

实际为控制相位初始值,说白了就是改变读取ROM数据表的起始位置!B不会改变读取频率,但可以改变初始位置,变量B就是相位控制字!!!!

二、公式讲解

                                        ​​​​​​​        ​​​​​​​        ​​​​​​​        Fout =A*\frac{ Fclk}{2^{N}}

若 DDS 的时钟频率为Fclk,N及对应time寄存器位宽,此处A为频率控制字,Fout为最终输出的信号频率。由此即可实现根据输出频率计算对应频率控制字的目的。

 计算举例:输出一个完整波形需要的时间:2048(11位RAM寄存器)*10ns(100MHz晶振) = 20480ns = 0.00002048s      对应频率为48828.125Hz

公式计算:A为22‘h10_0000(计算选取相位累加器高11位,[31:21],A取低11位[21:0],目的是为了每次增加可以改变寄存器第21位数值!)计算的频率为48828.125Hz

三、代码设计

1、验证部分顶层

`timescale 1ns / 1ps
module DDS_top(
    input                sys_clk,//100Mhz
    input                sys_rst_n,
    // input      [31:0]    Fword,
    // input      [10:0]    Pword,
    output     [9 :0]    da_data
    );

wire [10:0] rom_addr;
wire        clk_100mhz;    
assign    da_clk = clk_100mhz;

parameter Fword = 32'd10000;
parameter Pword = 11'b0;

DDS_FP u_DDS_FP(

.sys_clk    (sys_clk)     ,
.reset_n    (sys_rst_n)     ,
.Fword      (Fword)       ,
.Pword      (Pword)       ,

.rom_addr   (rom_addr)
);

ROM_10x2048sin u_ROM_10x2048sin (

  .clka(sys_clk),    // input wire clka
  .addra(rom_addr),  // input wire [10 : 0] addra
  .douta(da_data)  // output wire [9 : 0] douta

);

endmodule

顶层给出固定的频率控制字,和相位控制字,下面进行理论计算:

Fout =10000*\frac{ 100000000}{2^{32}}=232.83Hz

2、验证部分DDS逻辑层

`timescale 1ns / 1ps

module DDS_FP(
    input                sys_clk,
    input                reset_n,
    input      [31:0]    Fword,
    input      [10:0]    Pword,
    output     [10:0]    rom_addr
    );
reg     [31:0]  r_Fword;
reg     [10:0]  r_Pword;

reg     [31:0]  Fcnt;

always @(posedge sys_clk ) begin
    r_Fword <= Fword;
    r_Pword <= Pword;
end

always @(posedge sys_clk or negedge reset_n) begin
    if(!reset_n)begin
        Fcnt <= 32'd0;
    end
    else begin
        Fcnt <= Fcnt + r_Fword;
    end
end

assign rom_addr = Fcnt[31:21] + r_Pword;

endmodule

3、仿真部分代码

`timescale 1ns / 1ps
module DDS_tb;

    reg                sys_clk      ;
    reg                sys_rst_n    ;
    // reg      [31:0]    Fword     ;
    // reg      [10:0]    Pword     ;
    wire     [9 :0]    da_data      ;

DDS_top u_DDS_top(
.sys_clk        (sys_clk),
.sys_rst_n      (sys_rst_n),
// .Fword       (),
// .Pword       (),
.da_data        (da_data)
);

initial begin
    sys_clk = 1;
end

always #5 sys_clk = !sys_clk;

initial begin
    sys_rst_n = 0;
    #200
    sys_rst_n = 1;
end

endmodule

四、测试分析

1、仿真测试结果

 ​​​​​​​

2、上板验证 

测试频率与实际计算频率相差不大,验证成功,

五、未来改进

        可以使用外部按键控制,想要的频率,通过给出的计算公式计算对应的频率控制字,控制最终输出波形的频率,亦可多次例化ROM IP,添加其他不同波形。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1853455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Piecewise Jerk Speed 论文以及代码解析

目录 1 算法原理 1.1 优化模型离散方式 1.1.1 Temporal Parameter Discretization 1.2 优化问题建模 1.2.1 Cost function 1.2.2 Constraints 2 ST-Graph 3 代码实现 ​编辑 3.1 STBoundsDecider 1 算法原理 1.1 优化模型离散方式 在处理最优化问题时&#xff0c;…

vuex的深入学习[基于vuex3]----篇(一)

vuex的深入学习[基于vuex3]----篇&#xff08;一&#xff09; vuex框架的核心流程[基于vuex3] Vue Components: Vue组件&#xff0c;html页面上&#xff0c;负责接受用户操作等交互行为&#xff0c;执行dispatch方法触发action进行回应dispatch&#xff1a;操作行为触发方法&a…

MySQL表解锁

查看锁信息 show full processlist 如果一个表被锁定了&#xff0c;会有一个 “Waiting for table metadata lock” 的提示&#xff0c;表明该表正在等待锁定。 解锁表 删除state上有值的事务 kill query 事务id 表解锁完成

Adobe Acrobat 编辑器软件下载安装,Acrobat 轻松编辑和管理各种PDF文件

Adobe Acrobat&#xff0c;它凭借卓越的功能和丰富的工具&#xff0c;为用户提供了一个全面的解决方案&#xff0c;用于查看、创建、编辑和管理各种PDF文件。 作为一款专业的PDF阅读器&#xff0c;Adobe Acrobat能够轻松打开并展示各种格式的PDF文档&#xff0c;无论是文字、图…

坎德拉candela3d光伏电站三维设计软件【无标题】

Candela3D 是一款基于 SketchUp&#xff08;草图大师&#xff09;开发的新一代光伏电站三维设计软件。它适用于复杂地形、平坦地形光伏电站的建设项目&#xff0c;同时适用于可研、初设、施工图、项目运营等阶段。这款软件具有多项功能&#xff0c;例如&#xff1a; • 能够突…

AcWing算法基础课笔记——求组合数3

求组合数Ⅲ 20万组数据&#xff0c; 1 ≤ b ≤ a ≤ 1 0 18 , 1 ≤ p ≤ 1 0 5 1 \le b \le a \le 10^{18}, 1\le p \le 10 ^5 1≤b≤a≤1018,1≤p≤105&#xff0c;使用卢卡斯定理。 卢卡斯定理&#xff1a; C a b ≡ C a m o d p b m o d p C a / p b / p ( m o d p ) C_a…

ASP.NETMVC-简单例子-从数据库构建Model+HTML帮助器

环境&#xff1a; win10&#xff0c;.NET Framework 4.6.1 参考&#xff1a; ASP.NET MVC 简介 | 菜鸟教程 https://www.runoob.com/aspnet/mvc-intro.html ASP.NET MVC HTML 帮助器 | 菜鸟教程 https://www.runoob.com/aspnet/mvc-htmlhelpers.html 上一篇&#xff1a; ASP.…

VS Code SSH 远程连接服务器及坑点解决

背景 Linux服务器重装了一下&#xff0c;IP没有变化&#xff0c;结果VS Code再重连的时候就各种问题&#xff0c;导致把整个流程全部走了一遍&#xff0c;留个经验帖以备查看 SSH 首先确保Windows安装了ssh&#xff0c;通过cmd下ssh命令查看是否安装了。 没安装&#xff0c;…

【STM32】STM32通过I2C实现温湿度采集与显示

目录 一、I2C总线通信协议 1.I2C通信特征 2.I2C总线协议 3.软件I2C和硬件I2C 二、stm32通过I2C实现温湿度&#xff08;AHT20&#xff09;采集 1.stm32cube配置 RCC配置&#xff1a; SYS配置&#xff1a; I2C1配置&#xff1a; USART1配置&#xff1a; GPIO配置&#…

图片覆盖攻击

点击劫持的本质是一种视觉欺骗。顺着这个思路&#xff0c;还有一些攻击方法也可以起到类似的作 用&#xff0c;比如图片覆盖。 一名叫 sven.vetsch 的安全研究者最先提出了这种 Cross Site Image Overlaying 攻击&#xff0c;简称 XSIO。sven.vetsch 通过调整图片的 style 使得…

中国港口年鉴(2000-2023年)

数据年限&#xff1a;2000-2023&#xff08;齐全&#xff09; 数据格式&#xff1a;pdf、excel 数据内容&#xff1a; 一、记述和反映了中国大陆江、海、河港口在深化改革、调整结构、整合资源、开拓经营、加快建设等方面所取得的成就和发展进程&#xff0c;香港特别行政区、澳…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-25使用块的网络VGG

25使用块的网络VGG import torch from torch import nn import liliPytorch as lp import matplotlib.pyplot as plt# 定义VGG块 # num_convs: 卷积层的数量 # in_channels: 输入通道的数量 # out_channels: 输出通道的数量 def vgg_block(num_convs, in_channels, out_channel…

MyBatis映射器:一对多关联查询

大家好&#xff0c;我是王有志&#xff0c;一个分享硬核 Java 技术的金融摸鱼侠&#xff0c;欢迎大家加入 Java 人自己的交流群“共同富裕的 Java 人”。 在学习完上一篇文章《MyBatis映射器&#xff1a;一对一关联查询》后&#xff0c;相信你已经掌握了如何在 MyBatis 映射器…

天气冷电脑不能启动找不到硬盘

https://diy.zol.com.cn/2004/0611/101994.shtml

es的检索-DSL语法和Java-RestClient实现

基本语法&#xff1a; GET /索引库名/_search {"query": {"查询类型": {"查询条件"}} }RestClient的导入在RestClient操作索引库和文档有介绍 查询所有&#xff1a; # 查询所有 GET /test/_search {"query": {"match_all"…

Linux操作系统段式存储管理、 段页式存储管理

1、段式存储管理 1.1分段 进程的地址空间&#xff1a;按照程序自身的逻辑关系划分为若干个段&#xff0c;每个段都有一个段名&#xff08;在低级语言中&#xff0c;程序员使用段名来编程&#xff09;&#xff0c;每段从0开始编址。内存分配规则&#xff1a;以段为单位进行分配…

【高考选专业 | 家长篇】2024,计算机何去何从?小P老师带你看

目录 2024年&#xff0c;计算机相关专业还值得选择吗&#xff1f;1.行业竞争现状2.专业前景分析 2024年&#xff0c;计算机相关专业还值得选择吗&#xff1f; 随着2024年高考落幕&#xff0c;数百万高三学生又将面临人生中的重要抉择&#xff1a;选择大学专业。有人欢喜&#x…

2024最新版:C++用Vcpkg搭配VS2022安装matplotlib-cpp库

matplotlib-cpp是一个用于在C中使用matplotlib绘图库的头文件库。它提供了一个简单的接口&#xff0c;使得在C中创建和显示图形变得更加容易。这个库的灵感来自于Python的matplotlib库&#xff0c;它使得在C中进行数据可视化变得更加便捷。 matplotlib-cpp允许在C中使用类似Py…

linux使用docker部署kafka集群

1、拉取kafka docker pull wurstmeister/kafka docker pull wurstmeister/zookeeper 2、创建网络 docker network create app-kafka 3、启动zookeeper docker run -d \--name zookeeper \-p 2181:2181 \--network app-kafka \--restart always \wurstmeister/zookeeper …

Java基础的重点知识-06-String、Arrays、Math、static关键字

文章目录 String类(java.lang)static关键字Arrays类(java.uitl)Math类&#xff08;java.lang&#xff09; String类(java.lang) java.lang.String 类代表字符串。 特征&#xff1a; 字符串不变&#xff1a;字符串的值在创建后不能被更改。因为String对象是不可变的&#xff…