FPGA中级项目4——DDS实现

news2025/3/19 17:06:22

FPGA中级项目4——DDS实现

DDS简介


DDS(直接数字频率合成器,Direct Digital Frequency Synthesis)是一种基于数字信号处理技术的频率合成方法,广泛应用于通信、雷达、仪器仪表等领域。在 FPGA中实现 DDS 具有灵活性高、集成度强、响应速度快等优势。其实也就是能产生各种波形!

DDS 基本原理


相位累加器:通过数字累加器生成相位增量,决定输出信号的频率。
相位增量怎么决定输出信号频率呢?请继续看下文
相位增量就是频率控制字FCW,由用户输入

波形 ROM / 查找表:根据相位增量依次等间隔来查找存储不同相位对应的波形数据(如正弦波、方波等)。
数模转换器(DAC):将数字波形转换为模拟信号。
频率控制字(FCW):输入的频率指令,决定相位累加的步长。输出频率与频率控制字成正比,通过改变频率控制字的大小,可以方便地调整输出信号的频率。

相位控制字(PCW):通常用于对相位累加器的输出结果进行偏移。这样,通过改变相位控制字,可以改变输出信号的初始相位。


相位

在了解DDS时,必须要补充的一个知识即:相位(不是宰相之位)。在信号处理和电子系统中,相位(Phase)是描述周期性信号波形位置的关键参数,通常以角度(弧度或度)表示。

相位的基本定义

物理意义:相位表示信号波形在时间轴上的偏移位置。例如,对于正弦波 Asin(ωt+ϕ) ,ϕ 是初始相位(单位:弧度或度)。

当 ϕ=0 时,波形从原点开始;

当 ϕ=Π/2 时,波形处于峰值位置。

相位差:
两个同频率信号的相位之差决定了它们的相对位置关系。

例如:相位差为 0:同相;

           相位差为Π:反相。

相位在 DDS 中的作用

在 DDS 系统中,相位是生成频率的核心变量,其作用如下:

相位累加器:通过不断累加相位增量(频率控制字 FCW)生成连续的相位序列。例如

相位值(k + 1)= 相位值(k)+  FCW(模2^N)

相位累加器的溢出速度直接决定输出信号的频率:公式为

 

相位与频率的关系

  • 相位变化率: 频率是相位随时间的变化率,即。ω= dϕ/dt

    在 DDS 中,相位增量 FCW 决定了每个时钟周期的相位变化量,因此直接控制输出频率。

相位的单位与精度

  • 单位: 通常用弧度(rad)表示,例如:

    • 一个完整周期对应 2Π 弧度;
    • 半周期对应 Π 弧度。
  • 相位精度: 相位累加器的位数 N 决定了相位的量化精度。例如:

    • N = 32 时,相位分辨率为 2Π / 2^32 。
    • 不同的相位值对应波形的不同点

需要特别指出的是:溢出频率等于输出信号的频率,即 每输出一个完整周期信号,相位累加器溢出一次

相位累加器是一个 N 位寄存器,当累加结果达到 2^N 时,溢出回 0。相位累加器每溢出一次,意味着数字相位完成了一个完整的周期(从 0 到 2^N-1再回到 0),对应物理相位完成 2Π 弧度的变化。


问题分析

1. 我们需要搭建的便是DDS电路逻辑,需要有选择波形输入端mode_sel 和 输出给DAC 的数字数据输出端data 。其中频率控制字fword 的位宽为32位,因为我们要实现fword 与累加寄存器的数值相加,保证位宽相同(累加器位宽固定为32位)。对于相位控制字pword ,理论上我们也需要32位位宽用于计数波形数据,但是所需容量太大。所以我们取12位即可(即整个波形我们只取其中4096个点) ,同时也决定了data的位宽

2. 在进行编写定义波形数据表时,由于相位控制字的位宽为12位,也就是只需要4096个数据;但是频率控制字的位宽为32位。因此我们要进行截取高位来取点即选择位宽为【31:20】。频率控制字和相位控制字共同来决定一个数据,因此ROM表也只需要4096个数据存储即可!

3. 然后需要进行不同波形数据的存储,即对不同ROM IP核的创建,根据需要分别存储不同波形。其中正弦波的设置如下所示(其余两个波形设置相同,只是产生数据文件不一致,便不与累赘):

直至完成3个ROM IP核的创建,然后对其进行例化。

4. 最后根据用户输入选择对应不同波形输出, 使用case语句即可完成。


代码展示

//定义输入输出端口
module DDS(
        clk,
        reset_n,
        mode_sel,//控制输出的波形
        fword,//频率控制字
        pword,//相位控制字
        data//输出给DAC的数据
    );
        input clk;
        input reset_n;
        input [1:0]mode_sel;
        input [31:0]fword;
        input [11:0]pword;
        output reg [13:0]data;
        
        
//将fword打一拍
        reg [31:0]fword_r;
