FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(一)

news/2024/3/29 9:05:45/文章来源:https://blog.csdn.net/wandou0511/article/details/129139221

       在最后一个例程中笔者精挑细选了一个较为综合性的项目实战,其中覆盖了很多知识点,也是从一个转产产品中所提炼出来的,所以非常贴近实战项目。

       整个工程实现了用户通过对上位机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 数字变频的累加器步长和频率关系示意图

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

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

相关文章

计算时间序列周期的三种方法

周期是数据中出现重复模式所需的时间长度。更具体地说,它是模式的一个完整周期的持续时间。在这篇文章中,将介绍计算时间序列周期的三种不同方法。 我们使用City of Ottawa 数据集,主要关注的是每天的服务呼叫数量。所以不需要对病房名称进行…

选型最佳实践|从业务场景分析直播SDK

摘要 近两年即时通讯/直播产品炙手可热,市场上针对ToB的产品日益增多,企业该如何去选型呢?本文分享了笔者对于直播产品的思考,将从直播SDK实例功能特性、常见业务场景、注意事项及最佳实践等方面介绍如何进行实例选型,…

【C++】2.类和对象(上)

1.面向过程和面向对象 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。 2.类的引入…

Umi框架

什么是 umi umi 是由 dva 的开发者 云谦 编写的一个新的 React 开发框架。umi 既是一个框架也是一个工具,可以将它简单的理解为一个专注性能的类 next.js 前端框架,并通过约定、自动生成和解析代码等方式来辅助开发,减少开发者的代码量。 u…

算法18:LeetCode_链表相关算法题

链表无小事,只要是涉及到链表的算法题,边界值的设定尤为重要,而且及其容易出错误。这就要求我们平时多加练习。但是,我们在面试和笔试的过程中往往会碰到链表相关的题目,所以我们在笔试的时候一般都会借助系统提供的工…

Netty (三):进阶

文章目录1. 粘包与半包1.1 粘包现象1.2 半包现象1.3 现象分析1.4 解决方案方法1,短链接方法2,固定长度方法3,固定分隔符方法4,预设长度2. 协议设计与解析2.1 为什么需要协议?2.2 redis 协议举例2.3 http 协议举例2.4 自…

前端二面react面试题集锦

react diff 算法 我们知道React会维护两个虚拟DOM,那么是如何来比较,如何来判断,做出最优的解呢?这就用到了diff算法 diff算法的作用 计算出Virtual DOM中真正变化的部分,并只针对该部分进行原生DOM操作,而…

「TCG 规范解读」第七章 TPM工作组 TPM 总结

可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alli…

【Azure 架构师学习笔记】-Azure Data Factory (1)-调度入门

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Data Factory】系列。 前言 在开发好一个ADF pipeline(功能)之后,需要将其按需要运行起来,这个称之为调度。下图是一个简单的ADF 运作图, 按照需要的顺序&am…

【YOLOv5】 02-标注图片,训练并使用自己的模型

在上一篇文章中,我们完成了YOLOv5的安装和测试。如果想检测自定义目标,就需要用到LabelImg来对图片打标签,本篇文章介绍了LabelImg安装与使用,以及如何训练并使用自己的模型。一、安装LabelImg输入如下命令进行安装:pi…

seo优化案例截图

点击进入》》三支一扶课程聚合页面 百度统计数据 流量稳步增长, 2022年9月比2021年9月 同期增长 约30%。

rocketmq延时消息自定义配置;一个topic下tag分组

概述 使用的是开源版本的rocketmq4.9.4 rocketmq也是支持延时消息的。 rocketmq一般是4个部分: nameserver:保存路由信息broker:保存消息生产者:生产消息消费者:消费消息 延时消息的处理是在其中的broker中。 但是…

项目中异常信息的统一处理以及JSR03校验

在项目中,我们经常会对前端传过来的数据判断是否有一些错误,比如:id是否为空,传过来的名称是否合格,如果不符合我们通常会抛出异常,那么小的项目可能每次抛出异常也不是很麻烦,但是对于一个大型…

小程序上新(2022.12.12~2023.02.20)

20221216关于小程序违规收集用户隐私行为的规范20221222优先使用本地版本设置功能上线备注:已和微信官方工作人员确认,开启本地优先后,用户打开小程序过程中,异步去下载新版包,打开完成后,功能是新包,异步下载完成后提示用户重启小…

actipro-winforms-controls-23.1.0 Crack

actipro-winforms一组用于构建漂亮的 Windows 窗体桌面应用程序的 UI 控件,用于构建 IDE 的高级停靠窗口、MDI、属性网格、树控件和文件夹/文件浏览器,用于常见数据类型、自动完成、屏蔽编辑和代码编辑的强大编辑器,功能区、图表、微型图表、…

JavaScript中怎么实现链表?

JavaScript中怎么实现链表? 学习数据结构的的链表和树时,会遇到节点(node)这个词,节点是处理数据结构的链表和树的基础。节点是一种数据元素,包括两个部分:一个是实际需要用到的数据&#xff1b…

十一、项目实战一

项目实战一 需求 以 前后端不分离的方式实现学生的增删改查操作 学生列表功能 接口设计 url:/students/ 请求方法:get 参数: 格式:查询参数 参数名类型是否必传说明pageint否页码,默认为1sizeinit否每页数据条数默认为10n…

Ansys Zemax | 如何在存在全内反射 (TIR) 的情况下应用散射

在本文中,我们将展示如何利用虚拟表面来对具有全内反射 (TIR) 的物体进行建模,同时保持其他独特的表面特性,例如粗糙的表面结构。 下载 联系工作人员获取附件 简介 在OpticStudio中,全内反射 (TIR) 在其他表面属性&#xff08…

Java:顶级Java应用程序服务器 — Tomcat、Jetty、GlassFish、WildFly

如果你想编写Java web应用程序,首先需要做出一个艰难的决定:选择运行应用程序的Java应用程序服务器。什么是应用服务器?一般来说,应用程序服务器执行Java应用程序。在操作系统中启动它们,然后将应用程序部署到其中。将应用程序服…

07 二叉树

开始系统学习算法啦!为后面力扣和 蓝桥杯的刷题做准备!这个专栏将记录自己学习算法是的笔记,包括 概念, 算法运行过程,以及 代码实现,希望能给大家带来帮助,感兴趣的小伙伴欢迎评论区留言或者私…