0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【教程分享】 FPGA零基础学习:按键控制LED

电子发烧友论坛 来源:未知 2023-06-13 08:05 次阅读

本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子信息通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。


系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。后续会陆续更新 Xilinx 的 Vivado、ISE 及相关操作软件的开发的相关内容,学习FPGA设计方法及设计思想的同时,实操结合各类操作软件,会让你在技术学习道路上无比的顺畅,告别技术学习小BUG卡破脑壳,告别目前忽悠性的培训诱导,真正的去学习去实战应用,这种快乐试试你就会懂的。话不多说,上货。


按键控制LED


利用按键控制LED的要求为:按一下按键,改变一下LED的状态。按键按一次,LED由熄灭变为点亮,按键再按一次,LED由点亮变为熄灭。


硬件介绍



开发板上面有四个按键,当按键按下时,将对应的网络置成低电平;当按键释放时,将对应的网络置成高电平。


开发板上面有四个LED发光二极管,FPGA输出高电平时,LED点亮;FPGA输出低电平时,LED熄灭。


设计原理

通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。



按键抖动会引起一次按键被误读多次。为确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。

抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。这是一个很重要的时间参数,在很多场合都要用到。按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。

我们可以在按键和主控设备之间加入消抖电路(消抖芯片电容等),此种方法会增大PCB面积和花费一定的物料费用。大多数的板子直接将按键和主控设备相连接,将带有抖动的波形输入到主控设备内部,由内部进行消抖处理。

单片机一般采用延迟重采样的方式进行消抖。当检测信号为低时,延迟一段时间(一般为20ms),再次检测信号是否为低,如果为低,则证明按键按下,否则认为按键没有按下,继续下一次检查。

在FPGA设计时,笔者推荐另外一种方式:持续采样。当检测到信号持续为低10ms,认为按键按下;当检测到信号持续为高10ms,认为按键释放。

在设计时,需要考虑到外部的按键信号为异步信号,需要进行同步处理。具体请参考附录2 FPGA中的同步信号、异步信号和亚稳态。

每次按键按下的时间的长短不一,经过消抖后,低电平的持续长度长短也不一样。此长度远远大于一个时钟周期的长度。要求每次按下只能够切换一次LED的状态,所以不能够直接用此电平当做输出翻转的使能。

经过消抖的波形,每次按下只有一个下降沿(按键按下时)、只有一个上升沿(按键释放时)。所以通过检测下降沿(上升沿)的变化,产生一个新的信号------脉冲(一个时钟周期的脉冲),利用此脉冲作为翻转的使能即可。利用检测到下降沿的脉冲翻转时,LED的状态会在按下时就会改变;利用检测到上升沿的脉冲翻转时,LED的状态会在释放时发生改变。本设计中采用检测到下降沿的脉冲进行翻转。


设计架构和信号说明

本设计模块命名为key_led。



在设计中,共分为三个模块。

  • key_filter(按键消抖模块):将外部输入的带有抖动的波形进行消抖。

  • edge_check(边沿检测模块):将消抖后的波形进行下降沿检测,并产生对应的脉冲。

  • led_ctrl(led控制模块):利用脉冲,翻转led的输出状态。



key_filter设计实现

本设计采用状态机实现,状态机的具体原理请参看附录3。


对key_n信号为异步信号,需要进行同步两拍,命名为key_n_r和key_n_rr。状态机的判断信号为key_n_rr信号。


本设计共分为四个状态,KEY_OFF(按键释放状态),SHAKE_ON(按键按下时抖动判断状态),KEY_ON(按键按下状态),SHAKE_OFF(按键释放时抖动判断状态)。


