二、13【FPGA】按键消抖

这篇具有很好参考价值的文章主要介绍了二、13【FPGA】按键消抖。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接。

学习视频:是根据野火FPGA视频教程——第十六讲
https://www.bilibili.com/video/BV1nQ4y1Z7zN?p=3

理论学习

按键常常作为系统复位信号和控制信号的外部输入,主要分为自锁按键、机械按键和薄膜按键等。开发板上一般采用机械按键,但是当机械触电断开、闭合时,由于机械触电的弹性作用,一个按键开关在闭合时不会马上稳定导通,断开时不会一下子完全断开,会出现瞬间的抖动。影响按键的输入状态,因此需要对按键进行消抖处理。

二、13【FPGA】按键消抖

抖动时常由按键本身决定,一般在5ms~10ms。

1、硬件消抖

        按键较少时可以使用硬件消除抖动,即使其在状态第一次出发后就保持。这里用到了RS触发器作为常用的硬件去抖。

二、13【FPGA】按键消抖

 当按键未按下时输出0,按下为1。按键因弹性抖动而产生瞬时断开(抖动跳开B),只要不返回原始状态A,双稳态电路的状态不会改变,输出保持0,不会产生抖动波形。

2、软件消抖

        当按键较多时使用硬件消抖需要占用太多资源,因此通过软件编程消抖。即检测到按键闭合后执行一个延时程序,由于抖动时间在5~10ms,我们产生一个20ms的延时,当前后两个状态相同时才能确定按键的真实状态

实战演练

1、设计规划

实现一个按键消抖模块,将按键做消抖处理后正常被其他模块调用

2、程序设计

2.1 波形图绘制

二、13【FPGA】按键消抖

按键脉冲产生方式:

  • 传统方法:当按键被检测按下时,延时20ms+10ms时间重新检测,如果依然是低电平则产生一个时钟单位的脉冲。问题:这里计数器需要将10ms的时间计算在内浪费资源。
  • 脉冲计数器:当检测到按键被按下时开始脉冲计数,当20ms后(50MHz,计数到999999)后产生一个时钟单位的脉冲,且重新计数。当按键未按下时,计数器清零。问题:当按键按的时间过长时,将会产生多个脉冲。
  • 保持计数:当计数器计到999999时,计数器的值将会保持,只有检测到按键未按下的高电平时,才会被清零。因此计数器确定被按下时计数器的999998值只会出现一次。这时产生一时钟周期的脉冲即可。

2.2 代码编写 

