DDS IP实现啁啾信号

news2024/9/22 11:26:17

简介        

        DDS(Direct Digital Synthesizer)即数字合成器,是一种新型的频率合成技术,具有低成本、低功耗、高分辨率、频率转换时间短、相位连续性好等优点,对数字信号处理及其硬件实现有着很重要的作用。DDS 的基本结构主要由相位累加器、相位调制器、波形数据表 ROM、D/A 转换器等四大结构组成。本章节主要介绍的是XILINX IP DDS的使用。

DDS的原理

相位累加器
        相位累加器是一种模 N 计数器,具有 2N 个数字状态,这些状态会在每个系统时钟输入脉冲发生时逐渐递增。增量的大小取决于应用于累加器相加级的调谐字 M 的值。该调谐字确定了计数器增量的步长。这将决定输出波形的频率。

        相位累加器的长度通常为 24 - 48 位;24 位累加器共有 224(即 16,777,216)个状态。这一数字表示 0 到 2p 弧度之间的相位值数量,或者说是可实现的相位增量。对于 24 位相位累加器,相位分辨率为 3.74 E-7 弧度。如果使用更大的相位累加器,相位增量会变得更加精细。如下图所示:

        

关于DDS的设置如下:

IP介绍

        如上图所示调用FPGA DDS IP

翻译如下:

1、模式选择–(1)相位和波形数据 (2)相位数据 (3)波形数据
2、系统时钟设置,这里选用系统时钟100MHz,
3、设置通道数;
4、模式选择,两种模式,一般选择standard模式;
5、选择在System Parameters下进行参数设置
6、输出数据宽度和频率精度

偏移宽度计算公式如下:

数据位宽公式如下:

其中SFDR就是上图中的dB参数;

运行设置如下:

1、相位的增量(PINC)和偏移(POFF)
Fixed(固定模式):运行前确定,运行中不可更改,占用资源最少;
Programmable(编程模式): 运行时可修改,DDS频率在不同模式下进行切换;
Streaming(流模式):参数取决于输入的相位值,适用于DDS频率频繁变动的模式;

2、数据输出格式

sine通道输出;

cosine通道输出;

sine和cosine同时输出;

5、相位输出,本次设计对相位无要求,去掉。

其他的默认模式不做处理。

接口格式设置:

例如复位,数据流等控制,如有需求可以修改。

默认输出频率配置:

根据设置的信号,400Hz信号默认输入值为0x20c;

这个值怎么来的呢?

本设计使用的时钟是102.4MHz,根据phase width公式计算出phase width的宽度为27位;

再根据以下公式设置参数:

        其中f_clk=102.4MHz,B=27。简单的理解就是2的27次方将102.4MHz做等分处理,计算出来的刻度是102400000/134217728=0.7629Hz。需要输出400Hz,那么设置的值为524,转换成16进制为20c。

啁啾信号是什么

        啁啾信号‌是一种信号,其频率随时间变化,这种变化在时域上表现为脉冲性质的表征。啁啾信号分为正啁啾和负啁啾,其中正啁啾是频率随时间增加,而负啁啾则是频率随时间减少。信号如下图所示:

       FPGA代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/01/10 11:11:34
// Design Name: 
// Module Name: DDS_CTRL_TOP
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module DDS_CTRL_TOP(
	input sys_clk,
	input sys_rst_n,
	
	input s_axis_dds_config_tvalid,
	input[15:0] s_axis_dds_config_tdata,
	//chirp
	input[15:0] chirp_fre_start,
	input[15:0] chirp_fre_stop,
	input[15:0] chirp_fre_step,
	input[15:0] chirp_fre_step_time,
	input chirp_en,
	
	output reg s_axis_config_tvalid,
	output reg[31:0] s_axis_config_tdata
	
    );
	
parameter us_time_num = 'd1024;	//10us
	
reg s_axis_config_chirp_tvalid;
reg[23:0] s_axis_dds_chirp_config_tdata;
reg chirp_mode;0 递增 1 递减 
reg[15:0] us_time_cnt;
reg[15:0] clk_cnt;
reg step_en;
reg us_time_cnt_en;
reg us_time_cnt_en_r1;


always @(posedge sys_clk)begin
	us_time_cnt_en_r1 <= us_time_cnt_en;
end



