按键在按下时会产生抖动,释放时也会产生抖动,所以在设计键盘扫描程序时必须考虑按键的消抖,我们一般只考虑按下时的抖动,而放弃对释放时抖动的消抖。抖动时间一般为20ms左右。按下的最终结果是低电平。

按键去抖思路是:检测到按下时延时20ms,再检测,如果状态仍为按下,则确认是按下的;如果状态为弹起的,则确认是干扰,无按键按下。

假如rst_in 为一个按键,直接连接至FPGA里面的复位引脚作为全局复位,所以按键消抖的原理为:当rst_in按键按下时可能会出现抖动,需要停20ms之后再去检测这个按键是否按下(FPGA里面的这个引脚的电平是否改变),这样就达到了按键消抖的目的

如下图所示:

有一个概念要理一下,按键按下时会有抖动,也就是说我们其实只按一次,但是实际产生的“按下”却是许多次的,这些许多次集中在这20ms里。我们按的只是一次,而实际却产生了许多次,那么就必须滤除其他的次数。为了得到真正的“按下”,通过延时20ms,把其他的“按下”(也就是抖动)给滤除了。然后再次判断是否有按下,因为有的时候干扰很大。

而在FPGA中,基于下面的程序,理解如下:在这个程序里检测按键是否按下的方法是脉冲边沿检法。而在单片机里是判断是否为低电平的方法(那么在FPGA中可不可以也用这个方法呢?)第一次检测到后,启动20ms计数器,时间到后再检测。这里的检测方法跟脉冲边沿检测法有异曲同工之处,FPGA过20ms检测按键是否按下,存储检测到的值,并且按位取反与前一个20ms检测的值相与,得到一个值,如果为1,则判断按键按下,否则则无按下。所以跟单片机按键扫描的原理是一样的,不同的是检测方法不一样。

 图2 FPGA按键的理解示意图

