Verilog按键消抖的理解

发布者:Huixin8888最新更新时间:2012-09-14 来源: 51hei关键字:Verilog  按键消抖  延时 手机看文章 扫描二维码
随时随地手机看文章

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

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

点击浏览下一页
 图1  按键抖动特性

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

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

其中key_an寄存器的功能是检测第一次的“按下”,是cnt的启动标志位。通过也能滤除干扰信号。

led_ctrl是确实有按键按下的信号,维持一个时钟周期。

特权同学的Verilog键盘扫描程序

//说明:当三个独立按键的某一个被按下后,相应的LED被点亮;

//            再次按下后,LED熄灭,按键控制LED亮灭
 

module sw_debounce(

                 clk,rst_n,

                     sw1_n,sw2_n,sw3_n,

                  led_d1,led_d2,led_d3

                 );

 

input   clk; //主时钟信号,50MHz

input   rst_n;     //复位信号,低有效

input   sw1_n,sw2_n,sw3_n;      //三个独立按键,低表示按下

output  led_d1,led_d2,led_d3;     //发光二极管,分别由按键控制

 

//----------------------------------

reg[2:0] key_rst;  

 

always @(posedge clk  or negedge rst_n)

    if (!rst_n) key_rst <= 3'b111;

    else key_rst <= {sw3_n,sw2_n,sw1_n};

 

reg[2:0] key_rst_r;       //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中

 

always @ ( posedge clk  or negedge rst_n )

    if (!rst_n) key_rst_r <= 3'b111;

    else key_rst_r <= key_rst;

   

//当寄存器key_rst由1变为0时,led_an的值变为高,维持一个时钟周期 

wire[2:0] key_an = key_rst_r & ( ~key_rst); //检测到按下的第一次(cnt的启动信号)

 

//-------------------------------------------

reg[19:0]  cnt;    //计数寄存器

 

always @ (posedge clk  or negedge rst_n)

    if (!rst_n) cnt <= 20'd0;      //异步复位

       else if(key_an) cnt <=20'd0;

    else cnt <= cnt + 1'b1;

  

reg[2:0] low_sw;

 