always @(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'd0)begin
		chirp_mode <= 'd0;
	end
	else if(chirp_fre_start <= chirp_fre_stop)begin
		chirp_mode <= 'd0;
	end
	else begin
		chirp_mode <= 'd1;
	end
end


always @(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'd0)begin
		us_time_cnt_en <= 'd0;
	end
	else if(chirp_en == 'd1)begin
		us_time_cnt_en <= 'd1;
	end
	else if(chirp_mode == 'd0 && s_axis_dds_chirp_config_tdata >= chirp_fre_stop && us_time_cnt == chirp_fre_step_time - 'd1 && clk_cnt >= us_time_num - 'd2)begin
		us_time_cnt_en <= 'd0;
	end
	else if(chirp_mode == 'd1 && s_axis_dds_chirp_config_tdata <= chirp_fre_stop && us_time_cnt == chirp_fre_step_time - 'd1 && clk_cnt >= us_time_num - 'd2)begin
		us_time_cnt_en <= 'd0;
	end
end



always @(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'd0)begin
		us_time_cnt <= 'd0;
		clk_cnt <= 'd0;
		step_en <= 'd0;
	end
	else if(us_time_cnt_en == 'd1 && us_time_cnt == chirp_fre_step_time - 'd1 && clk_cnt >= us_time_num - 'd1)begin
		us_time_cnt <= 'd0;
		step_en <= 'd1;
		clk_cnt <= 'd0;
	end
	else if(us_time_cnt_en == 'd1 && clk_cnt >= us_time_num - 'd1)begin
		us_time_cnt <= us_time_cnt + 'd1;
		clk_cnt <= 'd0;
		step_en <= 'd0;
	end
	else if(us_time_cnt_en == 'd1)begin
		clk_cnt <= clk_cnt + 'd1;
		step_en <= 'd0;		
	end
	else begin
		us_time_cnt <= 'd0;
		clk_cnt <= 'd0;
		step_en <= 'd0;
	end
end


	

always @(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'd0)begin
		s_axis_config_chirp_tvalid <= 'd0;
		s_axis_dds_chirp_config_tdata <= 'd0;
	end
	else if(chirp_en == 'd1)begin
		s_axis_config_chirp_tvalid <= 'd1;
		s_axis_dds_chirp_config_tdata <= chirp_fre_start;		
	end
	else if(step_en == 'd1 && chirp_mode == 'd0)begin
		s_axis_config_chirp_tvalid <= 'd1;
		s_axis_dds_chirp_config_tdata <= s_axis_dds_chirp_config_tdata + chirp_fre_step;		
	end
	else if(step_en == 'd1 && chirp_mode == 'd1)begin
		s_axis_config_chirp_tvalid <= 'd1;
		s_axis_dds_chirp_config_tdata <= s_axis_dds_chirp_config_tdata - chirp_fre_step;		
	end
	else if(us_time_cnt_en == 'd0 && us_time_cnt_en_r1 == 'd1)beginover 
		s_axis_config_chirp_tvalid <= 'd1;
		s_axis_dds_chirp_config_tdata <= 'd0;		
	end
	else begin
		s_axis_config_chirp_tvalid <= 'd0;
	end
end


	

always @(posedge sys_clk or negedge sys_rst_n)begin
	if(sys_rst_n == 'd0)begin
		s_axis_config_tvalid <= 'd0;
		s_axis_config_tdata <= 'd0;
	end
	
	else if(s_axis_dds_config_tvalid == 'd1)begin
		s_axis_config_tvalid <= 'd1;
		s_axis_config_tdata <= s_axis_dds_config_tdata;
	end
	else begin
		s_axis_config_tvalid <= s_axis_config_chirp_tvalid;
		s_axis_config_tdata <= s_axis_dds_chirp_config_tdata;	
	end
end	
	
	
	
	
	
endmodule






本代码可以实现啁啾信号的起始频率,终止频率,频率步进,频率步进所持续的时间。

FPGA仿真代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/08/23 14:44:30
// Design Name: 
// Module Name: DDS_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module DDS_tb(

    );

reg sys_clk;
reg sys_rst_n;	


wire s_axis_config_l_tvalid;
wire[31:0] s_axis_config_l_tdata;
wire s_axis_config_r_tvalid;
wire[31:0] s_axis_config_r_tdata;
wire[15:0] dds_data_l;
wire[15:0] dds_data_r;	
reg chirp_en;

	
always #5 sys_clk = ~sys_clk;	
	
	
initial begin
	sys_clk = 'd0;
	sys_rst_n = 'd0;
	chirp_en = 'd0;
	#30_000
	sys_rst_n = 'd1;
	#30_000
	repeat(1)@(posedge sys_clk);
	chirp_en = 'd1;
	repeat(1)@(posedge sys_clk);
	chirp_en = 'd0;
	
end	
	
	
DDS_CTRL_TOP	DDS_CTRL_TOP_L_inst(

	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n),
	
	dds fixed voice
	.s_axis_dds_config_tvalid('d0),
	.s_axis_dds_config_tdata('d0),
	//chirp
	.chirp_fre_start(16'h147a),
	.chirp_fre_stop(16'h051e),
	.chirp_fre_step(16'h0030),
	.chirp_fre_step_time(16'h0004),
	.chirp_en(chirp_en),
	/ out
	.s_axis_config_tvalid(s_axis_config_l_tvalid),
	.s_axis_config_tdata(s_axis_config_l_tdata)


);



DAC_DDS	DAC_DDS_L_INST(
	
	.aclk(sys_clk),
	.s_axis_config_tvalid(s_axis_config_l_tvalid),
	.s_axis_config_tdata(s_axis_config_l_tdata),
	.m_axis_data_tvalid(),
	.m_axis_data_tdata(dds_data_l)

);


	
	
endmodule

仿真波形如下:ru

如上图所示,DDS输出波形逐渐递减的啁啾信号。

如有疑问,欢迎提问。

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

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

相关文章

18945 小团的配送团队

### 思路 1. **建图**&#xff1a;将订单视为图的节点&#xff0c;已知关系视为图的边&#xff0c;构建无向图。 2. **连通分量**&#xff1a;使用深度优先搜索&#xff08;DFS&#xff09;或广度优先搜索&#xff08;BFS&#xff09;找到图中的所有连通分量。 3. **排序**&…

探索人工智能的未来:埃里克·施密特2024斯坦福大学分享六

代理与文本生成模型的未来展望 您认为明年代理或文本生成模型会出现通货膨胀点吗&#xff1f; 不&#xff0c;不会。 我听到了类似的观点&#xff0c;尤其是埃里克科维茨的看法。他有一个很好的方式来阐述这三个趋势。虽然我之前也听说过这些趋势&#xff0c;但将它们整合起…

C语言破墙镐对称飞迷宫

目录 开头程序程序的流程图程序游玩的效果(gif)结尾 开头 大家好&#xff0c;我叫这是我58。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <Windows.h> enum WASD {W,A,S,D }; void printmaze(const char s…

【CTF Web】CTFShow cookie泄露 Writeup(cookie泄露+URL解码)

cookie泄露 10 cookie 只是一块饼干&#xff0c;不能存放任何隐私数据 解法 按 F12 打开开发者工具&#xff0c;点击网络&#xff0c;刷新页面。 flag 在 响应标头的 Set-Cookie 中。 用 URL 解码工具转换。 Flag ctfshow{8483acdb-a677-4c77-8aff-438d44ff1a3e}声明 本博客…

论文翻译软件哪个好用?如何将论文转化?

在学术海洋里遨游&#xff0c;每一篇论文都是思想的灯塔。 但当这座灯塔用外语构建&#xff0c;如何让它在中国读者面前同样熠熠生辉&#xff1f;别担心&#xff0c;把论文翻译成中文的旅程&#xff0c;不仅可以轻松启航&#xff0c;还能优雅靠岸&#xff01; 不知道怎么把论…

【Android笔记】Android APK编译打包流程

前言 本文将介绍Android从一个项目打包成APK的过程&#xff0c;其中涉及Android Java和Kotlin文件、资源文件、清单文件、依赖jar包和so库等在打包过程中处理。 步骤 总体的打包流程如下图&#xff0c;下面就介绍下详细的打包步骤。 1、将aidl文件编译成java文件 在构建过程中…

OpenAI API VBA function returns #Value! but MsgBox displays response

题意&#xff1a;“OpenAI API VBA 函数返回 #Value!&#xff0c;但 MsgBox 显示响应” 问题背景&#xff1a; I am trying to integrate the OpenAI API into Excel. The http request to OpenAI chat completion works correctly and the response is OK. When I display it…

esp32c3 luaos

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、介绍二、相关介绍2.1helloworld——2.2任务框架2.3消息传递 与消息订阅2.4uart2.5二进制数据/c结构体的打包与解析2.6 zbuffer库2.8 uart 485 数据解析2.9 …

Ubuntu 20.04安装中文输入法

本文旨在详细介绍在Ubuntu 20.04操作系统中安装中文输入法的步骤和方法。我们将从选择适合的中文输入法软件、下载与安装过程、配置输入法设置以及解决可能遇到的问题等方面展开讲解&#xff0c;帮助用户轻松实现在Ubuntu 20.04系统下流畅输入中文的需求。无论你是Ubuntu的新手…

东方银行--用 MinIO 和 Dremio 替代 Hadoop

我们的客户是一家总部位于日本的全球金融机构&#xff0c;最近与MinIO和Dremio一起完成了一个雄心勃勃的Hadoop替换项目。你可以在Subsurface的这个演讲中看到他们介绍它&#xff0c;但我们认为我们也会把它写下来。与大多数银行一样&#xff0c;该公司已经建立了大量的Hadoop足…

游戏开发设计模式之状态模式

目录 状态模式在Unity中的具体实现案例是什么&#xff1f; 如何在游戏开发中有效地结合状态模式与享元模式以优化资源使用&#xff1f; 状态模式与其他设计模式&#xff08;如观察者模式、策略模式&#xff09;结合使用的实际例子有哪些&#xff1f; 在处理复杂状态变化时&…

day19:生成器、yield表达式、三元表达式、生成式和函数的递归

一、生成器 1. 如何得到自定义的迭代器 【方法一】&#xff1a;在函数内一旦存在yield关键字&#xff0c;调用函数并不会执行函数体代码&#xff0c;会返回一个生成器对象&#xff0c;生成器即自定义的迭代器。 【方法二】&#xff1a;生成器表达式 反问&#xff1a;为什么自…

信息系统安全等级划分及其重要性:构建安全基石

在信息化社会&#xff0c;数据已成为企业与国家的重要资产&#xff0c;其安全防护日益受到重视。我国的“信息系统安全等级保护制度”正是在这一背景下应运而生&#xff0c;旨在通过等级划分&#xff0c;为不同级别的信息系统提供适配的安全保护措施&#xff0c;确保信息资产的…

Camera篇(一)ov13850调试

ov13850一千三百万像素&#xff0c;必须离线模式&#xff0c;所以ISP TDM配置离线 menuconfig 中需要将ISP TDM功能打开&#xff0c;同时开启WDR 配为&#xff08;*&#xff09; dts配置 work_mode 一律配1 &vind0 {csi_top <360000000>;csi_isp <322000000…

基于x86 平台opencv的图像采集和seetaface6的眼睛状态检测(睁眼,闭眼)功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.2 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的眼睛状态检测(睁眼,闭眼)功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的眼睛…

【C++ Primer Plus习题】3.4

问题: 解答: #include <iostream> using namespace std;const int DAY_TO_HOUR 24; const int HOUR_TO_MIN 60; const int MIN_TO_SEC 60;int main() {long seconds 0,record0;int days 0, hours 0, minutes0;cout << "请输入秒数:";cin >>…

进阶-5.锁

锁 1.概述2.全局锁3.表级锁3.1 介绍3.2 表锁3.3 元数据锁3.4意向锁 4.行级锁 1.概述 分类 按锁的粒度分类&#xff1a; 全局锁&#xff1a;锁住数据库中所有表表级锁&#xff1a;每次操作锁定整张表行级锁&#xff1a;每次操作锁定对应的行数据 2.全局锁 介绍 全局锁就是对…

【经验】linux下cuda的更换

linux下cuda的更换 查看当前cuda和cudnn的版本 nvcc -Vcudnn版本 cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2下载对应版本的cuda 查看驱动版本535.54.03 下载对应的cuda版本 版本查看https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.htm…

Revisiting PM-Based B+-Tree With Persistent CPU Cache——论文泛读

TPDS 2024 Paper 论文阅读笔记整理 问题 持久存储器&#xff08;PM&#xff09;具有接近DRAM的性能和数据持久性&#xff0c;配备PM的平台支持异步DRAM刷新&#xff08;ADR&#xff09;功能[2]&#xff0c;确保PM DIMM的内容以及已到达内存控制器的写挂起队列&#xff08;WPQ…

深度学习 --- VGG16卷积核的可视化(JupyterNotebook实战)

VGG16卷积核的可视化 在前一篇文章中&#xff0c;我对VGG16输入了一张图像&#xff0c;并实现了VGG16各层feature map的可视化。深度学习 --- VGG16各层feature map可视化(JupyterNotebook实战)-CSDN博客文章浏览阅读615次&#xff0c;点赞13次&#xff0c;收藏15次。在VGG16模…