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

收藏 人收藏

    评论

    相关推荐

    告别繁琐按键,双触摸LED让你轻松调光调色!

    方案开发双触摸按键LED单/双色温驱动控制方案-ZHUOLIANWEIKEJI-定制服务品质保障技术领先在现代家居与照明设计中,便捷性、智能化以及个性化需求日益增长。传统的按键控制方式
    的头像 发表于 12-07 01:08 109次阅读
    告别繁琐<b class='flag-5'>按键</b>,双触摸<b class='flag-5'>LED</b>让你轻松调光调色!

    零基础入门PCB工程师

    各位前辈大家好,零基础入门PCB工程师,有什么学习资料推荐吗?
    发表于 11-27 16:54

    零基础嵌入式开发学习路线

    “嵌入式开发”没有接触过的同学可能会不明觉厉,但是只要你了解了,感兴趣并且有一个正确的学习路线的话,零基础也能入门。给大家介绍一个简单易懂的学习路线,让你能够从开始
    发表于 10-25 15:55

    基于FPGA实现按键消抖处理

    引言: 按键在电子产品中经常用到,由于按键的机械特性,按键在闭合或松开的瞬间伴随着一连串的抖动,这样的抖动将直接影响设计系统的稳定性。因此,必须对抖动进行处理。本文介绍如何在FPGA
    的头像 发表于 10-24 14:54 227次阅读
    基于<b class='flag-5'>FPGA</b>实现<b class='flag-5'>按键</b>消抖处理

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

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

    如何在FPGA中实现按键消抖

    FPGA(现场可编程门阵列)中实现按键消抖是一个重要的设计环节,特别是在处理用户输入时,由于物理按键的机械特性和电气特性,按键在按下和释放的瞬间会产生抖动现象,这种抖动可能导致系统错
    的头像 发表于 08-19 18:15 1789次阅读

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

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

    两片stm8s实现can通信,发送端通过按键控制接受端的pwm应该怎么写?

    两片stm8s实现can通信,发送端通过按键控制接受端的pwm应该怎么写,使用的是stm8s208r8
    发表于 05-11 06:04

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

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

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

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

    在测试STM328S103K3T6的按键控制灯亮灭时,有些会自动亮灯,为什么?

    在测试STM328S103K3T6的按键控制灯亮灭时,有些会自动亮灯,这是什么原因呢。
    发表于 04-03 07:15

    【紫光同创盘古PGX-Lite 7K教程】——(盘古PGX-Lite 7K开发板/PGC7KD-6IMBG256第三章)​键控彩灯实验例程

    demo 源文件)顶层文件源码按键控制模块按键消抖LED 控制模块 六:实验现象上电后下载完固件,默认 LD1~LD4 流水,每按下一次 KEY0,彩灯状态切换一次,总共 8 种状
    发表于 03-27 17:58

    32无法正常控制继电器开关水泵或电机

    直流电机,一样不能用的现象 以同样方式,继电器控制LED、加热片、制冷片等器件,均可实现正常按键控制开关。 以同样方式,主控芯片使用89C52,好像也是可以正常响应按键控制继电器开关
    发表于 02-29 15:47

    从入门到放弃……为什么你会觉得FPGA难学?如何学习FPGA

    问:本人零基础,想学FPGA,求有经验的人说说,我应该从哪入手,应该看什么教程,应该用什么学习板和开发板,看什么书等,希望有经验的好心人能够给我一些引导。 如果想速成,那就上网看视频吧,这样主要
    的头像 发表于 02-02 17:04 777次阅读
    从入门到放弃……为什么你会觉得<b class='flag-5'>FPGA</b>难学?如何<b class='flag-5'>学习</b><b class='flag-5'>FPGA</b>?

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

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