基于FPGA的DDS信号发生器

前言

此处仅为基于Vivado实现DDS信号发生器的仿真实现,Vivado的安装请看下面的文章,这里我只是安装了一个标准版本,只要能够仿真波形即可。

FPGA开发Vivado安装教程_vivado安装 csdn-CSDN博客

DDS原理

DDS技术是一种通过数字计算生成波形信号的方法,其核心原理是利用数字相位累加器和波形查找表(ROM)生成高精度、频率可调的波形信号。DDS系统的主要组成部分包括频率控制字(Fword)、相位累加器、相位控制字(Pword)和波形查找表。

DDS的基本结构图如下所示:

在DDS系统中,频率控制字决定了输出波形的频率。频率控制字越大,相位累加器每个时钟周期增加的相位值就越大,从而输出波形的频率越高。相位累加器是DDS系统的核心部件,用于累加频率控制字。在每个时钟周期,相位累加器会将上一个周期的累加值与频率控制字相加,生成新的相位值。这个相位值用于波形查找表的地址生成。

要理解这个频率字对应的输出频率,可以使用以下公式:

f_{out}=\frac{F_{word}\times f_{clock}}{2^{N}}

其中,f_{out}是输出频率,F_{word}是频率控制字,f_{clock}是驱动DDS的时钟频率,N是相位累加器的位宽,通常是DDS设计中的一个常数。假设这里f_{clock}为50MHz,N为32位,输出频率位1MHz,那么频率控制字即为85899345(仅去整数部分)。

这里还比较了1MHz、500KHz、100KHz的正弦波信号,如下图所示。

相位控制字用于实现相位偏移,通过将相位控制字加到相位累加器的输出中,可以实现输出波形的相位偏移,从而便于同步或相位调制等应用。波形查找表存储了一个周期波形的数据,例如正弦波、方波和三角波。相位累加器的输出作为地址输入到波形查找表,查找到相应的波形数据输出。 

使用IP核生成ROM表

波形ROM模块通过查找表方式存储和输出波形数据。每种波形的数据表根据相应的波形公式预先计算并存储在ROM中。在系统运行过程中,DDS模块根据当前相位值读取ROM中的波形数据。

你可以使用软件去生成波形数据文件.coe文件。

在IP Catalog中找到ROM IP核,直接搜索即可。

修改名字,并且讲Memory Type类型改为Single Port ROM。

点击Port A Options修改宽度和深度。

 在换到Other Options选择我们刚刚生成的.coe文件路径。

接下来和之前的一样对方波和正弦波做同样的处理。然后切换到IP Sources,点击每个的.v文件

这里应当以你自己的标准为准,然后进行实例化。

DDS波形仿真

模块中实例化了三个波形生成子模块,这里应该按照你自己的方式来。

`timescale 1ns / 1psmodule DDS(Clk,Reset_n,Fword,Pword,mode,Data_out);input                         Clk;input                         Reset_n; input [31:0]                  Fword;input [11:0]                  Pword;input [1:0]                   mode;  // 2位模式输入,用于选择波形output reg [13:0]             Data_out;  // 输出选择的波形数据// 频率控制字同步寄存器reg [31:0] Fword_r;always @(posedge Clk)Fword_r <= Fword;// 相位控制字同步寄存器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;elseFreq_ACC <= Fword_r + Freq_ACC;// 波形数据表地址wire [11:0] Rom_Addr;      assign Rom_Addr = Freq_ACC[31:20] + Pword_r;// 波形数据输出wire [13:0] Data_sine;wire [13:0] Data_square;wire [13:0] Data_transqure;// 实例化正弦波模块sine_wav sine_wav (.clka(Clk),         // 输入时钟.ena(1'b1),         // 使能信号置高.addra(Rom_Addr),   // 输入地址.douta(Data_sine)   // 输出正弦波数据);// 实例化方波模块    square_wav square_wav (.clka(Clk),         // 输入时钟.ena(1'b1),         // 使能信号置高.addra(Rom_Addr),   // 输入地址.douta(Data_square) // 输出方波数据);// 实例化三角波模块    triangular_wav triangular_wav (.clka(Clk),            // 输入时钟.ena(1'b1),            // 使能信号置高.addra(Rom_Addr),      // 输入地址.douta(Data_transqure) // 输出三角波数据);// 多路复用器根据 mode 选择波形数据输出always @(*) begincase (mode)2'b00: Data_out = Data_sine;      // mode = 00 时输出正弦波2'b01: Data_out = Data_square;    // mode = 01 时输出方波2'b10: Data_out = Data_transqure; // mode = 10 时输出三角波default: Data_out = 14'b0;        // 默认情况下输出0endcaseendendmodule

仿真使用的tb文件

`timescale 1ns / 1psmodule DDS_tb;reg                         Clk;reg                         Reset_n; reg [31:0]                  Fword;reg [11:0]                  Pword;reg [1:0]                   mode;wire [13:0]                 Data_out;DDS DDS(.Clk(Clk),.Reset_n(Reset_n),.Fword(Fword),.Pword(Pword),.mode(mode),.Data_out(Data_out));initial Clk = 1;always #10 Clk = ~Clk;initial beginReset_n = 0;Fword = 85899345;  // 1M初始频率控制字设置为较大值Pword = 0;mode = 2'b00;  // 选择正弦波#201Reset_n = 1;#20000Fword = 42949673;  // 500k更改频率控制字,降低频率#20000Fword = 8589935;  // 100k更改频率控制字,进一步降低频率#20000$stop;  //     initial begin
//        Reset_n = 0;
//        Fword = 85899345;
//        Pword = 0;
//        mode = 2'b00;  // 正弦波
//        #201
//        Reset_n = 1;
//        #100000//        mode = 2'b01;  // 方波
//        #100000//        mode = 2'b10;  // 三角波
//        #100000//        $stop;  endendmodule

