DDS基本原理与FPGA实现

news2024/11/28 6:31:44

DDS基本原理与FPGA实现

定义:DDS是指DDS信号发生器,采用直接数字频率合成技术。是一种新型的频率合成技术,具有相对带宽大,频率转换时间短、分辨率高和相位连续性好等优点。较容易实现频率、相位以及幅度的数控调制,广泛应用于通信领域

DDS的经典应用场景:通信系统里调制解调

1.系统结构图和理论

image-20230429071007386

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

image-20230429071559451

image-20230429074058507

image-20230429072609569

image-20230429073116833

image-20230429073135922

image-20230429074141626

频率1000/32 Hz是由计算公式f=1s/T得来的,其中T的单位也是s,输出完整的一个波形需要32个点,每个点输出需要1ms,因此周期T=32×1ms×0.001=0.032s,因此f=1s/0.032=1000/32 Hz

image-20230429075758026

image-20230429080340042

​ 图6.4-5 16个采样点的正弦信号波形

image-20230429080726604

公式讲解:

(1)当时钟频率Fclk=1000Hz(即时钟周期为1ms使),取点的间隔是1ms,此时输出频率Fo是多少?

Fo = 1000/32,其中32等于2^N,N=5;

Fo=Fclk/2^N

(2)希望输出的频率翻一倍,即输出的点由32个变为16个,取点间隔变为2

Fo = (1000×2)/(32÷2),其中32等于2^N,N=5;

Fo=Fclk/(2^N/2)

(3)希望输出周期为64ms,即输出的点由32个变为64个,取点间隔变为0.5.

Fo = (1000×2)/(32÷0.5),其中32等于2^N,N=5;

Fo=Fclk/(2^N/0.5)

公式总结:

输出频率由频率控制字Fword(也可以用B来表示)来决定,可以表示为:

Fo=Fclk/(2^N/Fword),也可以写为:Fo=Fclk/(2^N/B)=(Fclk × B)/(2^N)

2.代码实现

