FPGA应用开发和仿真【2.4】

发布时间:2026/10/26 14:00:32

FPGA应用开发和仿真【2.4】 4.10 用户按键和数码LED首先要说明的是用户接口除高分辨率图形界面外基本都是慢速和相对非实时的处理用户接口并非FPGA所擅长。用C/C等语言在CPU包括MCU、MPU等上少量代码能实现的功能可能用Verilog需要数倍甚至数十倍的代码量且由于CPU和程序语言易于灵活分配CPU运行时特别是在有OS时而FPGA的性能规划与资源分配则相对复杂得多用FPGA处理慢速事件也容易造成性能浪费。一般CPU和FPGA协同系统中用户接口都是交给CPU处理的FPGA则负责数据密集型计算和通信。这里介绍用户按键和数码LED主要是因为初学时简单的用户接口在实验中必不可少另外相关处理思路和方法也比较典型。4.10.1 用户按键处理处理按键首先要“去抖”按键在按下时活动触点击打固定触点会有机械振动因而造成输出波形抖动因按键形态和触点材料的不同抖动的过程一般会持续数毫秒金属触点的按键可能达到10ms而软性触点如导电橡胶或薄膜则可能在1ms以内甚至没有抖动。如图4-24所示的按下高电平有效的按键电路在按下时可能出现类似图4-25所示波形。显然这样的波形本身又只代表着一次事件在数字逻辑里是难以直接使用的。图4-24 高电平有效的按键电路图4-25 按键波形的抖动学过MCU的读者可能学到过使用外部中断然后延时判断的去抖动方法这种方法适用于中断应用的教学但并不适用于实际应用。首先为用户按键而占用本应用于应对高实时性事件的外部中断不划算其次延时如在中断中做既浪费CPU运行时、又极有可能阻塞了其他低优先级中断的响应是中断服务函数的大忌。延时如挪到非中断线程中做则提高了系统复杂性。按键去抖动的实用做法是定时查询定时器资源往往是极易复用的一般十毫秒左右的查询间隔对于用户按键也是足够的用户操作按键不可能达到50次每秒按下的持续时间也不可能短于十毫秒。在FPGA中可以使用触发器key_reg在使能en_10ms的控制下间歇地锁定即查询输入以实现去抖。因抖动持续时间一般在10ms以内可以使用10ms一次的使能控制触发器锁定输入信号如图4-26和图4-27所示。图4-26 定时查询去抖波形1图4-27 定时查询去抖波形2如果两次使能恰在抖动前和抖动后则抖动后的使能将控制触发器锁定到高电平。而如果“不幸”某次使能处在抖动期间则这次使能时触发器既有可能锁定到高电平也有可能锁定到低电平而后一次使能时触发器将锁定到高电平。但无论在抖动期间锁定到的是高电平还是低电平输出均不会有抖动区别只是输出上升沿有10ms的时间差。在得到无抖动的按键信号key_reg后再依照4.5.1节所述将其处理为使能信号即可在后续逻辑中方便地使用了。代码4-34中描述了包含去抖和转换为使能功能的按键处理模块KeyProcess其中还包含测试平台。为便于快速仿真和观察波形测试平台使用了10kHz时钟。代码4-34 按键处理模块及其仿真平台图4-28是其仿真波形片段。图4-28 KeyProcess模块仿真波形片段4.10.2 数码LED数码LED是排列成可以显示数字和少量字母的LED阵列。最常见的数码LED是七段数码LED由七个LED排列而成如图4-29所示。七段中的每一段被命名为agag段的不同亮暗组合可以形成数字09和字母af但不能统一大小写许多七段数码LED还在数字右下角增加小数点。图4-29 七段数码LED及0~9和a~f显示如果要将数字逻辑中由二进制表达的数值显示到数码LED上可选择十进制或十六进制。当然通常应使用十进制以符合用户习惯。要做十进制显示首先需要将二进制数值转换成BCD码表达的十进制。BCD码使用4位二进制表达1位十进制虽然4位二进制可表达16种状态但BCD码仅使用其中的09。例如如果将BCD码的二进制内容直接写成十六进制则与十进制字面一致目前BCD码几乎只用于十进制显示在数字系统内部表达数据和计算应只使用二进制码。代码4-35描述了一种二进制到BCD码转换模块。其思路是将输入二进制bin缓存到bin_temp然后逐周期将它与十进制100、10、1比较若大则减去100、10、1并将bcd_temp加上十六进制0x100、0x10、0x1利用其十六进制与表达的十进制字面一致的特点直至减为0时将bcd_temp输出至bcd并清零以备下次转换。其缺点是不同数据转换所需的时钟周期数不一样例如转换100仅需2个周期而转换99则需19个周期并且在转换期间发生的bin输入更改并不会予以响应。但因最终是为了显示给用户看快到接近时钟频率没有意义而短时出现的bin即使被转换和显示肉眼也观察不到所以并不影响预期功能。代码4-35 用于显示的二进制-BCD码转换模块转换为BCD码之后的数据送至数码LED显示之前还需要转换成段码即将数值转换为a~g段的亮暗组合。以1表达点亮为例代码4-36描述的模块可将4二进制数值015转换为0~9和a~f对应的段码送入BCD码则转换为显示十进制0~9的段码送入4位二进制则转换为显示十六进制0~f的段码。代码4-36 数码LED段码转换模块LED适合电流源驱动FPGA IO口输出近似为电压源需串接限流电阻才可以驱动LED。4.11 PWM和死区PWM即脉冲宽度调制Pulse Width Modulation是输出矩形波占空比与输入待调信号瞬时值呈线性关系的调制。可用待调信号与锯齿波作数值比较得到。如图4-30所示锯齿波的频率也是PWM输出信号的频率。图4-30 PWM的产生原理PWM常用于功率元件的驱动如开关电源变换器中的开关器件控制系统中的电机等。PWM也可在低要求的场合用作数模转换相当于采样率为PWM频率的DAC。PWM输出至片外再经过低通重构滤波器可得到与占空比呈正比的输出电压即与数字域待调信号呈线性关系。4.11.1 单端PWM计数器输出即是锯齿波因此PWM调制器模块可以用计数器实现。如代码4-37所示模块还提供了co输出它与PWM周期同步可用于协调前级控制系统的同步工作用于直接或间接控制系统采样率。其输出占空比其输出PWM的频率本小节和4.11.2节所述的所有PWM发生器模块输出的PWM信号频率均符合式4-3。代码4-37 参数化模的PWM发生器有时也需要有符号输入的PWM发生器如代码4-38所示注意模M应为偶数。其输出占空比代码4-38 参数化模的有符号输入PWM发生器4.11.2 差分PWM功率元件也常常用全桥驱动以便在单功率电源时获得双极性的驱动电压。驱动全桥则需要差分PWM差分PWM信号由PPositive和NNegative两个信号构成表达的占空比范围为-11表达形式也有多种。如图4-31所示从左至右分别为差动时间、固定P相、固定N相、固定低电平和固定高电平形式的一个周期波形示例。图4-31 差分PWM的不同形式表4-3罗列了不同形式下的P、N两相各自占空比与差分PWM表达的占空比η间的关系。表4-3 差分PWM不同形式下的占空比计算因电平和驱动能力限制FPGA的输出并不能直接驱动功率桥中的开关器件一般还需要使用驱动电路或专用的IC将FPGA、MCU等IO电平的PWM信号转换为大电流和满足开关器件栅极或基极电压需求的驱动信号去驱动开关器件。多数驱动电路或IC支持上述五种方式中的任何一种但有些因带有栅极电压自举电路P相和N相均不能接受接近1的占空比有些会利用两相均为1的情况控制所有开关器件关断实现驱动禁能比如驱动电机相当于让电机依惯性滑行。因而具体应使用哪种方式、有何限制应该根据驱动电路或IC的需求而定。差动时间方式可以用待调信号及其相反数与同一个计数比较得到比较简单如代码4-39所示注意M应为偶数。其输出的差分占空比代码4-39 差动时间形式的差分PWM发生器其他方式则需要一定的条件判断。代码4-40描述了固定低电平方式的差分PWM发生器注意其M不必为偶数其data输入的范围是-MM-1较相同计数模的差动时间形式范围翻倍可以认为其占空比分辨率提升了一倍。其输出的差分占空比代码4-40 固定低电平形式的差分PWM发生器代码4-41是测试上述四个PWM发生模块的测试平台为便于观察仿真波形PWM发生模块的模均设置得较小。代码4-41 各种形式PWM发生器的测试平台图4-32是仿真波形片段。图4-32 各种形式PWM发生器的仿真波形片段4.11.3 死区开关器件的开通和关断不可能在瞬间完成都会有一个线性过渡区。桥臂的上下两个开关器件如果在驱动其中一个开通的同时驱动另一个关断则两者的线性过渡区会有重叠形成从电源到地的电流通路瞬时功耗极大甚至会损坏器件。所以必须将控制开关器件开通的跳沿延迟一小段时间称为“死区时间”。另一方面多数开关器件的开通要快于关断也是需要增加死区时间的一个原因。有的功率桥驱动电路或IC会带有死区时间控制功能有的则没有这时也可在数字逻辑中增加这一功能。代码4-42描述了这一功能实现方法与代码4-17所示的脉冲展宽模块类似注意该模块在对上升沿延迟DELAY个clk周期的同时也会对下降沿延迟1个clk周期。代码4-42 死区时间模块上升沿延迟代码4-43是仿真平台的代码片段代码中将PWM分成一个桥臂的上下两路pwm_up和pwm_lo并认为上下两路均为高电平控制导通上路直接由PWM增加死区时间得到下路将PWM反相后增加死区时间得到。为方便观察仿真波形两个死区时间控制模块均仅将上升沿延后两个周期。实际应用中所需的死区时间需根据具体器件和电路测算。代码4-43 死区时间模块仿真平台片段图4-33是仿真波形的片段。图4-33 死区时间模块仿真波形片段4.12 正交增量编码器接口编码器广泛应用于运动控制系统中的位置或速率反馈。编码器分为绝对值编码器和增量编码器。前者直接反馈位置或角度为避免竞争冒险常用格雷码接口较为简单将格雷码转换为二进制码即可当然要作同步后者反馈速度或角速度当然也可积分后得到位置或角度为确定位置零点所以一般也会附有额外的零点检测。图4-34 正交增量编码器的输出波形正交增量编码器输出两个相差90°的脉冲可根据相差的正负来判定速度或角速度的正负即方向。图4-34是典型的输出波形。以正交增量旋转编码器为例。编码器会定义一个正转方向正转时A相超前于B相反转时A相滞后于B相。旋转编码器一般使用等角度分布的扇形光栅或磁栅一圈N格并以分布夹角90°k·360°/N的光敏或磁敏传感器检测以实现脉冲输出。每个栅格又称为“一线”每旋转过一线A、B两相各会输出两个跳沿共4个旋转一圈共计会有4N个跳沿输出。图4-34中前4个跳沿是A相超前于B相的情况增量1后4个跳沿是A相滞后于B相的情况增量-1因而可总结为表4-4。只要根据此表控制一个累加器累计增量便可获得编码器的速率或位置信息。表4-4 正交增量编码器的增减情况与按键类似正交编码器的跳沿也可能有抖动但只要两相的抖动不发生重叠就不会影响累加器的正常累计。因为一相电平恒定时另一相反复上下跳累加器会增减抵消因此并不需要特别设计去抖动逻辑。对于FPGA中动辄上百兆的时钟频率编码器的脉冲频率是极低的因此可参考4.5.1节的方法将处理编码器输出的跳沿处理为单周期使能信号之后根据此信号和另一相的电平来决定计数的增减如代码4-44所描述。代码4-44 正交增量编码器接口模块模块的输出acc是给定采样周期由SMP_INVT指定内的累积的脉冲个数有增有减并可以同时与多个正交编码器连接多通道。模块还提供一个acc_valid信号在每个采样周期acc更新的同时输出一次有效可用于控制后级控制系统的采样率。第12行计数器用来产生控制采样周期的co信号。第16行开始的generate生成块用来处理不同通道a_reg和b_reg形成两级触发器用来将跳沿转换为单周期使能第27~30行。第31行开始的always_ff过程驱动内部累加器iacc在每次co有效时由第34行开始的always_ff过程更新到输出acc上并将其清零以备下一周期累积。QuadEncIf模块的参数和端口说明见表4-5。表4-5 QuadEncIf模块的参数和端口说明虽然输出名为acc但实质上表达的是速度。以旋转编码器为例如果编码器线数为N则每脉冲对应转子角为2π/4Nπ/2N而采样周期为TsSintv/fclk所以编码器转子角速度其中acc为模块输出Sintv为参数SMP_INVT的值。如果需要持续累积输出相当于表达角度的输出可以直接输出iacc并且在每次co时不对其清零。但此时应注意考虑长时间持续单向旋转会造成溢出。代码4-45是正交编码器接口模块的测试平台。其中第3行QuadEncGo任务用来模拟编码器转过一线的情况ccw控制正反转qprd为转过一线所需时间的四分之一。代码4-45 正交增量编码器接口测试平台图4-35是其仿真波形片段。注意第二次输出的有效数据两个通道分别是10和5也正确地表达了在这个采样周期内转速的平均值因为两个“编码器”均正转了一段时间而后反转了稍短的时间。图4-35 QuadEncIf模块的仿真波形片段内容由AI生成
延伸阅读

