EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
按键在数字电路设计中经常用到。按键的弹跳现象是数字系统设计中存在的客观问题。按键是机械触点,当接触点断开或闭合时会产生抖动。为使每一次按键只做一次响应,就必须去除抖动。本文对按键的抖动信号进行了分析,并通过计数器的方式完成了消除抖动电路模块的设计。把该模块应用到按键控制LCD显示的系统中,并在Memec代理的Virtex-4 MB系统实验板上实现了该系统。消抖电路的效果良好,按键控制LCD显示结果正常。 7 g- l- I H8 u7 _
. o6 t' c7 C* N3 [; C) n, B) m
按键开关是电子设备人机交互的主要器件之一。按键大多是机械式开关结构,由于机械式开关的核心部件为弹性金属簧片,因而在开关切换的瞬间会在接触点出现来回弹跳的现象。对于灵敏度比较高的电路,这种弹跳现象引起的信号抖动会造成误动作而影响到系统的正确性。因此,我们需要设计按键弹跳消除电路来去除抖动.。
1 x( F" f+ L% y4 D2 c' m1.弹跳消除电路的原理和功能
8 R4 G5 b3 Y5 F q; B4 L l" c 按键开关的典型连线分为低电平有效和高电平有效,本文的是低电平有效。 $ @. J5 F7 n3 {* d; U/ l
机械开关的抖动存在三种情况:按下时有抖动,松开时也有抖动;按下时有抖动,松开时无抖动;按下时无抖动,松开时有抖动。机械开关的抖动波形、抖动次数、抖动时间都是随机的,并不是每次都会产生抖动。
" l/ K" ~8 ~* X; C) D不同开关的最长抖动时间也不同。抖动时间的长短和机械开关特性有关,一般为5ms到10ms。但是,某些开关的抖动时间长达20ms,甚至更长。所以,在具体设计中要具体分析,根据实际情况来调整设计。
! L5 \+ A8 {4 b0 R* o 弹跳现象以及弹跳消除如图1 所示,虽然只是按下按键一次后放掉,结果在按键信号稳定先后竟出现了多个段脉冲,如果将这样的信号直接送到计数器之类的时序电路,结果将可能发生计数超过一次以上的误动作,从而误以为键盘按了多次。因此,必须加上弹跳消除电路,除去短脉冲,避免误操作的发生。
4 B; Y d- K; M/ S! W K7 \7 I2 }
# V: s7 J/ J1 J" y A, f$ j
, p' O# ?2 V9 O4 S) e# R2.按键弹跳消除模块的实现 2 v1 J* Z. l) b
为了使按键弹跳消除模块的更加简洁,并且移植性好,在此用计数器的方式实现消除按键抖动的功能。 0 \$ A. R. D a6 I4 c8 s: }
2.1 计数器模值的计算
2 g6 E1 Z$ y! v; |( w* ?$ b 计数器模值的确定是按键弹跳消除效果的关键问题,如果值过大,即采样时间过长,就会漏掉正确的信号;如果值过小,采样时间过短,则会将毛刺误认为是输入信号。 & U) }& Q9 [, T8 \0 P
计数器的模值n根据抖动信号的脉冲宽度和采样信号clk的周期大小决定。根据一般人按键的速度小于10Hz(每秒小于10次),所以按键时间大于100ms,按占空比50%计算,按下的时间大于50ms。按这种约定,我们认为按下的时间小于50ms的为抖动信号,按下的时间大于50ms的是按键信号。即n=50ms/采样脉冲信号周期,这样就可以把按下的时间小于50ms的抖动信号滤掉。
1 c. E+ }5 f T4 T. I 在此,根据实验板提供的系统时钟来确定实际需要的模值。实验板提供的系统时钟为100mHz,通过分频后得到25mHz的时钟,50ms*25mHz得到count的模值为21’h1312D0。采用这个模值得到的消抖时间大约为50ms,符合要求。
2 t/ q. C3 I0 g0 Q4 y, r2 |2.2 程序设计 # M. w- R) i! _/ @$ E. @
设计一个高脉冲计数器count1和一个低脉冲计数器conut0。引入一个采样脉冲信号clk,对输入信号button_in进行采样,并对clk进行计数。若button_in为高电平,count1做加法计数,直到count1各位全为1,停止计数,归零,使消抖后的输出信号button_out输出1。若button_in为低电平,count0做加法计数,直到count0各位全为1,停止计数归零,并使消抖后的输出信号button_out输出0。 部分程序如下: % _; l# O+ P8 V8 l7 J
module filter(clk,9 H8 \- i4 y1 ?- [' p
reset,; m) }6 _8 P0 Y; H" l
button_in,
) u& j) m) y. E/ S5 N7 Tbutton_out);
# l2 R# x8 V* tinput clk;% I' q% n6 Q+ @" S: p
input reset;: i% T" j# t+ Z; @+ s: n
input button_in;4 K! n8 C% G! W0 @
output button_out;2 o# X2 Y5 w% f6 k. O$ \5 G
wire buttong_out1;/ L) Y# I8 C9 q& Q5 x+ }/ ?
reg [20:0] count0;
& i% @3 N5 q: L4 a* [: Zreg [20:0] count1;
1 P# {4 O/ V7 o' [3 Y2 Treg button_out1_reg;; ~* U8 b! S0 q4 N3 h& K1 o" g8 J
……$ M& c& \- Q! [) n
assign button_out=button_out1_reg;& [: f: a3 d5 ?
//对输入进行采样,计数
1 U' d$ i* T2 o6 {2 D3 i: W( X5 a2 X1 c" Nalways@(posedge clk or negedge reset)1 i- y0 F6 K5 ^% f) q# m
begin& b, z) m2 z. @2 z% k/ a
if(!reset) count1<=21'h000000;
5 t' H: Y, j# b0 s) Qelse if(button_out1==1'b1) count1<=count1+1;//对高电平计数9 ~! `. j: k u' e
else count1<=21'h000000; J. a" S, U* u9 T! }/ |, r
end 8 ^) K& H5 ]" W( y. }! e3 g
always@(posedge clk or negedge reset)# r. Z6 R l& _! T3 A0 I
begin/ O8 G0 Y" ^/ C/ x' R# Z: i" Q
if(!reset) count0<=21'h000000;' p5 N$ p0 b9 ~5 c3 ?3 |
else if(button_out1==1'b0) count0<=count0+1;//对低电平计数
) O1 u3 t2 w9 c Q" w: \else count0<=21’h000000;
_9 z/ T5 C% Y. x5 Q" ^end
1 }6 _' s+ x" g$ o/ H+ C/ a8 \6 a2 v//输出: [, o& ~2 t% F/ {( M2 Y; C
always@(posedge clk or negedge reset
: X7 }8 B- M2 d* x& dbegin7 E7 N" O+ f! j. l, `5 L+ t, U" z
if(!reset) button_out1_reg<=1'b1;: D1 W& W8 a0 W! u1 G
else if(count0==21'h1312D0) //判断低电平信号是否符合输出条件& m2 g% {# n, y- u3 u
button_out1_reg<=1'b0; //如果符合条件,则输出低电平
% }2 k; L9 K5 h& Jelse if(count1==21'h1312D0) //判断低电平信号是否符合输出条件
) i' D. G; G( j8 H& b7 _button_out1_reg<=1'b1; //如果符合条件,则输出高电平2 l+ |# A& [/ l" F+ g
else button_out1_reg<=button_out1_reg;
& B; c. w @ N) a8 e8 ~+ l7 g9 pend+ w0 e( U8 B. U! j7 J/ T
endmodule
9 f( f) \4 w7 K5 M% c' h# c% ?: i$ a+ p8 B$ O' y+ @
5 q- w |/ w: i
3 按键弹跳消除模块的实际应用
4 e. K/ \2 z9 X+ l& z 利用Memec virtex-4 开发板,通过开发板上的按钮输入8位的01控制代码,用开发板上的开关输入状态控制位,从而控制板上的1602 C型字符型液晶模块的显示模式和内容。
+ M* a; e, _, Z4 `' O. s LCD控制信号生成模块:根据按钮输入,产生控制显示模块的8位控制信号。对按钮送入该模块的1位(0/1)信号进行保存并进行转换,使每8次输入形成一个8位的信号。如果输入不满8位或需重新输入,则取消上次结果;如果确定输入结果正确,则将8位信号保存并输出。 ! [2 M( _% Y* `/ t
LCD显示控制模块:完成1602 C型字符型液晶模块的初始化,并根据控制信号完成状态转换。 2 i5 q& }! }5 o, R! n# J* B
9 G; }( o1 N! O7 d+ |# m! u3 S% j2 S8 F
总系统设计如图4: 0 ^5 ?3 ? Q2 W" I1 s6 k
+ C4 c* {6 S" d. ^0 E2 o, |* \( L8 T/ i" b H$ R, I l
结束语
, D" P; Q0 r4 a 本文进行性模块化设计,实现了弹跳消除电路模块、LCD控制信号生成模块和LCD显示控制模块组成的系统的具体功能,在Memec实验板上运行效果良好。并且在用FPGA进行电路调试的时候,可以将该系统嵌入其它电路中,增加需要的测试点和观察点,通过按钮控制显示,可以动态的对电路进行测试,找出问题,使调试更加直观,从而提高的FPGA的内部信号的可观察性,提高验证效率。 / Z1 B; R9 C8 w( \" N. f# b/ a
* f9 y2 _: G1 r+ J @+ Z; ~ |