按键没有按下时,一直KEY_OFF状态,当按键信号变为低电平时,就转入SHAKE_ON状态,检测低电平的持续时间。如果持续时间没有达到T_10ms就变为高电平,则清零计数器并返回KEY_OFF状态;如果持续时间没有达到T_10ms并且也一直为低电平,则继续在SHAKE_ON状态计数;如果持续时间达到T_10ms并且为低电平,则清零计数器并进入KEY_ON状态。在KEY_ON状态,外部输入为低电平时,则继续在KEY_ON状态;如果外部输出为高电平,则转入SHAKE_OFF状态。在SHAKE_OFF状态,如果持续时间没有到达T_10ms就变为低电平,则清零计数器并返回KEY_ON状态;如果持续时间没有达到T_10ms并且一直为高电平,则继续在SHAKE_OFF状态计数;如果持续时间达到T_10ms并且一直为高电平,则清零计数器并转入KEY_OFF状态。


在KEY_OFF和SHAKE_ON状态,认为按键没有按下;在KEY_ON和SHAKE_OFF状态,认为按键为按下。


状态转移图如下:




设计代码为:


localparam可以定义参数,与parameter的区别在于,parameter定义的参数可以在例化时进行参数修改,而localparam定义的参数在例化时则不能够修改。定义状态机状态时,一般采用localparam的定义方式。在不希望别人修改参数时,也可以定义为localparam。


edge_check设计实现

在一个波形中,如果当前时刻为低电平,上一个时刻为高电平,则认为波形中有一个下降沿;如果当前时刻为高电平,上一个时刻为低电平,则认为波形中有一个上升沿。


在数字电路设计时,可以采用寄存器来存储上一个时刻的值。



在寄存器电路中,Q的值,永远是上一个CLK的有效边沿所采样的D值。因此Q为上一时刻值,而D为当前时刻的值。


设计代码为:


在设计中,注释掉的两行代码和其下方的一行代码的功能是相同的。例:对于上升沿脉冲来说,现在为1,过去为0即为上升沿。由于寄存器每个时钟周期都刷新,满足这个要求的只会存在一个时钟周期,所以flag_pos为一个时钟周期的脉冲。


led_ctrl设计实现

本模块中,利用脉冲进行led状态的翻转即可。


设计代码为:


key_led设计实现

本模块只是负责将上述的三个模块按照架构图的方式进行连接,形成最终的设计。


设计代码为:


在设计中,采用了按键按下时的脉冲(检测到下降沿的脉冲),按键按下时led的状态即可进行翻转。



功能仿真

在仿真时,将按键消抖中的T_10ms的参数修改为20,即持续时间不超过400ns都不认为是有效按下或者抬起。


仿真代码如下:


将okey_n、flag信号添加出来。



通过RTL仿真图,可以清晰的看到okey_n信号将key_n的抖动滤除掉;flag信号为okey_n信号的下降沿时所产生的脉冲;led在flag信号为高时,反正翻转。


分配管脚、下板测试之前,应该将按键消抖里面的T_10ms参数重新改为500_000,否则下板后可能会达不到消抖的效果。


下板成功后,可以修改在设计中使用上升沿的脉冲,得到的现象应该是按键释放时,LED的状态发生反转。


切记:每次修改代码,一定要进行重新编译,否则更改将不会生效。






声明本文由电子发烧友社区发布,转载请注明以上来源。如需社区合作及入群交流,请添加微信EEFans0806,或者发邮箱liuyong@huaqiu.com。


更多热点文章阅读

  • 采用先进成熟工艺和自主产权体系结构,紫光同创FPGA开发板入门指导

  • 嵌入式Linux开发秘籍!工程师大佬亲历分享项目样例

  • RK3568!四核64位ARMv8.2A架构,汇聚编译源码及实战样例

  • 尺寸仅有21mm*51mm,板边采用邮票孔设计,合宙 Air105 核心板开发总结

  • 基于Cortex-M3内核的32位微控制器STM32项目实战分享!


原文标题:【教程分享】 FPGA零基础学习:按键控制LED

文章出处:【微信公众号:电子发烧友论坛】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

原文标题:【教程分享】 FPGA零基础学习:按键控制LED

