找回密码
 注册
关于网站域名变更的通知
查看: 350|回复: 2
打印 上一主题 下一主题

基于FPGA的按键弹跳消除模块的研究与应用

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-6-12 19:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

按键在数字电路设计中经常用到。按键的弹跳现象是数字系统设计中存在的客观问题。按键是机械触点,当接触点断开或闭合时会产生抖动。为使每一次按键只做一次响应,就必须去除抖动。本文对按键的抖动信号进行了分析,并通过计数器的方式完成了消除抖动电路模块的设计。把该模块应用到按键控制LCD显示的系统中,并在Memec代理的Virtex-4 MB系统实验板上实现了该系统。消抖电路的效果良好,按键控制LCD显示结果正常。

' K& R1 [8 X) Q
: a( g. F, E) X6 ~1 A. ]3 `

  按键开关电子设备人机交互的主要器件之一。按键大多是机械式开关结构,由于机械式开关的核心部件为弹性金属簧片,因而在开关切换的瞬间会在接触点出现来回弹跳的现象。对于灵敏度比较高的电路,这种弹跳现象引起的信号抖动会造成误动作而影响到系统的正确性。因此,我们需要设计按键弹跳消除电路来去除抖动.。


  G( ~! A8 K/ ]& [

1.弹跳消除电路的原理和功能

$ L$ o8 B" m4 ]$ _

  按键开关的典型连线分为低电平有效和高电平有效,本文的是低电平有效。

0 T8 U1 r- r3 k9 q' A; O& T# V! e9 [

  机械开关的抖动存在三种情况:按下时有抖动,松开时也有抖动;按下时有抖动,松开时无抖动;按下时无抖动,松开时有抖动。机械开关的抖动波形、抖动次数、抖动时间都是随机的,并不是每次都会产生抖动。


5 F4 E0 p$ v' R' C# {! m; |

不同开关的最长抖动时间也不同。抖动时间的长短和机械开关特性有关,一般为5ms到10ms。但是,某些开关的抖动时间长达20ms,甚至更长。所以,在具体设计中要具体分析,根据实际情况来调整设计。

8 F% j& T+ u: X7 B$ n

  弹跳现象以及弹跳消除如图1 所示,虽然只是按下按键一次后放掉,结果在按键信号稳定先后竟出现了多个段脉冲,如果将这样的信号直接送到计数器之类的时序电路,结果将可能发生计数超过一次以上的误动作,从而误以为键盘按了多次。因此,必须加上弹跳消除电路,除去短脉冲,避免误操作的发生。


8 o- w3 x" _- y/ I$ ]1 q
5 y* Q+ Y: b' v; `& G4 o$ }