`timescale 1ns / 1ps

module DDS_Module(
    Clk,
    Reset_n,
    Fword,  //频率控制字
    Pword,  //相位控制字
    Data    //输出数据
    );
    input Clk;
    input Reset_n;
    input [31:0] Fword;
    input [11:0] Pword;
    output [13:0] Data;
    
    //频率控制字同步寄存器    
    reg [31:1] Fword_r;
    always@(posedge Clk)
        Fword_r <=Fword;
        
     //相位控制字同步寄存器    
    reg [31:1] 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;
      
     //相位累加器与相位控制字的结果输出
     reg [31:0] Freq_ACC_out;
     always@(posedge Clk or negedge Reset_n)
     if(!Reset_n)
          Freq_ACC_out <= 0;
      else
           Freq_ACC_out <= Freq_ACC + Pword_r;
            
       //波形数据表地址 
        wire [11:0] Rom_Addr;
        assign Rom_Addr = Freq_ACC_out[31:20];

blk_mem_gen_0 blk_mem_gen_0_u0 (
  .clka (Clk),
  .addra(Rom_Addr),
  .douta(Data)
);
    
endmodule

补充说明:

相位控制字就是给地址加一个偏置值,因为波形的值存放在rom当中,只需要改变rom的地址就可以改变波形的相位.

测试代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/04/28 20:32:51
// Design Name: 
// Module Name: DSS_Module_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module DSS_Module_tb;
reg      Clk;
reg      Reset_n ;
reg [31:0]  Fword ;
reg [11:0]  Pword ;
wire [13:0] Data;

DDS_Module DDS_Module_u0(
    .Clk(Clk),
    .Reset_n(Reset_n),
    .Fword(Fword),  
    .Pword(Pword), 
    .Data(Data)   
    );

initial Clk = 1;
always #10 Clk = ~Clk;
    
initial begin 
    Reset_n =0;
    Pword = 0;
    Fword = 65536;
    #201;
    Reset_n =1;
    #20000000;
    Fword = 65536*1024;
    #20000000;
    Fword = 65536*32;
    #20000000;
    $stop;
end



endmodule

实验结果:

image-20230429083626644

视频链接:22B DDS结构的FPGA实现_哔哩哔哩_bilibili

	--晓凡 2023429日于桂林书

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

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

相关文章

服务运营| Healthcare Management Science 近期文章精选

作者&#xff1a;李舒湉 王畅 &#xff08;一&#xff09; Screening for preclinical Alzheimer’s disease: Deriving optimal policies using a partially observable Markov model nen Dumlu Z, Sayın S, Grvit İ H. Screening for preclinical Alzheimer’s disease: …

UG NX二次开发(C#)-显示-更改对象颜色

文章目录 1、前言2、UG NX中的更换对象颜色的功能3、采用UG NX二次开发实现颜色修改3.1 采用直接赋值对象颜色不能直接更改对象颜色3.2 采用NewDisplayModification的方法如下:1、前言 当一个三维模型展现在我们面前时,总会有颜色赋予三维模型的对象上,比如红色、蓝色、银灰…

工具链与其他-移动端网络优化的指标和策略

目录 网络指标 一个请求的时间消耗 页面加载 常见性能指标 网络优化策略 缓存 压缩 请求合并 离线包 预加载&#xff08;前端大流量数据&#xff09; 网络指标 一个请求的时间消耗 一个请求的发生到返回回来&#xff1b;有3部分时间 1.Scheduling&#xff08;排队&…

初识C++之异常

目录 一、C中的常用处理错误方式 二、C异常的概念 1. throw 2. catch 3. try 三、异常的使用 1. 异常的抛出和捕获 1.1 异常的抛出和匹配原则 1.2 在函数调用链中异常栈展开匹配原则 四、异常体系 1. 自定义异常体系 2. C中的异常体系 五、 异常安全 六、异常规范…

Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)

项目是根据官网的示例工程进行修改的,版本参数如下&#xff1a; unity&#xff1a;2021.2.20 wolong&#xff1a;v2.1.0 il2cpp_plus:v2021_2.1.0 ------------------------------------------------------------- 1、安装&#xff1a;参考&#xff1a;第一篇文章Unity 热…

pytest - Getting Start

前言 项目开发中有很多的功能&#xff0c;通常开发人员需要对自己编写的代码进行自测&#xff0c;除了借助postman等工具进行测试外&#xff0c;还需要编写单元测试对开发的代码进行测试&#xff0c;通过单元测试来判断代码是否能够实现需求&#xff0c;本文介绍的pytest模块是…

虚幻图文笔记:Substance Painter通过USD格式导入UE5的工作流

什么是USD格式 USD即Universal Scene Description&#xff0c;是著名的Pixar公司研发的一种开源的3D 场景说明和文件格式&#xff0c;如其名所示&#xff0c;相较于传统的FBX、Obj等3D格式&#xff0c;USD的具有更好的通用性和扩展性&#xff0c;现在已被非常多的厂商和平台所…

使用树莓派(zero2w + Camera Module 3 支持自动对焦 1200 万像素)拍照

拍照硬件 Raspberry Pi Camera Module 3Raspberry Pi Zero 2 W 1. 注意排线连接方向 2. 烧录系统 3. 进行系统更新需要联网&#xff0c;注意只支持最新的bullseye系统。每条指令大概需要10 分钟。 sudo apt-get update -y sudo apt-get upgrade -y4. 拍摄一张全像素的JPEG图像…

自己做小程序开个社区团购可行吗?

在如今的社交化时代&#xff0c;随着社区经济的发展&#xff0c;越来越多的人开始探索社区团购的商业模式。而随着小程序的普及&#xff0c;自己开发一个社区团购小程序也成为了一种可能。但是&#xff0c;自己做小程序开个社区团购真的可行吗&#xff1f;我们来一起分析一下。…

Spring整合MybatisJunit单元测试

Spring整合Mybatis&Junit单元测试 1. Spring整合Mybatis【重点】1.1 思路分析问题导入1.1.1 MyBatis程序核心对象分析1.1.2 整合MyBatis 1.2 代码实现【前置工作】【第一步】导入Spring整合Mybatis依赖【第二步】创建JdbcConfig配置DataSource数据源【第三步】创建MybatisC…

【ARMv8 编程】A64 内存访问指令——内存加载指令

与所有先前的 ARM 处理器一样&#xff0c;ARMv8 架构是一种加载/存储架构。这意味着没有数据处理指令直接对内存中的数据进行操作。数据必须首先被加载到寄存器中&#xff0c;修改&#xff0c;然后存储到内存中。该程序必须指定地址、要传输的数据大小以及源或目标寄存器。有额…

《使用深度神经网络对光电容积脉搏图进行归一化,以进行个体和群体比较》阅读笔记

目录 一、论文摘要 二、论文十问 Q1&#xff1a;论文试图解决什么问题&#xff1f; Q2&#xff1a;这是否是一个新的问题&#xff1f; Q3&#xff1a;这篇文章要验证一个什么科学假设&#xff1f; Q4&#xff1a;有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一…

symfonos 1(smtp注入webshell,配合文件文件包含)

目录 扫描 SMB 提权 扫描 SMB 让我们使用SMBMAP检查这些目录的权限。 smbmap -d workgroup -H www.example.com 可能/匿名帐户可访问。 使用smb尝试连接共享网络以访问/anonymous目录。[smb://192.168.59。129/]

ETL工具 - Kettle 介绍及基本使用

一、Kettle 介绍 在介绍 Kettle 前先了解下什么是 ETL&#xff0c;ETL是 Extract-Transform-Load 的缩写&#xff0c;即数据 抽取、转换、装载 的过程&#xff0c;对于企业或行业应用来说&#xff0c;经常会遇到各种异构数据的处理、转换、迁移等操作&#xff0c;这些操作有可…

java+mysql医院住院挂号缴费病房信息管理系统

手续办理&#xff1a;办理病人入院登记&#xff1b;提供病案首页建立与打印&#xff1b;交纳预交金及日结管理&#xff0c;并打印收据凭证&#xff1b;空床查询与统计&#xff1b;查询患者的住院信息&#xff1b;打印清单&#xff1b;出入院统计。 护士工作站&#xff1a;提供病…

Java每日一练(20230429)

目录 1. 二叉树的后序遍历 &#x1f31f;&#x1f31f; 2. 删除无效的括号 &#x1f31f;&#x1f31f;&#x1f31f; 3. 合并两个有序链表 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每…

【Java笔试强训 1】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f9be;&#x1f9be;&#x1f9be; 目录 一、选择题 二、编程题 &#x1f525;组队竞…

基于虚拟同步发电机的光伏混合储能并网系统MATLAB仿真

资源地址&#xff1a; 主要模块&#xff1a; 光伏电池模型&#xff08;按照数学模型搭建&#xff09;、蓄电池储能模块、超级电容储能模块、双向DC/DC模块、LC滤波器、逆变器VSG控制模块电压电流双环控制模块、光伏MPPT控制模块、储能系统充放电控制模块。 使用MATLAB2021b及…

2023/04/24 ~ 25 刷题记录

A - Sort the Subarray 大致题义&#xff1a;Monocarp有一个包含n个整数的数组a。他决定选择两个整数l和r&#xff0c;使1< 2rn&#xff0c;然后对子数组进行排序。子数组a[1 ..]R]是数组a中包含元素a1, al1, al2&#xff0c;…的部分。&#xff0c; ar-1, ar)按非降序排列。…

【STM32】知识补充 锁相环原理与应用解析

【STM32】知识补充 锁相环原理与应用解析 概述什么是锁相环 (PPL)锁相环的基本组成锁相环的工作原理锁相环应用STM32 中锁相环的应用STM32 配置锁相环总结 概述 锁相环 (Phase-Locked Loop) 在现代电子与通信系统中, 扮演着至关重要的角色. 凭借其独特的同步和频率调整能力, 锁…