FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(一)
在最后一个例程中笔者精挑细选了一个较为综合性的项目实战,其中覆盖了很多知识点,也是从一个转产产品中所提炼出来的,所以非常贴近实战项目。
整个工程实现了用户通过对上位机PC端人机界面的操作,即可达到控制豌豆开发并行DAC输出给定频率和初始相位的正弦波、三角波、方波、梯形波的效果,上位机通信接口同时支持USB2.0、串口RS232和千兆网口LAN,但是同一时刻只能选择一种接口与开发板通信,为此笔者专门用Labview搭建了上位机人机界面环境并压缩成安装包,大家直接解压安装到PC端即可,上位机的具体操作将在后面详细介绍,如图1所示是豌豆开发板Artix7上并行DAC的电路。
数字变频是FPGA信号处理算法和实现的一项关键性技术,当笔者在工作中第一次用到相关技术时,也查阅了很多网络博客、收费教程和官方手册等,但遗憾的是大部分文章内容都很雷同并且很少有深入地分析或者讲解,所以在最后一个例程当中笔者会尽力把这些令人费解的地方说明清楚,整个例程既包含了数字信号处理,也包含了接口通信设计,同时结合上位机控制,朋友们完全可以将其看成一个程控波形发生器。
图1 豌豆开发板Artix7上并行DAC的电路
如图2所示是例程整体设计示意图,大家可以将其看成两个部分:前一部分是外设接口设计,后一部分是数字信号处理,这也是FPGA工程中一个非常经典的模型即外接接口和数字信号融合在一个项目里面。
伴随ADC/DAC转换速度越来越快,接口从传统意义的SPI接口到多位宽并口再到CMOS和LVDS接 口,直到现在已经发展到了JESD204B接口,这种接口则是一种新型的基于高速SERDES的ADC/DAC传输数据接口,板子与板子间的数据传输也已经引入了SFP万兆光口等,同时板子与PC端的数据传输从RS232接口到USB2.0接口再到千兆网口和USB3.0接口,最后发展到PCIE接口,所以高速接口设计和数字信号处理往往会出现在一个项目。
图2 USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波整体设计示意图
ADC和DAC作为数字信号处理的中间桥梁,在现实的项目中更有着极为广泛的应用,笔者曾读过一本国外的经典书籍“understanding_digital_signal_procesing”,里面提到了数字信号处理的两大利器即数字滤波和傅里叶变化,当然这只是针对ADC端模拟转数字芯片的采集而言,而对于DAC端数字转模拟芯片的转换来说,数字变频可以说是一个常用的重要关键性技术。
如图3所示是DSP处理器在数字信号处理中的应用示意图,即通过用ADC去采集目标信号再根据项目需求进行数字信号处理,这里涉及到采样与量化理论、离散傅里叶变化等知识在这里就不再展开了,当然实际项目当中对于ADC采集和DAC转换因为硬件上肯定存在误差还需要引入校准等操作,最后根据实际需求可能还需要通过DAC把数字信号处理的结果通过一个模拟量传输出去,大家可以看到整个DSP处理器一直工作“数字区域”对数字信号进行处理再通过ADC或者DAC实现对“模拟区域”的控制,这也是数字信号处理中一个非常经典的模型。
图3 DSP处理器在数字信号处理中的应用示意图
步入正文前,笔者在这里想多费点笔墨为大家扩展一些项目背景知识,因为都是从学生时代走过来,所以都经历了从理论到实践,从模糊到清晰的过程,可以说想建立一个完整的知识体系并不是一件蹴而就的事,需要在理论中不断理解吸收,在项目中不断学习深化,更在实践中不断归纳总结。
ADC和DAC在嵌入式学习当中可以说耳熟能详的名词了,首先早在学生时代学习数字信号处理或者信号理论等相关课程这个名词就常常在耳边响起;其次再到单片机学习,刚刚接触MCU各种教程就告诉我们其自带低速ADC和DAC即可实现数模或者模数转换的目的;再次可能用过DSP的同学都知道其强于浮点数运算,那么浮点运算又在做什么呢?于是乎ADC和DAC又久久回响在耳畔;最后再到读研或者工作用到FPGA的时候,可能真的是才一入门,铺天盖地的信息又不断地为大家传达类似的观点:FPGA具有并行、快速的特点,是高速接口设计和数字信号处理的主战场。可以说非常有趣的是,学校教学或者网络培训等都好像在做知识科普:在引出一些前沿理论和先进概念,但是在抛出内容、亮明观点以后,刚到核心部分的学习就戛然而止了,所以网络上可能只能看到同一个概念的不断地一次次被重复或者来来回回炒冷饭。
有关ADC的采样FIR、IIR、CIC等滤波器设计和FFT时域到频域变化,因为篇幅有限不过于发散,所以在这里并不详细说明,将会放在后续数字信号处理专栏结合具体实例讲解,下面我们主要围绕例程中的核心内容DAC数字变频展开,如图4所示是数字变频FPGA内部实现的示意图。