更多相关文章

2026/10/25 0:35:58

用Python进行机器学习(4)K-Means算法

K-Means算法即K均值算法, 它属于一种经典的聚类算法, 何为聚类算法呢, 就是将数据集中样本划分成若干组, 这里的组又被称作簇, 英文名是。聚类算法是一种无监督学习技术, 故而它无需给数据打标签, 完全依据数据自身的特征来进行分组的。最早于1956年被给出的算法是K-Means算法,…

2026/10/25 5:45:50

CMSIS-RTOS软件定时器回调中事件标志为何延迟触发等待线程

做嵌入式的人一定见过这种场面:软件定时器回调里 set 一个事件标志,另一个高优先级线程在osEventFlagsWait上等它,逻辑上应该马上醒过来,但示波器上清清楚楚看到等待线程的引脚要慢半拍才翻转,慢几百微秒都算正常&…

2026/10/26 13:58:35

Kimi2.5 AI如何重构造价行业工作流与工程师转型

1. 项目概述:Kimi2.5对造价行业的冲击波 上周朋友圈被一款叫Kimi2.5的AI工具刷屏了。作为在造价咨询行业摸爬滚打十二年的老鸟,我连夜测试了这个号称能自动完成工程量计算、清单编制的"行业杀手"。凌晨三点盯着屏幕上自动生成的精准报表&#…