module key_filter
#(
    parameter CNT_MAX = 20'd999_999       //最大计数时间20ms
)
(
    input wire sys_clk,
    input wire sys_rst_n,
    input wire key_in,
    output reg key_flag
    );
    reg [19:0] cnt; 
    always @(posedge sys_clk or negedge sys_rst_n)
        if(sys_rst_n == 1'b0)
            cnt <= 20'd0;
        else if(key_in == 1'b1)
            cnt <= 20'd0;
        else if(key_in == 1'b0 && cnt == CNT_MAX)
            cnt <= CNT_MAX;
        else 
            cnt <= cnt + 1'b1;
    always @(posedge sys_clk or negedge sys_rst_n)
        if(sys_rst_n == 1'b0)
            key_flag <= 1'b0;        
        else if(cnt == CNT_MAX - 1'b1)
            key_flag <= 1'b1;
        else 
            key_flag <= 1'b0;
endmodule

三、逻辑仿真

3.1 仿真文件的编写

`timescale 1ns / 1ns
//
// Company: 追逐者——桥的小作坊
// Create Date: 2022/05/12 17:19:33
// Design Name: 按键消抖
// Module Name: tb_key_filter
//
module tb_key_filter();
    reg sys_clk ;
    reg sys_rst_n ;
    reg key_in ;
    reg [7:0] tb_cnt ;
    wire key_flag ;
    
    initial begin
        sys_clk = 1'b1;
        sys_rst_n <= 1'b0;
        #20
        sys_rst_n <= 1'b1;
    end 
    always #10 sys_clk = ~sys_clk;
//通过计数器模拟按键抖动过程
    always @(posedge sys_clk or negedge sys_rst_n)
        if(sys_rst_n == 1'b0)
            tb_cnt <= 8'd0;
        else if(tb_cnt == 8'd249)
            tb_cnt <= 8'd0;
        else 
            tb_cnt <= tb_cnt + 8'd1;
    always @(posedge sys_clk or negedge sys_rst_n)
        if(sys_rst_n == 1'b0)
            key_in <= 1'b1;
        else if(((tb_cnt >= 8'd19) && (tb_cnt <= 8'd49))
             ||((tb_cnt >= 8'd149) && (tb_cnt <= 8'd199)))
             key_in <= {$random} % 2;
        else if((tb_cnt < 8'd19) || (tb_cnt > 8'd199))
            key_in <= 1'b1;
        else
            key_in <= 1'b0;   
//实例化            
key_filter 
#(
    .CNT_MAX(20'd24)      //最大计数时间20ms
)
key_filter_inst
(
    .sys_clk  (sys_clk  ),
    .sys_rst_n(sys_rst_n),
    .key_in   (key_in   ),
    .key_flag (key_flag )
);          
endmodule

3.2 仿真波形图对比

二、13【FPGA】按键消抖

 文章来源地址https://www.toymoban.com/news/detail-426168.html

到了这里,关于二、13【FPGA】按键消抖的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA开发:按键消抖

    相关阅读 FPGA开发专栏 https://blog.csdn.net/weixin_45791458/category_12388695.html?spm=1001.2014.3001.5482         按键是FPGA开发板上的重要交互元件,因为按键的内部的结构设计,在按下和松开按键时,按键会无法避免地产生机械抖动,因此要对按键输入进行特殊处理,否则可能会因为机械

    2024年02月15日
    浏览(51)
  • FPGA按键消抖

    按键是输入设备,一般来说,按键在没有按下的时候是高电平;当按键按下的时候,为低电平。 在 DE2-70 User Manual 中 Each switch provides a high logic level (3.3 volts) when it is not pressed, and provides a low logic level (0 volts) when depressed. Since the pushbutton switches are debounced, they are appropriate for use

    2024年02月15日
    浏览(52)
  • 基于FPGA的按键消抖

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

    2024年02月16日
    浏览(52)
  • 【FPGA入门】第五篇、按键消抖

    目录 第一部分、按键抖动现象 第二部分、消抖思路及代码 1、简单的按键消抖思路 2、实际按键消抖思路 3、实际按键消抖模块代码 第三部分、总结         只要学习过单片机的都会知道,按键在按下去和松开的那个瞬间都存在抖动,在单片机消除抖动最简单的方式就是 延

    2024年02月11日
    浏览(43)
  • FPGA拾忆_(10):按键控制蜂鸣器_边沿检测_按键消抖

    1.硬件特征: 轻触式(回弹式)按键         略 蜂鸣器: 分为蜂鸣器按照结构原理不同可分为压电式蜂鸣器和电磁式蜂鸣器。 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、 阻抗匹配器及共鸣箱、外壳等组成; 电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组

    2024年04月10日
    浏览(41)
  • 学习笔记|按键原理|消抖|按键点灯的4种模式|STC32G单片机视频开发教程(冲哥)|第七集:按键点灯

    来源:爱问知识人:sos用灯光怎么表示 三短三长三短 SOS作为世界上通用的求救信号,如果用灯光信号来表示,三短亮代表字母S,三长亮代表字母O,再接着的三短亮代表S。 灯的长亮时间是短亮时间的三倍,而短亮时间则与LED两次点亮的间隔时间相同,字母与下一个字母间也有

    2024年02月12日
    浏览(48)
  • linuxARM裸机学习笔记(5)----定时器按键消抖和高精度延时实验

    之前的延时消抖,是直接借助delay函数进行的,但是这样会浪费CPU的性能。我们采用延时函数的方式实现,可以实现快进快出。  定时器消抖,必须是在t3的时间点才可以,当在t1,t2的时间点每次进入中断函数都要重新开启定时器的计时 但是,这两个时间点的时间小于定时器设

    2024年02月14日
    浏览(74)
  • 蓝桥杯单片机学习日记3-矩阵键盘的使用,线反转法,三步消抖,按键长按与短按

    此片文章用于记录蓝桥杯单片机的学习 篮球杯单片机上的矩阵按键原理图如下:   使用矩阵键盘时,要将跳线帽J5跳至KBD模式。   值得注意的是,若开发板上的单片机使用的为STC15,那么以上原理图适用。如果单片机为IAP15,则在上述原理图中,要将P36换成P42,P37换成P44。  

    2023年04月10日
    浏览(50)
  • Gowin FPGA学习记录——前言

            好久没有写博客了,想想是不是又该写点啥东西了么,准备写点国产FPGA的使用经历吧                  得益于目前国内的政策对国产化芯片扶持,越来越要求核心器件能够自主可控,因此作为核心芯片FPGA,国产FPGA的势头也发展很快。          现在FPGA的这

    2024年02月16日
    浏览(43)
  • FPGA学习实践之旅——前言及目录

    很早就有在博客中记录技术细节,分享一些自己体会的想法,拖着拖着也就到了现在。毕业至今已经半年有余,随着项目越来越深入,感觉可以慢慢进行总结工作了。趁着2024伊始,就先开个头吧,这篇博客暂时作为汇总篇,记录在这几个月以及之后从FPGA初学者到也算有一定

    2024年02月03日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包