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 基础之上 实现这个需求需要在上传前检查图片的大小,格式以及尺寸如何上传也成…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...