2026/10/26 13:58:35

SaaS产品增长停滞的五大诱因与诊断框架

1. 为什么产品增长会突然停滞? 产品增长停滞是每个创业者和产品经理最害怕遇到的噩梦。上周还在以15%的周环比增长,这周突然就掉到了3%,下个月甚至可能变成负增长。这种断崖式下跌往往来得毫无征兆,让团队措手不及。 我在过去8年…

2026/10/26 13:58:35

JavaWeb单体求职系统:简历解析与岗位匹配全链路实战

简介:Q_ITOffer.rar 是一套完整的锐聘网后台管理系统源码,面向Java Web初学者与求职项目实践者,聚焦招聘类SaaS系统的后台开发全流程,涵盖用户管理、职位发布、应聘流程等核心业务模块。资源共496个文件,8.93MB&#x…

2026/10/26 13:58:35

Stable Diffusion 三大核心模块原理与工程调试指南

1. 这不是“调个模型就能出图”的黑箱:Stable Diffusion 的三层解剖逻辑很多人第一次跑通 Stable Diffusion WebUI,输入一句“cyberpunk city at night, neon lights, rain”,几秒后一张细节丰富的赛博朋克街景就弹出来——那一刻的震撼&…

2026/10/26 13:58:35

Linux socket编程实战:TCP/UDP核心机制与高并发模型详解