always @(posedge clk  or negedge rst_n)

    if (!rst_n) low_sw <= 3'b111;

    else if (cnt == 20'hfffff)   
 //满20ms,将按键值锁存到寄存器low_sw中      cnt == 20'hfffff

      low_sw <= {sw3_n,sw2_n,sw1_n};

      

//-----------------------------------------------

reg  [2:0] low_sw_r;       //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中

 

always @ ( posedge clk  or negedge rst_n )

    if (!rst_n) low_sw_r <= 3'b111;

    else low_sw_r <= low_sw;

   

//当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期 

wire[2:0] led_ctrl = low_sw_r[2:0] & ( ~low_sw[2:0]);

 

reg d1;

reg d2;

reg d3;

  

always @ (posedge clk or negedge rst_n)

    if (!rst_n) begin

        d1 <= 1'b0;

        d2 <= 1'b0;

        d3 <= 1'b0;

      end

    else begin          //某个按键值变化时,LED将做亮灭翻转

        if ( led_ctrl[0] ) d1 <= ~d1;    

        if ( led_ctrl[1] ) d2 <= ~d2;

        if ( led_ctrl[2] ) d3 <= ~d3;

      end

 

assign led_d3 = d1 ? 1'b1 : 1'b0;           //LED翻转输出

assign led_d2 = d2 ? 1'b1 : 1'b0;

assign led_d1 = d3 ? 1'b1 : 1'b0;

  

endmodule
关键字:Verilog  按键消抖  延时 引用地址:Verilog按键消抖的理解

上一篇:Cortex M3S811学习笔记-TIMER32
下一篇:c语言模块化编程的方法

推荐阅读最新更新时间:2024-03-16 13:08

延时继电器原理
时间继电器是一种电磁原理或机械原理实现延时控制的控制电器。它的种类,有电磁式延时继电器;电动式时间继电器;热延时继电器;混合式延时继电器;固体时间继电器。 时间继电器可分为通电延时型和断电延时型两种类型。 1、电磁继电器的工作原理和特性 电磁式继电器由铁芯、线圈、衔铁、触点簧片等组成的。只要在线圈两端加上的电压,线圈中就会流过的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回的,使动触点与的静触点(常闭触点)吸合。吸合、释放,从而达到了在电路中的导通、切断的目的。继电器的“常开
[工业控制]
<font color='red'>延时</font>继电器原理
CADENCE SYSTEMVERILOG客户采用率提高三倍并成为主流开发技术
该公司称已有超过150家客户使用该语言,构建跨越设计、断言和测试环境的开发结构 加州圣荷塞市, 2007 年 1 月 9 日 —— 全球电子设计创新领先企业 Cadence 设计系统公司( NASDAQ: CDNS )今天宣布,其基于 SystemVerilog 的验证解决方案在去年迅猛发展,用该语言进行试验的客户从大约 40 家增加到了 150 家,他们或者将该语言应用于创建功能原型项目,或者应用到主流产品开发。该公司将 SystemVerilog 的加速发展归结为多种原因,包括 SystemVerilog 语言支持的大幅提升、拓展的多语言功能、 Cadence Incisive Plan-
[焦点新闻]
延时实现PIC单片机LED流水灯
用延时实现P IC 单片机 LED 流水灯 ;**************************************************** __CONFIG 3F39H;设置配置位中振荡方式为XT,其它全部禁止或关闭 ;**************************************************** status equ 3h ;定义状态寄存器地址 portc equ 7h ;定义端口C的数据寄存器地址 trisc equ 87h ;定义端口C的方向控制寄存器地址 flag equ 25h ;定义一个控制左移/右移的标志寄存器 ;*****
[单片机]
基于Nordic的2.4G无线鼠标支持超低延时PC游戏体验
Glorious Model O 鼠标使用nRF52840和nRF52820作为鼠标和PC之间的链接技术,获得了极高的游戏性能。 挪威奥斯陆 – 2021年10月29日 –Nordic Semiconductor宣布总部位于美国德克萨斯州达拉斯的游戏科技企业Glorious选择了 Nordic的nRF52840蓝牙 5.2/低功耗蓝牙 (Bluetooth® Low Energy (Bluetooth LE))先进多协议系统级芯片(SoC)和nRF52820 SoC来实现“Model O Wireless”鼠标和用户 PC 之间的低延迟数据传输,用于需要可靠和快速响应的游戏应用。Glorious声称Model O Wirele
[手机便携]
基于Nordic的2.4G无线鼠标支持超低<font color='red'>延时</font>PC游戏体验
8051单片机实战分析(以STC89C52RC为例) | 02 - LED延时约5s闪烁
代码修改如下: #include reg52.h //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; sbit led=P2^2; //将单片机的P2.2端口定义为led /******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,i=1时,大约延时10us *************************
[单片机]
STM32F10x 使用SysTick的延时函数
整个工程下载: http://www.rayfile.com/files/66369fee-d80c-11df-ac1d-0015c55db73d/ 关键代码: UART.h: /******** 串口收发 环形缓冲区实现 ******** * 版本.........: 1.0 * 作者.........: 陈利栋 * 目标.........: ATmega128 * 文件名.......: UART.h * 编译器.......: IAR for AVR V5.5 * 创建时间.....: 2010.10.15 * 最后修改.....: 2010.10.15 ***************************
[单片机]
基于FPGA的数据采集系统设计
0 引言 在电气测控系统中,常常需要采集各种模拟量信号、数字量信号,并对它们进行相应的处理。一般情况下,测控系统中用普通MCU(如51、196等单片机或控制型DSP)就可以完成系统任务,但当系统中要采集的信号量特别多时(特别是各种信号量、状态量),仅仅靠用普通MCU的资源就往往难以完成任务。本文所提出的一种基于FPGA技术的模拟量、数字量采集与处理系统,利用FPGA的I/O端口多,且可以自由编程支配、定义其功能的特点,能很好地解决采集的信号路数多的问题。 1 系统组成 本系统中的外围电路设计相对简单、可靠,且鉴于FPGA自身的特点,系统具有较好的扩展性,在监测和控制系统中也具有一定的通用性。系统主要包括:FPGA芯片区、多
[测试测量]
基于FPGA的数据采集系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved