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,微信公众号:电子发烧友论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【xG24 Matter开发套件试用体验】通过按键控制LED

    点完灯了,来玩点花样,通过按键来点灯。 硬件 还是看这个图 按键有 BUTTON0(PB02)和BUTTON1(PB03) 软件 这里基于blink_baremetal 工程进行修改适配。 这里进行GPIO的配置,配置好两个led
    发表于 09-01 17:21

    【xG24 Matter开发套件试用体验】7-按键点亮LED

    1介绍 之前已经点亮LED灯,并能通过延时实现LED闪烁,这里实现通过按左键控制LED灯,按下按键时对应的
    发表于 08-03 14:54

    请问怎么用按键控制1602中的5*8点阵亮灭及加减?

    请问怎么用按键控制1602中的5*8点阵亮灭及加减
    发表于 05-07 08:04

    【紫光同创盘古PGX-Nano教程】——(盘古PGX-Nano开发板/PG2L50H_MBG324第三章)键控流水灯实验例程

    的设计; 模块例化方式如下: 按键控制模块功能 接收按键输入信号。统计按键按下次数,由于流水灯模式是3种,计数统计范围是0~2循环,将计数结果传递给LED
    发表于 04-29 16:06

    【紫光同创国产FPGA教程】——(PGL22G第二章)键控流水灯实验例程

    5~10ms,取按键抖动区间开始标识,持续 10-20ms 后标识归,在抖动区间内输出保持,非消抖区间,按键状态输出。 LED 控制
    发表于 01-05 11:22

    零基础入门 Hyperlynx 仿真教程

    电子发烧友网站提供《零基础入门 Hyperlynx 仿真教程.pdf》资料免费下载
    发表于 12-22 10:49 28次下载

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

    本文完成的实验为按键控制LED灯,通过对连接按键输入的IO电平进行检测,根据电平的状态来改变LED的亮灭。 实验要求和硬件概览 在【每周一练】小眼睛
    发表于 12-21 22:45

    【每周一练】+盘古1K开发板+2. 按键控制RGB led

    :led_rgb<=`UD 12\'b1111_1111_1111; endcase end 3 实验效果 下载代码,实现效果见视频 4 学习总结 通过该实验,学习按键消抖
    发表于 12-17 11:33

    STM32按键控制LED的亮灭

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

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

    实验目的 掌握按键消抖原理,实现按键控制RDB灯颜色更换 实验要求 设计 8 种彩灯效果,选择一个按键作为控制输入,按下一次换一种显示效果 学习
    发表于 12-10 16:43

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

    按键输入由 K1 输入, LED 输出为 LD1~LD4。 实验原理 实现框架如下: 1、 顶层实现按键切换 LED 的彩灯状态; 2、 需要设计一个输入
    发表于 12-09 14:55

    【每周一练】盘古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 2307次阅读
    使用STM32<b class='flag-5'>按键控制</b><b class='flag-5'>LED</b>亮灭

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

    经过练习一:LED流水灯后,进行练习二:按键控制LED灯实验也就相对容易些,有demo加持完成实验很容易,主要还是学习代码编写。 参考资料: 1K2K链接:https://pan.ba
    发表于 11-28 15:31

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

    实验目的:掌握按键消抖原理,实现按键控制流水灯 实验要求:设计 8 种彩灯效果,选择一个按键作为控制输入,按下一次换一种显示效果
    发表于 11-22 11:47