当前位置: 首页 > news >正文

FPGA实现多路并行dds

  • 目录

  1. 基本原理

    verilog代码

    仿真结果​

  2. 基本原理

    1.        多路并行dds,传统DDS的局限性在于输出频率有限。根据奈奎斯特采样定理,单路DDS的输出频率应小于系统时钟频率的一半。但是在很多地方,要使采样率保持一致,所以,为了提高采样率,可以采样多路并行dds技术,然后并转串输出,提高采样率。

       这里假设使用4个dds产生4路并行的dds,其中,4路dds的可以分别表示为:

  1. 可以从上式中看出,4路dds的pinc(频率控制字)是一样,差别是在其相位差(poff)DDS0的poff是0;DDS1的poff是fofs*1;,DDS2的poff是fofs*2;DDS3的poff是fofs*3

    假如fs是100MHz,调用4个并行的dds,然后按照顺序将4路并行的dds拼接成一路(并转串),这样就相当于采样率是4*fs,即400MHz采样率下的数据

  2. verilog代码

    1. 这里使用4路并行dds
  3. assign dds_pinc = 32'd107374182; //fs 100m.f_out =10M 30bit ;26843545 //107374182
    assign dds_poff = 32'd107374182*0; //fs 100m.f_out =10M 30bit ; 26843545
    //
    assign dds_pinc_1 = 32'd107374182; //fs 100m.f_out =10M 30bit ;
    assign dds_poff_1 = 32'd107374182*1; //fs 100m.f_out =10M 30bit ; //26843545
    //
    assign dds_pinc_2 = 32'd107374182; //fs 100m.f_out =10M 30bit ;
    assign dds_poff_2 = 32'd107374182*2; //fs 100m.f_out =10M 30bit ;
    //
    assign dds_pinc_3 = 32'd107374182; //fs 100m.f_out =10M 30bit ;
    assign dds_poff_3 = 32'd107374182*3; //fs 100m.f_out =10M 30bit ;
    assign dds_t_data = {dds_poff,dds_pinc};
    assign dds_t_data_1 = {dds_poff_1,dds_pinc_1};
    assign dds_t_data_2 = {dds_poff_2,dds_pinc_2};
    assign dds_t_data_3 = {dds_poff_3,dds_pinc_3};
    //
    always@(posedge clk) begin if(rst == 1'b1)begin gen_valid <= 1'b0;end else if(start == 1'b1)begin gen_valid  <= 1'b1;end else begin gen_valid <= gen_valid;end
    endassign sin_0 = m_axis_data_tdata[31:16];
    assign cos_0 = m_axis_data_tdata[15:0];
    assign sin_1 = m_axis_data_tdata_1[31:16];
    assign cos_1 = m_axis_data_tdata_1[15:0];
    assign sin_2 = m_axis_data_tdata_2[31:16];
    assign cos_2 = m_axis_data_tdata_2[15:0];
    assign sin_3 = m_axis_data_tdata_3[31:16];
    assign cos_3 = m_axis_data_tdata_3[15:0];
    dds100m_0 dds100m_0_inst (.aclk(clk),                                  // input wire aclk.s_axis_config_tvalid(gen_valid),  // input wire s_axis_config_tvalid.s_axis_config_tdata(dds_t_data),    // input wire [63 : 0] s_axis_config_tdata.m_axis_data_tvalid(dds_data_valid),      // output wire m_axis_data_tvalid.m_axis_data_tdata(m_axis_data_tdata),        // output wire [31 : 0] m_axis_data_tdata.m_axis_phase_tvalid(),    // output wire m_axis_phase_tvalid.m_axis_phase_tdata()      // output wire [31 : 0] m_axis_phase_tdata
    );
    dds100m_0 dds100m_1_inst (.aclk(clk),                                  // input wire aclk.s_axis_config_tvalid(gen_valid),  // input wire s_axis_config_tvalid.s_axis_config_tdata(dds_t_data_1),    // input wire [63 : 0] s_axis_config_tdata.m_axis_data_tvalid(dds_data_valid),      // output wire m_axis_data_tvalid.m_axis_data_tdata(m_axis_data_tdata_1),        // output wire [31 : 0] m_axis_data_tdata.m_axis_phase_tvalid(m_axis_phase_tvalid),    // output wire m_axis_phase_tvalid.m_axis_phase_tdata(m_axis_phase_tdata)      // output wire [31 : 0] m_axis_phase_tdata
    );
    dds100m_0 dds100m_2_inst (.aclk(clk),                                  // input wire aclk.s_axis_config_tvalid(gen_valid),  // input wire s_axis_config_tvalid.s_axis_config_tdata(dds_t_data_2),    // input wire [63 : 0] s_axis_config_tdata.m_axis_data_tvalid(dds_data_valid),      // output wire m_axis_data_tvalid.m_axis_data_tdata(m_axis_data_tdata_2),        // output wire [31 : 0] m_axis_data_tdata.m_axis_phase_tvalid(m_axis_phase_tvalid),    // output wire m_axis_phase_tvalid.m_axis_phase_tdata(m_axis_phase_tdata)      // output wire [31 : 0] m_axis_phase_tdata
    );
    dds100m_0 dds100m_3_inst (.aclk(clk),                                  // input wire aclk.s_axis_config_tvalid(gen_valid),  // input wire s_axis_config_tvalid.s_axis_config_tdata(dds_t_data_3),    // input wire [63 : 0] s_axis_config_tdata.m_axis_data_tvalid(dds_data_valid),      // output wire m_axis_data_tvalid.m_axis_data_tdata(m_axis_data_tdata_3),        // output wire [31 : 0] m_axis_data_tdata.m_axis_phase_tvalid(m_axis_phase_tvalid),    // output wire m_axis_phase_tvalid.m_axis_phase_tdata(m_axis_phase_tdata)      // output wire [31 : 0] m_axis_phase_tdata
    );

    仿真结果

  4. 可以从上图中看出,输出的余弦波有明显的相位差,最后只需要将这4路并行的dds拼接起来(并转出),即可实现4*fs 采样率。

相关文章:

FPGA实现多路并行dds

目录 基本原理 verilog代码 仿真结果​ 基本原理 多路并行dds&#xff0c;传统DDS的局限性在于输出频率有限。根据奈奎斯特采样定理&#xff0c;单路DDS的输出频率应小于系统时钟频率的一半。但是在很多地方&#xff0c;要使采样率保持一致&#xff0c;所以&#xff0c;为了…...

ArcgisPro3.1.5安装手册

ArcgisPro3.1.5安装手册 一、目录介绍: 二、安装教程&#xff1a; (1)安装顺序&#xff1a;最先安装运行环境&#xff08;runtime6.0.5&#xff09;,接着安装install里面的文件&#xff0c;最后复制path里面的文件替换到软件bin文件夹下即可。 (2)具体安装步骤&#xff…...

三大主流框架

Web前端开发领域中&#xff0c;三大主流框架通常指的是&#xff1a; React&#xff1a;由Facebook开发的一个用于构建用户界面的JavaScript库。React以其组件化、声明式编程和虚拟DOM等特点而广受欢迎&#xff0c;能够高效地更新和渲染大型应用。 Vue.js&#xff1a;由尤雨溪创…...

【C++】:vector容器的底层模拟实现迭代器失效隐藏的浅拷贝

目录 &#x1f4a1;前言一&#xff0c;构造函数1 . 强制编译器生成默认构造2 . 拷贝构造3. 用迭代器区间初始化4. 用n个val值构造5. initializer_list 的构造 二&#xff0c;析构函数三&#xff0c;关于迭代器四&#xff0c;有关数据个数与容量五&#xff0c;交换函数swap六&am…...

必看项目|多维度揭示心力衰竭患者生存关键因素(生存分析、统计检验、随机森林)

1.项目背景 心力衰竭是一种严重的公共卫生问题,影响着全球数百万人的生活质量和寿命,心力衰竭的病因复杂多样,既有个体生理因素的影响,也受到环境和社会因素的制约,个体的生活方式、饮食结构和医疗状况在很大程度上决定了其心力衰竭的风险。在现代社会,随着生活水平的提…...

centos安装Redis

在CentOS上安装Redis的步骤如下&#xff1a; 使用yum安装依赖库&#xff1a; sudo yum install -y gcc make 下载Redis源码&#xff1a; wget http://download.redis.io/releases/redis-6.0.9.tar.gz 解压Redis源码&#xff1a; tar xzf redis-6.0.9.tar.gz 编译Redis&…...

继承与多态2

2.5&#xff08;杨.丹尼尔梁英文第11版P537&#xff1a;*13.12&#xff09;&#xff08;几何对象的面积求和&#xff09;写一个方法&#xff0c;将数组中所有几何对象的面积求和。 方法签名是: 公共静态双求和区域&#xff08;几何对象【】a&#xff09; 编写一个测试程序&…...

在RT-Thread下为MPU手搓以太网MAC驱动-3

文章目录 MAC驱动支持不同的PHY芯片关于对PHY设备抽象的改进RT-Thread下PHY设备抽象接口的改进关于对PHY设备抽象的改进 这是个人驱动开发过程中做的一些记录&#xff0c;仅代表个人意见和理解&#xff0c;不喜勿喷 MAC驱动需要支持不同的PHY芯片 MAC驱动支持不同的PHY芯片 关…...

Cocos Creator 2D物理引擎的使用详解

前言 Cocos Creator是一款优秀的游戏开发工具&#xff0c;它提供了强大的2D物理引擎&#xff0c;帮助开发者轻松实现游戏中的物理效果。在本文中&#xff0c;我们将详细介绍Cocos Creator中2D物理引擎的使用方法&#xff0c;并通过代码实现来演示其具体应用。 对惹&#xff0…...

618局外人抖音:别人挤压商家“拼价格”,它默默联合商家“抢用户”?

文&#xff5c;新熔财经 作者&#xff5c;宏一 “618”来临之际&#xff0c;各电商平台和短视频平台早已打响了“促销大战”。不过&#xff0c;今年各大平台都更积极适应新的消费形式&#xff0c;调整了“大促动作”。 比如淘宝、京东带头取消了沿用十年之久的预售机制&…...

【Unity AR开发插件】五、运行示例程序

专栏 本专栏将介绍如何使用这个支持热更的AR开发插件&#xff0c;快速地开发AR应用。 链接&#xff1a; Unity开发AR系列 热更数据制作&#xff1a;制作热更数据-AR图片识别场景 插件简介 通过热更技术实现动态地加载AR场景&#xff0c;简化了AR开发流程&#xff0c;让用户可…...

JavaScript className 类名属性操作

在JavaScript中&#xff0c;可以通过className属性来操作HTML元素的类名。 添加类名&#xff1a;可以使用element.className "className"来添加一个类名到元素中。 var element document.getElementById("myElement"); element.className " newC…...

做场外个股期权怎么询价

做场外个股期权怎么询价&#xff1f;没有具体的哪家做市商是询价是最低的&#xff0c;个人投资者需要通过机构通道方询价进行对比&#xff0c;各券商的报价由询价机构方提供给到投资者&#xff0c;可以参考不同券商的报价进行比对&#xff0c;再决定是否进行投资。本文来自&…...

Databend 开源周报第 146 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持 Expressio…...

Android12.0 SIM卡语言自适应

文章目录 需求语言设定Settings中语言切换流程检测到SIM卡&#xff0c;更新系统语言最终修改 需求 要求系统语言跟随SIM卡的语言变化。 语言设定 (1)系统预置语言, 即在makefile中指定的语言 (2)重启, 如果未插卡, 则系统语言为预置的语言 (3)重启插入SIM卡开机, 会自适应为…...

滴滴一季度营收同比增长14.9%至491亿元 经调整EBITA盈利9亿元

【头部财经】5月29日&#xff0c;滴滴在其官网发布2024年一季度业绩报告。一季度滴滴实现总收入491亿元&#xff0c;同比增长14.9%&#xff1b;经调整EBITA&#xff08;非公认会计准则口径&#xff09;盈利9亿元。其中&#xff0c;中国出行一季度实现收入445亿元&#xff0c;同…...

C语言 指针——指针变量的定义、初始化及解引用

目录 指针 内存如何编址&#xff1f; 如何对变量进行寻址&#xff1f; 用什么类型的变量来存放变量的地址? 如何显示变量的地址?​编辑 使用未初始化的指针会怎样&#xff1f; NULL是什么&#xff1f; 如何访问指针变量指向的存储单元中的数据&#xff1f; 指针变量的…...

详解 Spark 的运行架构

一、核心组件 1. Driver Spark 驱动器节点&#xff0c;用于执行 Spark 任务中的 main 方法&#xff0c;负责实际代码的执行工作主要负责&#xff1a; 将用户程序转化为作业 (job)在 Executor 之间调度任务 (task)跟踪 Executor 的执行情况通过 UI 展示查询运行情况 2. Exec…...

盲盒小程序开发,为市场带来的新机遇

近年来&#xff0c;盲盒市场一直处于热门行业中&#xff0c;发展非常快速。在互联网的支持下&#xff0c;也衍生出了线上盲盒小程序&#xff0c;实现了线上线下双发展的态势。 盲盒小程序作为一种新的盲盒购物方式&#xff0c;受到了盲盒消费者的喜爱&#xff0c;为盲盒行业的…...

stm32学习-流水灯

接线 注意&#xff1a;LED灯长一点的引脚是正极。 配置GPIO 1.使用RCC开启GPIO时钟 void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); void RCC_APB1Perip…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...