verilog之按键消抖的理解
按键在按下时会产生抖动,释放时也会产生抖动,所以在设计键盘扫描程序时必须考虑按键的消抖,我们一般只考虑按下时的抖动,而放弃对释放时抖动的消抖。抖动时间一般为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之按键消抖的理解相关推荐
- Verilog中按键消抖检测的实现
Verilog按键消抖是FPGA学习时的一个入门教程,为避免眼高手低,还是再次分析与记录一下.此处着重介绍按键消抖的基本原理,对按键消抖与检测的关键技术进行分析,并进行功能仿真. 一.按键消抖基本原理 ...
- 用verilog编写按键消抖代码
本代码在按键按下和松开情况下均能消抖,消抖延时20ms(时钟频率为100MHz时). 代码如下 module key3_led2( //from system input input c ...
- Verilog功能模块 —— 按键消抖
一. 什么是按键消抖 按键消抖_百度百科 (baidu.com) 按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开.闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断 ...
- 【FPGA】实战之按键消抖
文章目录 一.按键消抖的原理 二.按键消抖的设计思路 三.代码部分 四.仿真验证 五.总结 一.按键消抖的原理 一般开发板上的按键都是机械按键,所以在按下的时候,会产生回弹的时刻,称为机械的弹性开关, ...
- 基于verilog按键消抖设计
关于键盘的基础知识,我就以下面的一点资料带过,因为这个实在是再基础不过的东西了.然后我引两篇我自己的博文,都是关于按键消抖的,代码也正是同目录下project里的.这两篇博文都是ednchina的博客 ...
- 【Verilog HDL 训练】第 09 天(按键消抖)
5月7日 按键防抖 1. 用verilog实现按键抖动消除电路,抖动小于15ms,输入时钟12MHz. 在编写Verilog代码之前,先分析下一些前提问题,首先是几个按键(1个,多个),我们以1个和三 ...
- Verilog实现独立按键消抖(状态机)
本文参考小梅哥的独立按键消抖视频 1,实验原理: 这里是黑金开发板教程中的图,可以看出,按键未按下时的状态是高电平,按下为低电平.下边是小梅哥画的图解. 因为是机械按键,按下时候有一个不稳定的抖动期, ...
- c语言实现按键的抖动与消除,【Verilog HDL 训练】第 09 天(按键消抖)
5月7日 按键防抖 1. 用verilog实现按键抖动消除电路,抖动小于15ms,输入时钟12MHz. 在编写Verilog代码之前,先分析下一些前提问题,首先是几个按键(1个,多个),我们以1个和三 ...
- FPGA学习-Verilog实现独立按键消抖
文章目录 前言 一.独立按键消抖原理 二.按键消抖程序实现(Verilog) 1.按键触发判断 2.计数器模块实现 3.按键状态更新 4.按键控制led亮灭 三.仿真测试文件编写 四.编译结果 前言 ...
最新文章
- el-button在表格操作行可以写成type=text'形式,这样有链接手型。
- 03SpringMVC,Spring,Hibernate整合(Date时间转换)
- 【clickhouse】clickhouse 表引擎 之 VersionedCollapsingMergeTree
- Java的守护线程Daemon
- 在NT系列操作系统里让自己“消失”
- Linux Shell编程(3)——运行shell脚本
- 电话机器人源码,语音电话机器人
- c语言作业 求梯形面积,梯形面积计算c语言
- 用python制作上海疫情评论词云图-自定义形状
- 北京邮电大学计算机学院考研调剂,北京邮电大学计算机学院2020考研调剂缺额信息...
- git clean使用方法
- 香橙派 Orangepi Zero2 外壳天线改装
- 计算机专业考研的好学校排名2015,计算机类专业考研最好的学校排名
- 2018.8.10Yukimai模拟Day1
- uva live 4043 km
- TR069协议向导——一个帮助你了解TR069协议的简明教程(一)
- android 如何分析卡顿问题
- 手把手教你制作docSet文档(用于Dash或zeal)
- Java开源技术分享交流群
- 计算机专业的学生简历范文,计算机专业学生的简历范文精选
热门文章
- matlab中memory模块初始值,Matlab的memory模块消除代数环
- java 实现打印条形码_激光打印机与条码打印机打印不干胶标签哪个好?
- 根据需求进行批量新增
- python 中的堆栈 用列表实现
- dp动态规划_最长上升子序列问题
- 多项式之和 Sn=a+aa+aaa+aaaa+.....+aaa.....aa(n个a)
- [PyTorch] reverse the normalization
- c#连接mysql数据库,增删查改命令执行
- AD16修改规则加宽电源线与地线
- ubuntu18.04 本地源制作