文章出处:【微信号:gh_9b9470648b3c,微信公众号:电子发烧友论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32按键控制LED的亮灭

    使用一个按键控制LED的亮灭,按键按下时LED亮起,按键松开时LED熄灭。通过
    的头像 发表于 12-11 14:19 2024次阅读
    STM32<b class='flag-5'>按键控制</b><b class='flag-5'>LED</b>的亮灭

    【每周一练】盘古1K开发板 练习二:按键控制LED灯实验

    本篇学习实现按键控制8种LED灯,按一下切换一种效果 1.打开MES2KG\\demo\\3_key_led_rgb工程,菜单Project->Project Settings,
    发表于 12-06 00:36

    使用STM32按键控制LED亮灭

    本次实验所用到的Simulink模型如图5.1所示,实验现象: 按键按下、松开LED循环实现翻转亮灭效果,当按键按下时,产生下降沿脉冲,通过一个计数器对下降沿脉冲进行0~1循环计数,计数到最大值时产生输出信号,输出信号为0时,
    的头像 发表于 11-29 16:22 800次阅读
    使用STM32<b class='flag-5'>按键控制</b><b class='flag-5'>LED</b>亮灭

    单片机怎么用简单按键控制LED灯呢?

    单片机怎么用简单按键控制LED灯呢? 单片机已成为现代电子产品中不可缺少的核心部件。它可以帮助设计者将各种不同的电子元件集成在一起,实现各种各样的功能。单片机有许多用途,但是其中之一是用来控制外部
    的头像 发表于 09-02 17:05 2609次阅读

    stm32按键控制led灯亮灭

    stm32按键控制led灯亮灭  在嵌入式系统中,硬件按键常常被用作开关输入,控制LED灯亮灭。在STM32系列单片机中,有多种方式实现
    的头像 发表于 09-02 17:05 7608次阅读

    单片机独立按键控制led灯程序

    单片机独立按键控制LED灯程序 单片机独立按键控制LED灯程序是一种简单而有趣的电子学习项目,它通常由一个单片机芯片、一个
    的头像 发表于 09-02 17:05 3754次阅读

    单片机独立按键控制4个LED灯亮灭

    单片机四个按键分别控制四个LED的亮灭!
    发表于 08-29 09:17 2799次阅读

    基于单片机按键控制多个LED

    两个按键控制8位LED灯。
    的头像 发表于 08-16 09:35 1216次阅读

    如何用按键控制不同的LED流转模式?

    实现的任务就是用LCD做一个菜单,用按键控制不同的LED流转模式。
    发表于 07-26 16:53 488次阅读
    如何用<b class='flag-5'>按键控制</b>不同的<b class='flag-5'>LED</b>流转模式?

    使用51单片机实现按键控制LED灯的亮灭

    接前两集,这集我们实现用按键控制LED灯的亮灭。首先,仍旧是分析硬件电路原理图。
    发表于 07-11 11:40 3802次阅读
    使用51单片机实现<b class='flag-5'>按键控制</b><b class='flag-5'>LED</b>灯的亮灭

    使用按键控制LED

    你好,我是爱吃鱼香ROS的小鱼。上一节完成了LED灯的控制,本节我们学习下如何使用按键
    的头像 发表于 07-03 10:53 1500次阅读
    使用<b class='flag-5'>按键控制</b><b class='flag-5'>LED</b>灯

    FPGA零基学习之Vivado-按键使用教程

    讲解的轻触开关,第二种是自锁按键按键按下后保持自锁状态,整个按键处于一直连通状态,再次按下,开关断开,同时开关按钮弹出。 本次我们实验任务,将使用按键控制
    发表于 06-13 18:33

    基于89C51单片机的1个独立按键控制LED状态转换源程序

    基于89C51单片机的1个独立按键控制LED状态转换源程序
    发表于 05-12 17:35 1次下载

    CH32V103基础教程74-按键控制LED

    本章教程主要进行按键控制LED灯实验,主要涉及到GPIO的输入输出。本章教程在第二章GPIO的基础上进行,第二章已经对GPIO点亮LED灯进行讲解配置,因此本章主要讲解按键控制的程序配
    发表于 05-06 15:50

    基于AT89C51单片机按键控制8×8LED点阵屏显示图形

    基于AT89C51单片机按键控制8×8LED点阵屏显示图形仿真及代码
    发表于 05-04 15:43 2次下载