修改波的类型为模拟信号即可,对于方波这种还需要进行以下设置。

完整工程资源

按理来说,可以通过博客就完成了,但如果你比较懒,你可以从这里下载完整工程。

基于FPGA的DDS信号仿真资源-CSDN文库

因为这个模块只是一个课程设计的一部分,涉及到通过串口控制的部分由其他同学负责,因此这里仅记录我所完成的部分。我对FPGA的理解还有限,后续不会对这方面进行答疑。

参考文章

DDS原理及FPGA实现_dds fpga-CSDN博客

基于FPGA的DDS算法实现(可调幅值,附ISE联合Modelsim仿真结果)-CSDN博客

基于FPGA的DDS信号发生器-CSDN博客 

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

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

相关文章

Pandas_DataFrame读写详解:案例解析(第24天)

系列文章目录 一、 读写文件数据 二、df查询数据操作 三、df增加列操作 四、df删除行列操作 五、df数据去重操作 六、df数据修改操作 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、 读写文…

Web 基础与 HTTP 协议

Web 基础与 HTTP 协议 一、Web 基础1.1域名和 DNS域名的概念Hosts 文件DNS&#xff08;Domain Name System 域名系统&#xff09;域名注册 1.2网页与 HTML网页概述HTML 概述网站和主页Web1.0 与 Web2.0 1.3静态网页与动态网页静态网页动态网页 二、HTTP 协议1.1HTTP 协议概述1.…

秋招——MySQL补充——MySQL是如何加行级锁

文章目录 引言正文什么SQL语句会加行级锁查询操作增加对应的行级锁事务的写法 update和delete修改操作也会增加行级锁 行级锁有哪些种类记录锁间隙锁Next-Key锁 MySQL是如何加行级锁&#xff1f;唯一索引等值查询查询记录是存在的查询记录是不存在的 唯一索引范围查找针对大于或…

《梦醒蝶飞:释放Excel函数与公式的力量》8.4 COUNTIF函数

8.4 COUNTIF函数 COUNTIF函数是Excel中常用的统计函数之一&#xff0c;用于统计指定条件下的单元格数量。通过COUNTIF函数&#xff0c;我们可以轻松地对数据进行条件筛选和统计分析。下面将从函数简介、语法、基本用法、注意事项、高级应用、实战练习和小节几个方面展开介绍。…

爬虫笔记19——代理IP的使用

访问网站时IP被阻止 有些网站会设置特定规则来限制用户的访问&#xff0c;例如频率限制、单一账户多次登录等。 网站为了保护自身安全和用户体验&#xff0c;会设置防御机制&#xff0c;将涉嫌恶意行为的IP地址加入黑名单并屏蔽访问。如果用户在使用网站时违反了这些规则&…

格式化选NTFS还是exFAT 格式化NTFS后Mac不能用怎么办 移动硬盘格式化ntfs和exfat的区别

面对硬盘、U盘或移动硬盘的格式化决策&#xff0c;NTFS与exFAT作为主流的文件系统&#xff0c;用户在选择时可以根据它们的不同特点来选择适用场景。下面我们来看看格式化选NTFS还是exFAT&#xff0c;格式化NTFS后Mac不能用怎么办的相关内容。 一、格式化选NTFS还是exFAT 在数…

十四、【源码】@Autowired、@Value、@Component

源码地址&#xff1a;https://github.com/spring-projects/spring-framework 仓库地址&#xff1a;https://gitcode.net/qq_42665745/spring/-/tree/14-auto-property Autowired、Value、Component 注解注入属性的实现分散在refresh容器的各个方法中&#xff0c;梳理&#x…

docker 搭建 AI大数据模型 --- 使用GPU

docker 搭建 AI大数据模型 — 使用GPU方式 搭建本地大模型&#xff0c;最简单的方法&#xff01;效果直逼GPT 服务器GPU系统HP580 G8P40Rocky9.2 安装程序AnythingLLM前端界面Open WebUIChatOllamaollama 一、AnythingLLM 介绍 AnythingLLM 是 Mintplex Labs Inc. 开发的一…