图4 数字变频FPGA内部实现的示意图
基于FPGA的数字变频实现,网络上也有很多教程和博客等介绍,看起来好像学习资源很多,但是大部分都在不断地旧调重弹或者在重复地复制粘贴,实际上会发现很多作者本身也不是非常理解这块的知识,所以传来传去还可能会带来一些错误的思想去误导大家,尤其对于初学者而言。
开门见山地对于数字变频包含了三个核心的知识点即1. 累加器步长;2. 地址间映射;3. 频率分辨率,搞明白这些对于后面理解DDS IP核的配置和任意波的实现起到重要作用,所以请大家花些时间去认真思考,如图5、图6、图7所示是数字变频的示意图,可以说这三幅示意图非常形象地把数字变频技术勾勒出来。
数字变频用最通俗易懂的话说,即给定任意一种波形就可以人为地在不改变形状的前提下自由变化频率,这项技术广泛地应用在很多领域,笔者结合这三幅图为大家详细说明数字变频中的三个知识点。
如图5所示是数字变频的内部结构示意图,大家可以清楚地看到当外部给定了“频率控制字”、“相位控制字”和外部时钟fclk后,FPGA即开始以fclk为时钟参考,每个时钟周期进行“频率控制字”的累加,其结果会加上“相位控制字”一起送至任意波的查找表,FPGA再把查找表中对应到数值送到外部DAC数模转换芯片上,最后通过硬件上运放调理输出期望频率的fout,这幅示意图很好地描绘了数字变频的内部结构,而其中的“频率控制字”即为累加器步长。