1 h5 B+ e! o+ `' t

2.按键弹跳消除模块的实现


1 E" e6 {3 K3 K" q  R7 @7 e: D: E1 l

  为了使按键弹跳消除模块的更加简洁,并且移植性好,在此用计数器的方式实现消除按键抖动的功能。

; \( G+ F1 C6 ~2 [- k: x

2.1 计数器模值的计算

/ |4 h0 O3 P& y- Q) P$ U

  计数器模值的确定是按键弹跳消除效果的关键问题,如果值过大,即采样时间过长,就会漏掉正确的信号;如果值过小,采样时间过短,则会将毛刺误认为是输入信号。

1 Z4 g2 ~  [$ i  x* f3 Y

  计数器的模值n根据抖动信号的脉冲宽度和采样信号clk的周期大小决定。根据一般人按键的速度小于10Hz(每秒小于10次),所以按键时间大于100ms,按占空比50%计算,按下的时间大于50ms。按这种约定,我们认为按下的时间小于50ms的为抖动信号,按下的时间大于50ms的是按键信号。即n=50ms/采样脉冲信号周期,这样就可以把按下的时间小于50ms的抖动信号滤掉。


. B( |, e( O: \# n4 L7 {/ ?6 p

  在此,根据实验板提供的系统时钟来确定实际需要的模值。实验板提供的系统时钟为100mHz,通过分频后得到25mHz的时钟,50ms*25mHz得到count的模值为21’h1312D0。采用这个模值得到的消抖时间大约为50ms,符合要求。


0 z$ x8 f! z# Q# J( n# D+ T

2.2 程序设计

/ e; z- {( j) e$ A2 L* X! E

  设计一个高脉冲计数器count1和一个低脉冲计数器conut0。引入一个采样脉冲信号clk,对输入信号button_in进行采样,并对clk进行计数。若button_in为高电平,count1做加法计数,直到count1各位全为1,停止计数,归零,使消抖后的输出信号button_out输出1。若button_in为低电平,count0做加法计数,直到count0各位全为1,停止计数归零,并使消抖后的输出信号button_out输出0。

  部分程序如下:

& z' C4 w$ {8 T9 s8 Z( c8 d- w' l# C

module filter(clk,
* G3 e- M7 X1 g* |& Qreset," z; v0 g+ |8 J3 X, d2 k: I
button_in,1 V/ Q1 i% x# ]7 S
button_out);
1 ~( g, @, Q6 r! ainput clk;
9 Z  a' G! j9 A+ u2 a) J) `7 I5 Ginput reset;" u$ y) w) Z0 u5 S3 D) ~' i# ~- A4 Q
input button_in;1 K' ?: }" Q2 a9 D6 l
output button_out;- P# w+ A5 h9 }! ?& _- v& x
wire buttong_out1;* W* _  O  Z& ?+ i) _8 Z  U
reg [20:0] count0;5 O) g. M$ X2 g$ H9 w
reg [20:0] count1;
4 C  y$ [7 E% j; Hreg button_out1_reg;/ V1 N- E7 l+ I3 A; p& n
……& w7 m8 P% C( U4 H. H. [1 x4 Z
assign button_out=button_out1_reg;7 Q4 o7 L! Q1 t" {: d9 r8 t$ v+ z
//对输入进行采样,计数
# R! T- f( C, T& b9 J' Kalways@(posedge clk or negedge reset)
6 n9 S% g0 v1 c; vbegin" H. [8 Y9 |) m" M; H; q3 ?
if(!reset) count1<=21'h000000;4 C4 @4 f+ D0 K1 n1 f
else if(button_out1==1'b1) count1<=count1+1;//对高电平计数9 [- X: ]# O5 S8 {( y
else count1<=21'h000000;
* {: k" n2 T6 e/ P1 fend


1 |# h4 I" q& `

always@(posedge clk or negedge reset)
4 U* t) q: A' u' x1 Y; v$ v6 Cbegin
5 b- i6 M( F. U, a1 w; Cif(!reset) count0<=21'h000000;
4 f# j+ Q; p# {0 T9 j* {else if(button_out1==1'b0) count0<=count0+1;//对低电平计数0 g1 A  _$ Y* z( H3 G
else count0<=21’h000000;8 d5 }* h% Z1 q
end
7 l3 D$ @9 Q/ {, o& g5 e% s//输出9 I' p; u( z& d
always@(posedge clk or negedge reset
! Y- r3 Z: m/ h' xbegin
3 l' t. l4 z  E8 o9 U2 s+ g8 ~# p9 |if(!reset) button_out1_reg<=1'b1;
; [( G. h! t  celse if(count0==21'h1312D0) //判断低电平信号是否符合输出条件
2 w; x  x% ?. l8 ]% U$ R  n! C0 pbutton_out1_reg<=1'b0; //如果符合条件,则输出低电平3 ~9 r2 S' x7 D! x: j! V
else if(count1==21'h1312D0) //判断低电平信号是否符合输出条件
! ~' N" B9 h9 P" w5 n! G0 M7 O2 Vbutton_out1_reg<=1'b1; //如果符合条件,则输出高电平9 T! A- }1 F9 t$ O9 E. c2 h0 i$ e* Q
else button_out1_reg<=button_out1_reg;: K5 R+ ]( M/ [7 z  _! _# d% z
end
5 ^6 e. f" v+ ?' uendmodule


5 V* O% D  V/ v6 I. O7 c$ T4 f9 a* B( V

  C4 D: j! C- N& U( K4 l; z" l

3 按键弹跳消除模块的实际应用

( k0 }7 ^" x" _4 A  O

  利用Memec virtex-4 开发板,通过开发板上的按钮输入8位的01控制代码,用开发板上的开关输入状态控制位,从而控制板上的1602 C型字符型液晶模块的显示模式和内容。

7 s3 K( C0 H' i) m- X6 \

  LCD控制信号生成模块:根据按钮输入,产生控制显示模块的8位控制信号。对按钮送入该模块的1位(0/1)信号进行保存并进行转换,使每8次输入形成一个8位的信号。如果输入不满8位或需重新输入,则取消上次结果;如果确定输入结果正确,则将8位信号保存并输出。


7 @1 y6 H9 Y5 D9 V- B

  LCD显示控制模块:完成1602 C型字符型液晶模块的初始化,并根据控制信号完成状态转换。

4 |2 F6 H. j, ]. C% t# r$ P

9 C4 o; V% S' w9 [, \

/ Q3 u% ^- F. {2 b6 P7 o# D

总系统设计如图4:

& w; O' x  n; I( h/ F0 q

  x% n! D' s: h' [7 d  e' s
( Z. X' q1 u2 D/ M' j  Z3 R# j

结束语


) L9 i/ I, N0 c

  本文进行性模块化设计,实现了弹跳消除电路模块、LCD控制信号生成模块和LCD显示控制模块组成的系统的具体功能,在Memec实验板上运行效果良好。并且在用FPGA进行电路调试的时候,可以将该系统嵌入其它电路中,增加需要的测试点和观察点,通过按钮控制显示,可以动态的对电路进行测试,找出问题,使调试更加直观,从而提高的FPGA的内部信号的可观察性,提高验证效率。


( L( Y6 E5 |( [4 g
3 y/ E$ g8 ~$ J; G

该用户从未签到

2#
发表于 2020-6-12 20:13 | 只看该作者
把该模块应用到按键控制LCD显示的系统中,并在Memec代理的Virtex-4 MB系统实验板上实现了该系统。消抖电路的效果良好,按键控制LCD显示结果正常。

该用户从未签到

3#
发表于 2020-6-14 15:59 | 只看该作者
学习了,谢谢分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-13 05:40 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表