|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
关于VHDL按键去抖如何实现 按键检测需要消抖,一般有硬件和软件两种方式。硬件就是加去抖动电路,这样从根本上解决按键抖动问题。除了用专用电路以外,用可编程FPGA或者cpld设计相应的逻辑和时序电路,对按键信号进行处理,同样可以达到去抖动的目的。
- z5 d) \' S2 t& i; i# c+ @. P 本例中用状态机实现了消抖电路:
6 D5 n! b3 r$ F$ @ c- ~端口描述:clk 输入检测时钟;reset 复位信号;din 原始按键信号输入; dout 去抖动输出信号。
4 n6 s9 M e& }; G0 X2 t5 R' b1 R; O |
VHDL源码如下:, q" b$ R; V, {& L: M; W
LIBRARY ieee;- P- V _! b: @! Y6 S
USE ieee.std_logic_1164.all;: }5 K) H+ @6 ^* c, @! B
USE ieee.std_logic_unsigned.all;
# I& z' E, @- m. x2 M9 ZENTITY xiaod IS
, q9 d: J& x" p! w, {0 C; Z8 C& nPORT: W* U' g' ]- r( a: @
(3 R, w1 c! F1 C8 o. }1 Z
clk : IN STD_LOGIC ; R& X, e Y7 U" O+ e0 M
reset : IN STD_LOGIC ;4 ^' f$ c$ N; J- Y/ T |
din : IN STD_LOGIC ;
2 l, c0 |* V0 O& k dout : OUT STD_LOGIC
! e! C$ R1 P7 s);) `9 G' P5 W4 b. `7 a+ ^
END ENTITY;
s1 f, E" V. ?0 e; n+ OARCHITECTURE RTL OF xiaod IS
1 L" ?* p) ]( P/ a9 m( U& X( fTYPE state IS( s0,s1,s2,s3); 9 |+ z. A2 f+ R
SIGNAL pre_s, next_s: state;
( n2 _' I1 \" Q, T5 X9 x* ?BEGIN4 U4 N' g" m% P- s2 y+ q
" A. _/ L6 i7 j& v4 zP0 ROCESS( reset, clk )
; P6 \5 L( C; e4 UBEGIN * _- ?" O3 o: Q+ w
if reset = '0' then
2 w( ^- s0 ?4 r0 g( k pre_s <= s0;
6 N5 v- z" O/ _' g; p' o9 P elsif rising_edge( clk ) then
2 K8 N* G! K. D* O3 f" ^ pre_s <= next_s;
$ |+ Z$ u/ F) M, Q% d else3 h0 s! }1 Z2 D. u6 k$ \
null;
S& v; E8 |5 H4 f1 a, |+ m end if;1 i) x4 Y; h. H; z! J/ U! O
END PROCESS P0;: c( Q* i. {# J' V
c1 S6 N/ ]" H0 U' ~P1 ROCESS( pre_s, next_s, din )
! a' [( G6 r( a3 Z5 dBEGIN
& J5 d1 k. d- {% U case pre_s is
" l: H- n3 p/ e& D: l ^9 [ {
1 y1 \& |& n; M2 | when s0 =>
. a2 @# F6 r4 R& b dout <= '1';
* L& C5 i" S7 n" n/ o _ if din = '1' then
1 ?% |: x u; I! s, t( L/ J% c next_s <= s0;
% t! A# t# a7 K. e! ^6 e* |5 D else/ r" X' ]$ v! H# C% c
next_s <= s1; 2 ]2 R# D; y# n. _5 P7 d( ^
end if;: Y F, I9 ]( X
; y c" \: S; @( A5 w
when s1 =>
& D$ X% V6 y9 b1 P+ B dout <= '1';3 A5 @" f5 Y& H6 X* a9 C' w. Y6 Z+ P
if din = '1' then) ^& B. Q2 v% w5 v
next_s <= s0;$ Y0 e4 t9 X# c6 A/ j
else9 j, T* Q. g! I3 @
next_s <= s2;8 p! \! [1 r1 s B
end if;
; e- g" ^; ]( N h - W* U7 S: C) ^( k( C7 _. _
when s2 =>6 t5 L1 N: y8 N) a
dout <= '1';( j( S) H! `- l) I3 {6 `2 y' _2 W b
if din = '1' then/ b* t$ O: N& c
next_s <= s0;& M. n2 K1 w; a. ^
else
. m. A- g' t" p, L, l& X# s# s next_s <= s3;
0 r( }+ g' J$ J) D; f end if; & ?0 o5 N+ N f& m h& \
4 y% R# b9 }7 T4 I6 r
when s3 =>
+ f$ l5 ]5 ^8 N, d; e dout <= '0';
0 i9 C5 `/ B' w1 @8 H% Q if din = '1' then9 u6 g% s& B* s. d7 ?! i
next_s <= s0;
) f7 k2 y2 i. S$ q5 @6 z else
& B$ a9 C+ H6 g2 t3 D5 `9 j: m next_s <= s1;9 A4 R' j4 D( X( m" c. }
end if;
# t$ } O8 F' | end case;" {3 E, x4 O M- Q' i1 g$ C
2 c, w% K, g7 }) E( C" u; V
END PROCESS P1;1 F' F9 P! @; c' p, X3 V
END RTL; ' x. P% Y4 A! r% { x8 `
多按键去抖动电路VHDL源码,按键个数参数化,每个按键处理调用了上面的模块:
* C2 Y8 A% o) N. v$ K# o% H1 n
$ @1 \7 k1 ]4 ALIBRARY ieee;
* W- J6 r0 r# l" B4 [$ ]! u* e& @! b! _USE ieee.std_logic_1164.all;
3 y# X; A9 y* L1 Y: J7 d' EUSE ieee.std_logic_arith.all;
( p8 v. `$ v: J9 u2 R2 {+ A. |USE ieee.std_logic_unsigned.all;' H$ o% D) F/ k5 a8 \& s: @5 ^2 z
ENTITY Nxiaod IS. G; J" z6 n: G! y1 _
GENERIC( width: positive:= 5 );
( u# X* g: J3 z3 K' s
/ l2 M; H; |) V7 ZPORT J7 G7 b. D. L$ ]: [
(0 z' J+ V; ]6 S7 |" V! ^
clk : IN STD_LOGIC ;8 D* y' @. I* `/ g
reset : IN STD_LOGIC ;
( d5 E$ O. e8 A din : IN STD_LOGIC_VECTOR( width - 1 DOWNTO 0);
! q) y S" n% F" y& _! O dout : OUT STD_LOGIC_VECTOR( width - 1 DOWNTO 0) ! {, Z8 `3 u3 l; c4 Y
);, \# y2 W1 Z1 Z7 R; y
END ENTITY;
1 \7 z! D/ L' \* gARCHITECTURE RTL OF Nxiaod IS) _( F+ F% f3 c# k" h
$ G0 |8 L9 E+ JCOMPONENT xiaod IS
* c3 x* z* K H% m% O$ wPORT
: d! e% E, J' _, W: S5 I- T+ t(! J7 N, x! B8 b% c9 K7 g
clk : IN STD_LOGIC ;) ] L# @: k0 a0 O' j I% z# t5 J( H0 I
reset : IN STD_LOGIC ;
$ p( X' p7 u" \ din : IN STD_LOGIC ;' {: Y: i# o) D9 N
dout : OUT STD_LOGIC
0 }& r9 i+ Z" P/ D3 ]3 R);/ W" J( r; q6 ~9 v3 N& N
END COMPONENT;- P% U' U- ~7 [
BEGIN$ I' ]7 M7 g) w8 f( |3 D
g1: FOR i IN 0 to width - 1 GENERATE
! a. X6 ^" R& o5 X( p8 wux: xiaod port map( clk => clk, reset => reset, din => din(i), dout => dout(i));
8 y& L# A& ?5 t6 F9 sEND GENERATE;
; c' _' t1 |# [, F8 d- {: nEND RTL;. Q3 E: ~3 \' S T8 }3 d, D; x& ~
& K8 d @$ M' H* J- ?- E3 u w9 V g# v; O1 m7 G$ R7 }; ^
|
|