// Module name: key_test.v
// 描述: 检测开发板上的四个按键 KEY1~KEY4, 当检测到按键按下时,相应的 LED 灯翻转
//======================================================
`timescale 1ns / 1ps
module key_test (
clk, // 开发板上输入时钟: 50Mhz
key_in, // 输入按键信号(Reset, KEY1~KEY3)
led_out // 输出 LED 灯,用于控制开发板上四个 LED(LED1~LED4)
);
//========================================================
// PORT declarations
//========================================================
input clk;
input [3:0] key_in;
output [3:0] led_out;
wire rst_n=1'b1;
//寄存器定义
reg [19:0] count;
reg [3:0] key_scan; //按键扫描值 KEY
//==============================================
// 采样按键值,20ms 扫描一次,采样频率小于按键毛刺频率,相当于滤除掉了高频毛刺信号。
//==============================================
黑金 FPGA 原创教程
黑金动力社区 84 / 426
always @(posedge clk or negedge rst_n) //检测时钟的上升沿和复位的下降沿
begin
if(!rst_n) //复位信号低有效
count <= 20'd0; //计数器清 0
else
begin
if(count ==20'd999_999) //20ms 扫描一次按键,20ms 计数(50M/50-1=999_999)
begin
count <= 20'b0; //计数器计到 20ms,计数器清零
key_scan <= key_in; //采样按键输入电平
end
else
count <= count + 20'b1; //计数器加 1
end
end
//====================================================
// 按键信号锁存一个时钟节拍
//====================================================
reg [3:0] key_scan_r;
always @(posedge clk)
key_scan_r <= key_scan;
wire [3:0] flag_key = key_scan_r[3:0] & (~key_scan[3:0]); //当检测到按键有下降沿变化时,代表该按键被按下,按键有效
//=====================================================
// LED 灯控制,按键按下时,相关的 LED 输出翻转
//=====================================================
reg [3:0] temp_led;
always @ (posedge clk or negedge rst_n) //检测时钟的上升沿和复位的下降沿
begin
if (!rst_n) //复位信号低有效
temp_led <= 4'b1111; //LED 灯控制信号输出为低, LED 灯全灭
else
begin
if ( flag_key[0] ) temp_led[0] <= ~temp_led[0]; //按键 KEY1 值变化时,LED1 将做亮灭翻转
if ( flag_key[1] ) temp_led[1] <= ~temp_led[1]; //按键 KEY2 值变化时,LED2 将做亮灭翻转
if ( flag_key[2] ) temp_led[2] <= ~temp_led[2]; //按键 KEY3 值变化时,LED3 将做亮灭翻转
if ( flag_key[3] ) temp_led[3] <= ~temp_led[3]; //按键 KEY4 值变化时,LED4 将做亮灭翻转
end
end
assign led_out[0] = temp_led[0];
assign led_out[1] = temp_led[1];
assign led_out[2] = temp_led[2];
assign led_out[3] = temp_led[3];
endmodule

每 20ms 程序会检查一下按键的状态, 如果这次检测为低电平而且上次检测为高电平的话,说明有按键按下,相对应的 LED 灯反转。 一般按键按下时的按键抖动为低于 20ms 的脉冲信号,这些高频脉冲信号会被滤除。提高了按 键的可靠性。

verilog之按键消抖的理解相关推荐

  1. Verilog中按键消抖检测的实现

    Verilog按键消抖是FPGA学习时的一个入门教程,为避免眼高手低,还是再次分析与记录一下.此处着重介绍按键消抖的基本原理,对按键消抖与检测的关键技术进行分析,并进行功能仿真. 一.按键消抖基本原理 ...

  2. 用verilog编写按键消抖代码

    本代码在按键按下和松开情况下均能消抖,消抖延时20ms(时钟频率为100MHz时). 代码如下 module key3_led2( //from system input     input    c ...

  3. Verilog功能模块 —— 按键消抖

    一. 什么是按键消抖 按键消抖_百度百科 (baidu.com) 按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开.闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断 ...

  4. 【FPGA】实战之按键消抖

    文章目录 一.按键消抖的原理 二.按键消抖的设计思路 三.代码部分 四.仿真验证 五.总结 一.按键消抖的原理 一般开发板上的按键都是机械按键,所以在按下的时候,会产生回弹的时刻,称为机械的弹性开关, ...

  5. 基于verilog按键消抖设计

    关于键盘的基础知识,我就以下面的一点资料带过,因为这个实在是再基础不过的东西了.然后我引两篇我自己的博文,都是关于按键消抖的,代码也正是同目录下project里的.这两篇博文都是ednchina的博客 ...

  6. 【Verilog HDL 训练】第 09 天(按键消抖)

    5月7日 按键防抖 1. 用verilog实现按键抖动消除电路,抖动小于15ms,输入时钟12MHz. 在编写Verilog代码之前,先分析下一些前提问题,首先是几个按键(1个,多个),我们以1个和三 ...

  7. Verilog实现独立按键消抖(状态机)

    本文参考小梅哥的独立按键消抖视频 1,实验原理: 这里是黑金开发板教程中的图,可以看出,按键未按下时的状态是高电平,按下为低电平.下边是小梅哥画的图解. 因为是机械按键,按下时候有一个不稳定的抖动期, ...

  8. c语言实现按键的抖动与消除,【Verilog HDL 训练】第 09 天(按键消抖)

    5月7日 按键防抖 1. 用verilog实现按键抖动消除电路,抖动小于15ms,输入时钟12MHz. 在编写Verilog代码之前,先分析下一些前提问题,首先是几个按键(1个,多个),我们以1个和三 ...

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

    文章目录 前言 一.独立按键消抖原理 二.按键消抖程序实现(Verilog) 1.按键触发判断 2.计数器模块实现 3.按键状态更新 4.按键控制led亮灭 三.仿真测试文件编写 四.编译结果 前言 ...

最新文章

  1. el-button在表格操作行可以写成type=text'形式,这样有链接手型。
  2. 03SpringMVC,Spring,Hibernate整合(Date时间转换)
  3. 【clickhouse】clickhouse 表引擎 之 VersionedCollapsingMergeTree
  4. Java的守护线程Daemon
  5. 在NT系列操作系统里让自己“消失”
  6. Linux Shell编程(3)——运行shell脚本
  7. 电话机器人源码,语音电话机器人
  8. c语言作业 求梯形面积,梯形面积计算c语言
  9. 用python制作上海疫情评论词云图-自定义形状
  10. 北京邮电大学计算机学院考研调剂,北京邮电大学计算机学院2020考研调剂缺额信息...
  11. git clean使用方法
  12. 香橙派 Orangepi Zero2 外壳天线改装
  13. 计算机专业考研的好学校排名2015,计算机类专业考研最好的学校排名
  14. 2018.8.10Yukimai模拟Day1
  15. uva live 4043 km
  16. TR069协议向导——一个帮助你了解TR069协议的简明教程(一)
  17. android 如何分析卡顿问题
  18. 手把手教你制作docSet文档(用于Dash或zeal)
  19. Java开源技术分享交流群
  20. 计算机专业的学生简历范文,计算机专业学生的简历范文精选

热门文章

  1. matlab中memory模块初始值,Matlab的memory模块消除代数环
  2. java 实现打印条形码_激光打印机与条码打印机打印不干胶标签哪个好?
  3. 根据需求进行批量新增
  4. python 中的堆栈 用列表实现
  5. dp动态规划_最长上升子序列问题
  6. 多项式之和 Sn=a+aa+aaa+aaaa+.....+aaa.....aa(n个a)
  7. [PyTorch] reverse the normalization
  8. c#连接mysql数据库,增删查改命令执行
  9. AD16修改规则加宽电源线与地线
  10. ubuntu18.04 本地源制作