9.(vue3.x+vite)修改el-input,el-data-picker样式

效果预览 二:相关代码 <template><div style="padding: 50px"><el-input placeholder="请输入模型名称" style="width: 260px" /><br /

Java灵活用工2.0报价单微信小程序+APP+微信公众号 源码

&#x1f680;【开篇&#xff1a;解锁灵活用工的高效时代】 在人力资源市场日益灵活的今天&#xff0c;如何快速、准确地生成报价单&#xff0c;成为企业吸引并管理自由职业者的关键。而“灵活用工报价单微信小程序APP微信公众号源码”正是这样一款集高效、便捷于一体的解决方…

YOLO在目标检测与视频轨迹追踪中的应用

YOLO在目标检测与视频轨迹追踪中的应用 引言 在计算机视觉领域&#xff0c;目标检测与视频轨迹追踪是两个至关重要的研究方向。随着深度学习技术的飞速发展&#xff0c;尤其是卷积神经网络&#xff08;CNN&#xff09;的广泛应用&#xff0c;目标检测与视频轨迹追踪的性能得到…

YOLO-V2

一、V2版本细节升级 1、YOLO-V2&#xff1a; 更快&#xff01;更强 1.1 做的改进内容 1. YOLO-V2-Batch Normalization V2版本舍弃Dropout&#xff0c;卷积后每一层全部加入Batch Normalization网络的每一层的输入都做了归一化&#xff0c;收敛相对更容易经过Batch Norma…

【C++】相机标定源码笔记- RGB 相机与 ToF 深度传感器校准类

类的设计目标是为了实现 RGB 相机与 ToF 深度传感器之间的高精度校准&#xff0c;从而使两种类型的数据能够在同一个坐标框架内被整合使用。这在很多场景下都是非常有用的&#xff0c;比如在3D重建、增强现实、机器人导航等应用中&#xff0c;能够提供更丰富的场景信息。 -----…

在卷积神经网络(CNN)中为什么可以使用多个较小的卷积核替代一个较大的卷积核,以达到相同的感受野

在卷积神经网络&#xff08;CNN&#xff09;中为什么可以使用多个较小的卷积核替代一个较大的卷积核&#xff0c;以达到相同的感受野 flyfish 在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;可以使用多个较小的卷积核替代一个较大的卷积核&#xff0c;以达到相同的…

交叉编译tslib库和上机测试

目录 一、tslib 介绍 二、tslib 框架分析 三、交叉编译、测试 tslib 1.安装工具链 tslib &#xff08;1&#xff09;设置交叉编译工具链 &#xff08;2&#xff09;进入tslib目录 &#xff08;3&#xff09;安装工具链 &#xff08;4&#xff09;确定工具链中头文件、库…

千亿级市场迎来新增量:中老年K歌需求高涨,解读线上+线下创新方向

干货抢先看 1. 我国KTV产业一度达到千亿规模&#xff0c;近年来随着线下娱乐方式多样化&#xff0c;KTV逐渐被年轻用户抛弃&#xff0c;中老年成为行业关键增量。 2. 数据显示&#xff0c;全国量贩式KTV中&#xff0c;60-70岁年龄段用户数同比增长29.6%&#xff0c;订单量同比…

【分布式系统】监控平台Zabbix介绍与部署(命令+截图版)

目录 一.Zabbix概述 1.为什么要做监控 2.zabbix 是什么 3.zabbix 监控原理 4.zabbix 6.0 新特性 5.zabbix 6.0 功能组件 Zabbix Server 数据库 Web 界面 Zabbix Agent Zabbix Proxy Java Gateway 补充 二.部署安装Zabbix 6.0 1.初始化环境 2.安装nginx跟php&am…

计算机网络网络层复习题2

一. 单选题&#xff08;共22题&#xff0c;100分&#xff09; 1. (单选题)如果 IPv4 数据报太大&#xff0c;会在传输中被分片&#xff0c;对分片后的数据报进行重组的是&#xff08; &#xff09;。 A. 中间路由器B. 核心路由器C. 下一跳路由器D. 目的主机 我的答案: D:目的…

图文控件TextImageView

图片文字组合控件&#xff0c;可以灵活的控制图片大小 class TextImageView : AppCompatTextView {private var mStartWidth: Int 0private var mStartHeight: Int 0private var mTopWidth: Int 0private var mTopHeight: Int 0private var mEndWidth: Int 0private var …

不懂PyQt5垂直布局?只需3分钟即可学会

PyQt5中实现垂直布局&#xff0c;主要使用QVBoxLayout类。该布局管理器将子控件垂直排列&#xff0c;并可以根据需要自动调整大小。使用QVBoxLayout可以方便地构建从上到下排列的界面元素。 import sys from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QPus…