1. 从一次线上故障说起:为什么我要把socket翻出来重讲一遍前阵子帮一个朋友排查他那个小服务的问题,现象很怪:客户端明明显示连接已经建立,但发出去的数据就像石沉大海,服务端日志里连个影子都没有。他一口咬定是业务逻…

2026/10/26 13:53:35

GL3224 USB3.0 TF读卡器:硬件卸载SD卡协议栈的原理图级实践

简介:本资源是一套基于GL3224主控芯片的USB3.0 TF读卡器完整硬件设计资料,面向嵌入式硬件工程师、PCB设计初学者及USB外设开发人员,解决高速读卡器原理图设计、多协议接口协同(USB2.0/3.0SDIO)、电源管理与固件存储电路…

2026/10/26 0:20:20

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/26 1:53:47

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/26 0:20:17

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/26 0:00:48

Nested Learning:解决AI灾难性遗忘的分层记忆架构

1. 为什么AI需要"记忆"能力?在传统深度学习模型中,我们常遇到一个根本性问题:模型在处理新任务时,往往会完全遗忘之前学到的知识。这种现象被业界称为"灾难性遗忘"(Catastrophic Forgetting)。想象一下&#…

2026/10/26 0:00:48

企业级大模型应用:OCR预处理、Dify编排与DeepSeek落地实战

1. 这不是“用大模型”,而是重构工作流的起点“大模型的应用和工具”——这八个字现在被贴在无数技术分享、招聘JD、内部立项书的标题栏里,但绝大多数人点进去后看到的,是零散的API调用示例、几个开源UI截图、或者一句“接入LLM就能降本增效”…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