FPGA按键消抖

这篇具有很好参考价值的文章主要介绍了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 as clock or reset inputs in a circuit.

这里介绍到了按键抖动(Button Bouncing)和按键消抖(Button Debouncing)。

按键消抖

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

上图描述的是硬件的按键消抖。可见,消抖后,一次按键,只产生了一次电平变化。

这对我们接下来利用按键意义重大。

物理消抖

简单介绍下实现上图的消抖。

电容滤波

将电容并联在按键的两端,利用电容的放电的延时特性。将产生抖动的电平通过电容吸收掉。从而达到消抖的作用。

RS触发器

利用RS触发器来吸收按键的抖动。一旦有键按下,触发器立即翻转,触电的抖动便不会再对输出产生影响。

程序消抖

按键在FPGA中必不可少,我们需要利用按键对一些变量进行累加或累减。比如频率、分数等。

未消抖

在一开始的学习中,我们可能只用到了开关(switch),编写开关控制的程序类似于将开关当作一个布尔(Boolean)变量。

但是按键与开关不同,以下面这段代码为例,期望作用是 按键按下后,LED灯状态改变

module Test(
    input       sys_clk,
    input       rst_n,
    input       key,
    output  reg led
);
    always@(posedge sys_clk or negedge rst_n)
    begin
        if(rst_n == 1'b0) 
            led <= 1'b0;
        else if(key == 1'b0)
            led <= ~led;
        else
            led <= led;
    end
endmodule

然而,上板测试发现,LED状态灯一直处于不亮的状态。

假设,我们的时钟频率是50MHz,那么它的周期就是20ns

那么,在你按按钮的全过程中,按下的状态持续了多长时间呢?

显然,远大于20ns,所以LED会多次取反。所以这种简单粗暴的方法是不适合按键的。

消抖

我们刚刚的问题是,短时间内重复检测,从而多次执行了按键后的行为。

可以想到,给这个按键定个时:当有按键按下,计数器不断自增,若因为抖动,则计数器会清空,重新计数,当不抖动的时候,就会计满,此时才会判定为按键按下。

代码

// 定时器消除抖动
module key_filter(
    input	wire            sys_clk,          // 50M时钟
    input   wire         	sys_rst_n,        // 复位信号,低电平有效
    input   wire      		key,              // 按键输入

    output 	reg       		key_flag,         // 按键信号有效信号
	output 	reg       		key_value         // 消抖后的按键信号  
   );
 
    reg [31:0] delay_cnt;	// 32位定时器
	reg        key_reg; 

always @(posedge sys_clk or negedge sys_rst_n) begin 
    if (!sys_rst_n) begin 
        key_reg   <= 1'b1;
        delay_cnt <= 32'd0;
    end
    else begin
        key_reg <= key;
        if(key_reg != key)             // 检测到按键状态发生变化(按下 或 释放)
            delay_cnt <= 32'd1000000;  // 计数器装载初始值(计数时间为20ms)
        else if(key_reg == key) begin  // 按键状态稳定时,计数器递减,开始20ms倒计时
            if(delay_cnt > 32'd0) 	   // 不稳定时,重新计时
                     delay_cnt <= delay_cnt - 1'b1;
                 else
                     delay_cnt <= delay_cnt;
             end           
    end   
end

always @(posedge sys_clk or negedge sys_rst_n) begin 
    if (!sys_rst_n) begin 			   // 复位
        key_flag  <= 1'b0;			   // 无效
        key_value <= 1'b1;             // 高电平为未按下
    end
    else begin
        if(delay_cnt == 32'd1) begin   // 按键稳定状态维持了20ms
            key_flag  <= 1'b1;         // 此时消抖过程结束,信号有效
            key_value <= key;          // 保存此时按键信号
        end							   
        else begin
            key_flag  <= 1'b0;
            key_value <= key_value; 
        end  
    end   
end
    
endmodule 

如此,我们再重新写下刚刚的未消抖程序。

module Test(
      input   	    	sys_clk,     // 系统时钟
      input   	    	rst_n,       // 复位信号,低电平有效
      input       	    key,	     // 按键信号       
	  output    reg     led			 // LED灯
  );
  
wire key_value;
wire key_flag;
// 例化
key_filter	key_filter_inst(
    .sys_clk		(sys_clk),     // 50M时钟
    .sys_rst_n		(sys_rst_n),   // 复位信号,低电平有效
    .key            (key),         // 按键输入)

    .key_flag		(key_flag),    // 按键信号有效信号
    .key_value      (key_value)    // 按键消抖后的数据  
);
always @ (posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)	
	begin
		led <= 1'b0;
	end
    else if(key_flag && (~key_value))  // 按键是否有效按下
	begin						
		 led  <= ~led;
	end
    else
    begin
        led <= led;
    end
end
endmodule 

成功,按键可以控制LED灯亮与熄灭。仿真略。

这是简单的计时消抖,读者有兴趣可阅读学习状态机的方法。

参考文献

[1] 按键的硬件消抖电路原理详解

[2] FPGA要按键实现四个数码管加减计数怎么搞?

[3] FPGA学习—按键控制

[4] DE2-70 User Manual文章来源地址https://www.toymoban.com/news/detail-611698.html

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

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

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

相关文章

  • 【FPGA入门】第五篇、按键消抖

    【FPGA入门】第五篇、按键消抖

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

    2024年02月11日
    浏览(6)
  • FPGA学习-Verilog实现独立按键消抖

    FPGA学习-Verilog实现独立按键消抖

    利用verilog语言实现独立按键消抖,文章首先对按键抖动产生的原因、消抖原理进行简要解释;之后详细阐述各模块verilog语言实现方法;最后利用四个独立按键控制led亮灭,在vivado下进行源码设计与仿真。(完成程序代码附在文章结尾) 按键一般是机械弹性开关,由于机械触

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

    FPGA拾忆_(10):按键控制蜂鸣器_边沿检测_按键消抖

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

    2024年04月10日
    浏览(7)
  • FPGA入门学习笔记(十三)Vivado实现按键消抖

    FPGA入门学习笔记(十三)Vivado实现按键消抖

    四种状态 按键未按下:静止状态呈高电平; 按下过程中:抖动状态呈高低电平; 按键已按下:静止状态呈低电平; 释放过程中:抖动状态呈高低电平。 按键消抖思路 :区别于单片机使用20ms延时判断电平正负,FPGA中采用电平保持计时,若时间长度超过20ms则认为发生了一次

    2024年02月04日
    浏览(15)
  • FPGA学习——按键控制LED流水灯(附源码 无按键消抖版本)

    FPGA学习——按键控制LED流水灯(附源码 无按键消抖版本)

    在博主的cyclone4开发板上一共有4个按键,本次实验的目的是为了实现每按下一次按键,都会使开发板上的4个LED灯切换一次状态,博主一共设计了四种状态,分别是: 按键 状态 按键1按下 自右向左的流水灯 按键2按下 自左向右的流水灯 按键3按下 四灯常亮 按键4按下 四灯闪烁

    2024年02月06日
    浏览(10)
  • 【FPGA零基础学习之旅#10】按键消抖模块设计与验证(一段式状态机实现)

    【FPGA零基础学习之旅#10】按键消抖模块设计与验证(一段式状态机实现)

    🎉欢迎来到FPGA专栏~按键消抖模块设计与验证 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 🥝 模块设计: 🥝 按键消

    2024年02月12日
    浏览(10)
  • Linux输入设备应用编程(键盘,按键,触摸屏,鼠标)

    Linux输入设备应用编程(键盘,按键,触摸屏,鼠标)

    目录 一 输入设备编程介绍 1.1 什么是输入设备呢?  1.2 什么是输入设备的应用编程?   1.3 input子系统 1.4  数据读取流程 1.5 应用程序如何解析数据 1.5.1 按键类事件:  1.5.2 相对位移事件  1.5.3 绝对位移事件  二 读取 struct input_event数据   本章学习Linux输入设备的应用编程

    2024年02月05日
    浏览(12)
  • 单片机入门资料,按键消抖方式,按键怎么消抖

    单片机入门资料,按键消抖方式,按键怎么消抖

     1.什么是按键消我们先来看一下按键按下去的波形图   1.按键消抖原理 我们可以看到当按键按下的那一时刻和松开的时候有类似于锯齿的形状那就是按键抖动,这个抖动不是我们人为能控制得了的,所以我们只能对进行硬件消抖或者进行软件消抖.          上图中我们可以

    2024年02月08日
    浏览(5)
  • Arduino程序设计(四)按键消抖+按键计数

    Arduino程序设计(四)按键消抖+按键计数

    本文主要介绍两种按键控制LED实验: 第一种是采用软件消抖的方法检测按键按下的效果; 第二种是根据按键按下次数,四个LED灯呈现不同的流水灯效果。 按键在按下时,由于机械和物理特定的原因,经常会产生一些开关变换,而这些变换会让程序误认为是短时间内进行了多

    2024年02月10日
    浏览(9)
  • ZYNQ——按键消抖实验

    ZYNQ——按键消抖实验

    按键作为基本的人机输入接口,在很多电子设计中都是比较常见的,但是由于其机械特性,在按键按下或者松开的时候,按键的输入值是有抖动的。按键的抖动是其固有特性,因此无论按键按下或松开的多么平稳,按键的抖动也是难以消除的。本文通过FPGA计数(计时)来达到

    2024年02月06日
    浏览(8)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包