图5 数字变频的内部结构示意图
如图6所示是数字变频的累加器和地址映射示意图,通过累加器步长的介绍,大家了解到数字变频的内部存在一个以fclk为时钟周期的计数器一直在做累加操作,但是累加器应该以什么方式去映射到任意波形的查找表呢,于是很自然地引入了第二个知识点即地址间映射,显然以累加器总位宽作为波形查找表位宽是不现实的,那么这时候就需要一种映射关系即查找表地址放在累加器位宽的最高位,如下图所示,累加器位宽是12位而波形查找表的位宽仅仅是4位。
图6 数字变频的累加器和地址映射示意图
如图7所示是数字变频的累加器步长和频率关系示意图,在简单地介绍完累加器步长和地址间映射后,就涉及到第三个知识点即频率分辨率了,那么在数字变频的过程中频率分辨率又是怎么计算出来的呢,对于分辨率相信大家也耳熟能详,比如现实生活中的显示屏有各种各样的分辨率如1920*1080、1024*768、640*480等,显然分辨率越高精确度越大,对于数字变频中其实也存在相似的说法,比如设定的精度理论上可以达到小数点前两位、前一位还是后一位、后两位、后三位等,而这个最小分辨率实际上参考时钟fclk与频率累加器位宽的比值。
图7 数字变频的累加器步长和频率关系示意图
相关文章:
FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(一)
在最后一个例程中笔者精挑细选了一个较为综合性的项目实战,其中覆盖了很多知识点,也是从一个转产产品中所提炼出来的,所以非常贴近实战项目。 整个工程实现了用户通过对上位机PC端人机界面的操作,即可达到控制豌豆开发并行DAC输出…...
性能测试学习和性能瓶颈分析路线
很多企业招聘都只写性能测试,会使用LR,jmeter工具。其实会使用jmeter和LR进行性能测试还只是性能测试的第一步,离真正的性能测试工程师还很远,笔者也还在路上 .。 性能测试,都是要求测试系统性能,系统自然…...
达梦数据库(DM8)集成使用 Geoserver(2.22.2) 以及其他对应版本详解
达梦数据库(DM8)集成使用 Geoserver(2.22.2) 以及其他对应版本详解系统环境版本Geoserver 驱动对应版本达梦 8 集成 Geoserver 过程试错过程问题总结项目需要国产化,选择使用达梦数据库,在技术测试阶段&…...
全开源无加密的RuleApp文章社区APP客户端源码
内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 开源无加密的文章社区客户端源码分享 RuleApp文章社区,VIP会员,写作投稿积分商城,付费模块集成,多平台兼容这是一款开源免费,界…...
基于springboot校园二手市场平台
一、项目简介 本项目是一套基于springboot校园二手市场平台,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经过严格调试,确保…...
维度建模基本流程总结
一、维度建模基本流程图数据RD进行业务调研和数据现状调研,产出符合相关模版规范的业务知识文档和数据现状文档。数据PM也会调研相关业务产出需求设计文档,三方参与需求评审,评审通过后基建数据RD进行需求拆解,产出技术方案&#…...
RocketMQ事务消息
RocketMQ事务消息 RocketMq提供的一种高级消息类型,支持在分布式场景下面保障消息生产和本地事务的一致性 生产者将消息发送到服务端服务端将消息持久化成功后,向生产者返回ACK确认消息发送成功,此时消息状态为待投递,这种状态下的消息称之为…...
大数据处理 - 双层桶划分
分桶法简介其实本质上还是分而治之的思想,重在“分”的技巧上!适用范围: 第k大,中位数,不重复或重复的数字基本原理及要点: 因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围…...
NFC标签读写器隐私协议
【标签读写器】(以下简称“我们”)深知个人信息对您的重要性,并会尽全力保护您的个人信息安全可靠。我们致力于维持您对我们的信任,恪守以下原则,保护您的个人信息:权责一致原则、目的明确原则、选择同意原…...
DocEE:一种用于文档级事件抽取的大规模细粒度基准 论文解读
DocEE: A Large-Scale and Fine-grained Benchmark for Document-level Event Extraction 论文:NAACL2022.pdf (tongmeihan1995.github.io) 代码:tongmeihan1995/DocEE: DocEE: A Large-Scale and Fine-grained Benchmark for Document-level Event Ext…...
ImageCombiner设计源码详解
前言在前面的博客中介绍了一款Java的海报生成器ImageCombiner,原文地址:拿来就用的Java海报生成器ImageCombiner(一),在博文中简单介绍了一下代码以及一个真实的生成案例。但是对源码的介绍不多,本文就针对源码进行深入…...
python基础 | python基础语法
文章目录📚基础语法🐇输入和输出🥕print()输出🥕input()输入🐇 变量的命名🐇条件判断🥕单向判断🥕双向判断🥕多向判断🥕if嵌套🥕三元表达式&#…...
YOLOv6-3.0-目标检测论文解读
文章目录摘要算法2.1网络设计2.2Anchor辅助训练2.3自蒸馏实验消融实验结论论文: 《YOLOv6 v3.0: A Full-Scale Reloading 》github: https://github.com/meituan/YOLOv6上版本参考 YOLOv6摘要 YOLOv6 v3.0中YOLOv6-N达到37.5AP,1187FPS&…...
JAVA集合之Map >>HashMap/Hashtable/TreeMap/LinkedHashMap结构
Map 是一种键-值对(key-value)集合,键不可以重复,值可以重复。常见的实现类有:HashMap、Hashtable、TreeMap、LinkedHashMap等。 HashMap&Hashtable HashMap:数据结构为哈希表,允许使用 n…...
JavaScript从零开始 学习记录(一)
前言 选择视频课程之前,不仅查阅了资料,还询问了网友,最终敲定了学习黑马前端的视频教程,学了5小节,发现挺对自己口味的且从反响来看,还是相当不错的,便打算利用这个寒假学完 笔记范围 从这节…...
C++项目——高并发内存池(3)--central cache整体设计
1.central cache的介绍 1.1框架思想 1.1.1哈希映射 centralcache其实也是哈希桶结构的,并且central cache和thread cacha的哈希映射关系是一致的。目的为了,当thread cache某一个哈希桶下没有内存块时,可以利用之前编写的SizeClass::Index…...
Spring Boot 整合 MyBatis 配置等案例教程
运行环境:JDK 7 或 8、Maven 3.0 技术栈:SpringBoot 1.5、SpringBoot Mybatis Starter 1.2 、MyBatis 3.4 前言 距离第一篇 Spring Boot 系列的博文 3 个月了。《Springboot 整合 Mybatis 的完整 Web 案例》第一篇出来是 XML 配置 SQL 的形式。虽然 XM…...
比特数据结构与算法(第三章_下)队列的概念和实现(力扣:225+232+622)
一、队列(Queue)队列的概念:① 队列只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。② 入队列,进行插入操作的一端称为 队尾。出队列,进行删除操作的一端称为 队头。③ 队列中的元素…...
c++提高篇——STL容器实现打分系统
一、案例说明 有5名选手:选手ABCDE,10个评委分别对每一名选手打分,去除最高分,去除评委中最低分,取平均分。 二、案例实现 在实现这个系统时,我们规划一下实现的步骤以及细节: 1、创建一个选手类&#x…...
【图片上传记录三】element-ui组件详解与封装(自定义上传、限制文件大小、格式以及图片尺寸)
业务上有需求是前端上传 jpg/png/gif 格式, 并且 尺寸为 150px * 150px,300px*300px,428*428px 的图片 同时在上传的同时需要携带用户的个人信息以及其他额外信息 因此在 element-upload 基础之上 实现这个需求需要在上传前检查图片的大小,格式以及尺寸如何上传也成…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...
