基于FPGA的按键消抖

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

基于FPGA的按键消抖

一、按键消抖原理

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

按键原理图:

基于FPGA的按键消抖,fpga开发

按键默认为低电平有效,高电平无效

1.按键消抖目的:消除按键抖动对我们程序的影响。

2.按键消抖解决方案1:延迟采样。延迟一定时间取样,去除没有抖动时的稳定值

基于FPGA的按键消抖,fpga开发

3.按键消抖解决方案2:信号变化频率平稳后并且持续20ms则采样。

基于FPGA的按键消抖,fpga开发

这里我们采用第二种方式,第二种方式相对于第一种方式更加稳定,效果也会更好。

二、按键消抖代码

key_debounce.v

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : 辣子鸡味的橘子,331197689@qq.com
// File   : key_debounce.v
// Create : 2023-07-14 10:36:44
// Revise : 2023-07-14 10:36:44
// Editor : sublime text4, tab size (4)
// -----------------------------------------------------------------------------
module key_debounce(
    input wire clk,
    input wire rst_n,
    input wire[3:0] key_in,//四个按键信号输入

    output reg[3:0] key_out//四个按键信号消抖输出
);

parameter TIME_20MS = 1000_000;
reg[19:0] cnt;//20ms计数器
wire add_cnt;//计数开始
wire ent_cnt;//计数终止
wire nedge;//下降沿检测

reg[3:0] key_in_r0;//同步key_in输入信号
reg[3:0] key_in_r1;//延迟一个周期
reg[3:0] key_in_r2;//延迟两个周期

reg flag;//消抖开始标志信号

//计数器模块,当addent满足时开始计数,检测到下降沿重新计数,end_ent满足时停止计数,消抖完成
always @(posedge clk or negedge rst_n) begin
    if(~rst_n) begin
       cnt<=20'd0;
    end
    else if(add_cnt)begin
        if(ent_cnt)begin
            cnt<=20'd0;
        end
        else if(nedge)begin
            cnt<=20'd0;
        end
        else begin
            cnt<=cnt+1;
        end
    end
    else begin
        cnt<=cnt;
    end
end

assign add_cnt = flag;//计数开始条件
assign end_cnt = (cnt == TIME_20MS - 1)&&add_cnt;//终止结束条件,当满足计时到20ms,且满足计时条件时成立

//信号延时模块
always @(posedge clk or negedge rst_n) begin
    if(~rst_n) begin
        key_in_r0<=4'b1111;
        key_in_r1<=4'b1111;
        key_in_r2<=4'b1111;
    end
    else begin
        key_in_r0<=key_in;
        key_in_r1<=key_in_r0;
        key_in_r2<=key_in_r1;
    end
end

//检测下降沿,当任意一个按键出现下降沿都会被检测到
assign nedge = (~key_in_r1[0]&key_in_r2[0])||(~key_in_r1[1]&key_in_r2[1])||(~key_in_r1[2]&key_in_r2[2])||(~key_in_r1[3]&key_in_r2[3]);

//消抖开始模块
always @(posedge clk or negedge rst_n) begin
    if(~rst_n) begin
       flag<=1'b0;
    end
    else if(nedge)begin//当出现下降沿开始消抖
        flag<=1'b1;
    end
    else if(end_cnt)begin//当end_cnt满足时停止消抖
        flag<=1'b0;
    end
    else begin
        flag<=flag;
    end
end

//输出信号赋值模块,当消抖完毕标志按键按下,出现一个脉冲信号表示按键按下
always @(posedge clk or negedge rst_n) begin
    if(~rst_n) begin
        key_out<=4'b1111;//默认为高电平
    end
    else if(end_cnt)begin
        key_out<=key_in_r1;//稳定信号赋值
    end
    else begin
       key_out<=4'b1111;//其他时候默认为高电平
    end
end

endmodule

三、仿真代码编写

`timescale 1ns/1ns
module key_debounce_tb();
reg clk;
reg rst_n;
reg[3:0] key;

wire[3:0] key_r;
parameter SYS_CLK = 20;
parameter TIME = 100;
always #(SYS_CLK/2) clk = ~clk;
initial begin
	clk=1'b0;
	rst_n=1'b0;
	#(2*SYS_CLK);
	rst_n=1'b1;
	key = 4'b1111;
	#(2*SYS_CLK+10);
    repeat (39) begin
   		key[0] = ~key[0];
   		#(2*SYS_CLK);
	end
	key[0] = 1'b0;
	#(1100*SYS_CLK);
	$stop;
end
key_debounce #(
		.TIME_20MS(TIME)
	) inst_key_debounce (
		.clk     (clk),
		.rst_n   (rst_n),
		.key_in  (key),
		.key_out (key_r)
	);

endmodule

仿真时序图:

基于FPGA的按键消抖,fpga开发

四:总结

其实别小看这个按键消抖,里面的细节有很多,自己之前尝试书写但是却没能达到想要的效果。特别是如何重新计数哪里确实困扰住了我,后面重新学习后完成了自己的效果,希望对你有所帮助。文章来源地址https://www.toymoban.com/news/detail-598270.html

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

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

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

相关文章

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

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

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

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

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

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

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

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

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

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

    2024年02月12日
    浏览(45)
  • 基于FPGA的 矩阵键盘按键识别 【原理+源码】

    目录 引言 原理阐述 实现方法 源码分享 板级调试演示 最近了解了矩阵键盘扫描的原理,动手实现了一下,在这里做一个简单的总结。 矩阵键盘典型电路: FPGA的应用电路: 其中,行信号为FPGA输入信号,列信号为FPGA输出信号。  原理解释:  起始状态,FPGA的列信号输出 全

    2024年01月22日
    浏览(39)
  • FPGA按钮消抖实验

    1、概述         按键的消抖,是指按键在闭合或松开的瞬间伴随着一连串的抖动,这样的抖动将直接影响设计系统的稳定性,降低响应灵敏度。因此,必须对抖动进行处理,即消除抖动的影响。实际工程中,有很多消抖方案,如 RS 触发器消抖,电容充放电消抖,软件消抖

    2024年01月19日
    浏览(47)
  • 基于FPGA的四位数码管显示按键计数器设计(verilog编程)

    软件:Vivado 2022.2 硬件:BASYS 3 设计描述:通过开发板上的四个按键,按下一次记数加一,分别由四个数码管从左到右分别显示四个按键记数情况。 例: 1.初始值为0000,意为无记数 2.当按下第一个按键,记数加一,数码管显示1000 3.再次按下一第一个按键,记数加一,数码管显

    2024年02月08日
    浏览(49)
  • STM32:基于HAL 库的外部中断按键以及消抖

    第一次写博客,有错误与问题欢迎指正。 这部分直接上代码,假设PB5为输入端且上拉,PB11为输出。 在CubeMx中配置完引脚(下降沿触发)并在NVIC中开启外部中断后,我们注意到,上一个程序有5个要素(我写了注释的5个): 中断回调函数HAL_GPIO_EXTI_Callback是一个虚函数,我们

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

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

    2024年02月12日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包