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

关于VHDL按键去抖如何实现

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-5-23 07:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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 zP0ROCESS( 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' ~P1ROCESS( 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 }; ^

该用户从未签到

2#
发表于 2019-5-23 16:45 | 只看该作者
谢谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-9 20:03 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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