always@(posedge clk)
        fword_r <=  fword;
        
        
//将pword打一拍
        reg [11: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 <= freq_acc +  fword_r;
        
        
        
// 定义波形数据表
        wire [11:0]rom_addr;
assign rom_addr = freq_acc[31:20] + pword_r;


//例化创建好的ROM IP核
        wire [13:0]sine, square, triangular;
        
        sine DDS_sine (
        .clka(clk),    // input wire clka
        .addra(rom_addr),  // input wire [11 : 0] addra
        .douta(sine)  // output wire [13 : 0] douta
        );
       
        square DDS_square (
        .clka(clk),    // input wire clka
        .addra(rom_addr),  // input wire [11 : 0] addra
        .douta(square)  // output wire [13 : 0] douta
        );
        
        triangular DDS_triangular (
        .clka(clk),    // input wire clka
        .addra(rom_addr),  // input wire [11 : 0] addra
        .douta(triangular)  // output wire [13 : 0] douta
        );
        
//case选择输出
always@(*)
        case(mode_sel)
        0: data = sine;
        1: data = square;
        2: data = triangular;
        3: data = 5555;
        endcase
        
endmodule

综合出来的底层系统逻辑图schematic如下:


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

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

相关文章

STM32 DAC详解:从原理到实战输出正弦波

目录 一、DAC基础原理1.1 DAC的作用与特性1.2 DAC功能框图解析 二、DAC配置步骤2.1 硬件配置2.2 初始化结构体详解 三、DAC数据输出与波形生成3.1 数据格式与电压计算3.2 正弦波生成实战3.2.1 生成正弦波数组3.2.2 配置DMA传输3.2.3 定时器触发配置 四、常见问题与优化建议4.1 …

基于PyQt5与Open3D的轻量化BIM工具开发指南(下)‌

‌基于PyQt5与Open3D的轻量化BIM工具开发指南&#xff08;下&#xff09;‌ ‌——参数化建模、数据导出与性能优化‌ 【跳转】基于PyQt5与Open3D的轻量化BIM工具开发指南&#xff08;上&#xff09;‌ ‌四、详细实现步骤&#xff08;Part 2&#xff09;‌ ‌3. 参数化建模…

Pytest项目_day01(HTTP接口)

HTTP HTTP是一个协议&#xff08;服务器传输超文本到浏览器的传送协议&#xff09;&#xff0c;是基于TCP/IP通信协议来传输数据&#xff08;HTML文件&#xff0c;图片文件&#xff0c;查询结果等&#xff09;。 访问域名 例如www.baidu.com就是百度的域名&#xff0c;我们想…

在vue项目中,使用Patch请求,实现根据id修改某张发票的日结状态

目录 前言 一.问题描述 二.后端实现 1.分析 2.检查后端拦截器&#xff0c;看看是否允许接收Patch类型的请求 3.编写Dto 4.编写controller层 5.编写service层 6.mapper层 7.使用apifox&#xff0c;测试后端接口的可用性 三.前端实现 1.封装api&#xff08;本质是ax…

某快餐店用户市场数据挖掘与可视化

1、必要库的载入 import pandas as pd import matplotlib.pyplot as plt import seaborn as sns2、加载并清洗数据 # 2.1 加载数据 df pd.read_csv(/home/mw/input/survey6263/mcdonalds.csv)# 2.2 数据清洗 # 2.2.1 检查缺失值 print(缺失值情况&#xff1a;) print(df.isn…

[C++面试] 标准容器面试点

一、入门 1、vector和list的区别 [C面试] vector 面试点总结 vector 是动态数组&#xff0c;它将元素存储在连续的内存空间中。支持随机访问&#xff0c;即可以通过下标快速访问任意位置的元素&#xff0c;时间复杂度为 O(1)&#xff0c;准确点是均摊O(1)。但在中间或开头插…

单片机学完开发板,如何继续提升自己的技能?

很多人学完开发板后都会卡在一个尴尬的阶段&#xff1a;觉得自己会的东西不少&#xff0c;但又不知道下一步该干啥。会点C语言&#xff0c;能烧录程序&#xff0c;能点亮LED&#xff0c;玩转按键&#xff0c;搞定串口等等&#xff0c;能用开发板做点小玩意儿&#xff0c;但面对…

明基PD2700U显示器无法调节图像模式

现象&#xff1a;明基PD2700U显示器无法调节图像模式&#xff0c;如下图&#xff1a; 目前未找到根本原因&#xff0c;推测可能是下面的原因&#xff1a; 1、安装了远程桌面软件&#xff1a;向日葵、虚拟显示器 2、显卡插入了接口&#xff0c;但是没接显示器 解决办法&#xf…

基于FPGA轨道交通6U机箱CPCI脉冲板板卡

板卡简介&#xff1a; 本板为脉冲板&#xff0c;脉冲板主要执行CPU下达的指令&#xff0c;通过实现各种控制算法来调节PWM&#xff0c;然后输出光纤PWM信号来驱动变频器功率模块以达到控制电机的目的。 性能规格&#xff1a; 电源&#xff1a;DC5V&#xff1b;15V FPGA&…

如何通过 Airbyte 将数据摄取到 Elasticsearch

作者&#xff1a;来自 Elastic Andre Luiz Airbyte 是一个数据集成工具&#xff0c;可自动化并可扩展地将信息从各种来源传输到不同的目的地。它使你能够从 API、数据库和其他系统提取数据&#xff0c;并将其加载到 Elasticsearch 等平台&#xff0c;以实现高级搜索和高效分析。…

如何用DeepSeek进行项目管理?AI重构项目全生命周期的实践指南

一、项目管理的核心工作范畴 现代项目管理包含六大核心模块&#xff0c;构成完整管理闭环&#xff1a; 1. 需求管理&#xff08;20%工作量&#xff09; 案例&#xff1a;某电商平台"双11"大促项目需整合23个部门的142项需求 关键动作&#xff1a;需求收集→优先级…

vue3 引入element-plus组件后,发现输入的时候没有提示,而且鼠标移到el-button显示unknown的简单解决方法

1、element-plus官方地址 一个 Vue 3 UI 框架 | Element Plus 2、安装 安装 | Element Plus 3、安装插件unplugin-vue-components、unplugin-auto-import并配制 快速开始 | Element Plus 4、输入关键词没有提示及ElButton:unknown的处理 1&#xff09;装个扩展插件&#xf…

【Linux】浅谈环境变量和进程地址空间

一、环境变量 基本概念 环境变量&#xff08;Environment Variables&#xff09;是操作系统提供的一种机制&#xff0c;用于存储和传递配置信息、系统参数、用户偏好设置等。 环境变量的作用 配置程序行为&#xff1a; 程序可以通过环境变量获取配置信息&#xff0c;例如日…

如何使用 DeepEval 优化 Elasticsearch 中的 RAG 检索

作者&#xff1a;来自 Elastic Kritin Vongthongsri 学习如何使用 DeepEval 优化 RAG 流水线中的 Elasticsearch 检索器。 LLMs 容易产生幻觉、缺乏特定领域的专业知识&#xff0c;并受限于上下文窗口。检索增强生成&#xff08;Retrieval-Augmented Generation - RAG&#xff…

行为模式---状态模式

概念 状态模式是一种行为模式&#xff0c;用于在内部状态改变的时候改变其行为。它的核心思想就是允许一个对象在其内部状态改变的时候改变它的行为。状态模式通过将对象的状态封装成独立的类&#xff0c;并将其行为委托给当前的状态对象&#xff0c;从而使得对象行为随着状态…

嵌入式裸机设计--MCU常用裸机架构有哪些?

为什么是裸机设计 792125321入群学习更高效&#xff01; 在MCU&#xff08;微控制器单元&#xff09;裸机开发中&#xff0c;我们常见的架构设计主要围绕如何高效管理资源和任务调度。认识这些开发方式&#xff0c;对我们开发一个小型项目来说及有好处&#xff01; 下面介绍…

【LInux进程六】命令行参数和环境变量

【LInux进程六】命令行参数和环境变量 1.main函数的两个参数2.利用main函数实现一个简单的计算器3.环境变量之一&#xff1a;PATH4.修改PATH5.在命令行解释器bash中查看所有环境变量6.用自己写的程序查看环境变量7.main函数的第三个参数8.本地的环境变量和环境变量9.环境变量具…

激光slam学习笔记10---ubuntu2004部署运行fastlivo2踩坑记录

背景&#xff1a;mars实验室又发福利啦&#xff01;跑跑效果&#xff0c;验了那句&#xff0c;mars出品&#xff0c;必属精品&#xff01;本人pc环境ubuntu20.04&#xff0c;基本流程按照readme走就行&#xff0c;sophus和vikit安装有些注意地方。本文做了一些部署踩坑记录&…

织梦DedeCMS优化文章模版里的“顶一下”与“踩一下”样式

测试的版本5.7.1UTF-8 一、插入<head>Js代码 将下面代码插入到文章模版里的<head>标签里 <script language"javascript" type"text/javascript" src"{dede:global.cfg_cmsurl/}/include/dedeajax2.js"></script> <…

IDEA+Docker插件一键部署SpringBoot项目到远程服务器

文章目录 1. 服务端1.1 安装Docker1.2 Docker放开远程连接1.3 重启Docker1.4 开放端口1.4.1 云端1.4.2 服务器内部防火墙指令 2.IntelliJ IDEA2.1 安装IDEA2.2 安装Docker插件2.3 SSH Configurations2.4 Docker选择对应的SSH2.5 Dockerfile2.5.1 Dockerfile2.5.2 Dockerfile Ed…