Chip123 科技應用創新平台

標題: 此VHDL程式中的TACT SW要如何加才能防止開關彈跳 [打印本頁]

作者: still    時間: 2009-1-18 10:06 PM
標題: 此VHDL程式中的TACT SW要如何加才能防止開關彈跳
此程式為一個每按一次TACT SW就會進行累加1的程式,並且LED亮度會每累加一次
4 r: s2 U' p- d" A9 W4 }  P( m4 X就會增加,共8段亮度(0~7),此程式這些功能都可以了,但是會有開關彈跳的問題,
# w$ B8 L) a! O+ N9 g" T% ]$ Q希望能有高手幫我解決此問題- t, y3 y9 H! F) ]) {2 w  `

+ ^" @" S5 U4 K7 U* p
! k$ |4 q, {5 j! \4 N% klibrary ieee;
* E5 F4 B# n. E# Kuse ieee.std_logic_1164.all;4 }: \% L2 @8 n0 n8 b
use ieee.std_logic_arith.all;5 _3 L" I1 M+ z/ v
use ieee.std_logic_unsigned.all;# \; ]% x5 c5 l0 F4 M7 Y3 o2 R9 V
- }: x: j: x# T. p2 [
entity pwm8 is Port (: E' t" K7 ^, Y
    CLK : in std_logic;--clock 1KHZ
) V( z4 f/ m3 W- z- Y/ k$ R) q    RST : in std_logic;--reset
" T. J) h. @; c6 T    SW  : in std_logic;--switch in
: S+ A0 L, H) y9 a! ]    SEG7 : out std_logic_vector(6 downto 0));--
& f8 m) b# _, k$ Nend pwm8;
* x. Z0 _& @6 c; b& m; U% o: _5 V% J9 V
architecture arch of pwm8 is# v( ?' e, N' w+ A8 ~  E
4 g8 ~( ]" P; D% p
signal  SWCNT : std_logic_vector(2 downto 0);. B6 U, T# D2 u2 y5 _3 E6 y
signal  PWMCNT : std_logic_vector(2 downto 0);
6 A) U8 [; f/ t% W( F  \9 ssignal  DISP : std_logic;
8 @% C% X. E$ r8 Z
' A* ?1 |7 `$ C% ^' S# Z; r5 tbegin
$ ?$ s% H; k4 z" p/ C
6 D: g7 W0 N1 e* [9 I--toggle switch input counter. w9 `/ Z/ \- Z, q' i
process(RST,SW)$ Y! g& R# t: Z- d
begin
  @6 o5 s5 F' P4 I/ H) k    if RST='1' then0 q( Z% o8 Z4 }
        SWCNT<="000";
2 O* n  j7 R* L6 N2 N6 y! q    elsif rising_edge(SW) then
( K3 T) _& m5 B4 Y+ [7 l        SWCNT<=SWCNT+'1';
' R" Y+ M1 H0 j, {9 K    end if;0 ^0 R0 u% Q! l* z
end process;1 M4 H( d3 m* l1 x9 I& M, k2 j

8 T, H) ?" @) I--pwm counter+ V( i7 e! n4 k$ i% s) \2 ~" F" G
process(RST,CLK); s( t- |. G5 f  [7 V9 N$ R
begin8 @7 g2 Y/ E' R4 [8 n* ~
    if RST='1' then
5 X" C' n' i2 r" ]        PWMCNT<="000";
7 U+ w/ @8 u' j7 Y        DISP<='0';
. p  V- t" p" C7 O6 ?1 a' t4 I    elsif rising_edge(CLK) then
) I& R2 o, Z. o6 I8 i2 g' Z        PWMCNT<=PWMCNT+'1';4 j% w1 r. o" A% ~) w8 i1 Y
        if (PWMCNT="111") then
+ s0 _* Z- ]  z5 U4 U% K" s            DISP<='1';
* {  o  p' k* \4 Z/ G        elsif (PWMCNT=SWCNT) then
: \( B6 a+ ]: W" p2 n3 ^! ]5 a* s, g            DISP<='0';
- N' x6 R+ O& [: l8 Y        end if;
: k+ @- l0 f' w7 O    end if;
# j! C, L0 c* T, N% \end process;
9 e2 |; u+ L6 v' I; j& k4 W: _# e" Z: l+ L* E3 c
--7-segment display decoder/ p' D) r9 F/ x+ W, Y
process(DISP,SWCNT)
) \  K2 }/ K$ [; |5 ~; pvariable DISPEN : std_logic_vector(3 downto 0);
' d, I! J; m7 |% {; i6 hbegin
& L% ]6 v* @- {/ B  }$ ]    DISPEN := DISP SWCNT;! C& ?. r/ H# P; }, e
    case DISPEN is --SEG7<="abcdefg"
0 [! }" ^# q/ C, ?* s- n8 S        when "1000"=>SEG7<="1111110";1 n, Y$ V5 r+ [7 X6 B( x
        when "1001"=>SEG7<="0110000";- C; a/ s, S- A- m: Q: N+ [/ _: |
        when "1010"=>SEG7<="1101101";' C8 Z. I- G6 j0 c! U1 }3 W2 D, I
        when "1011"=>SEG7<="1111001";8 ~6 r# J3 O# D9 T1 h# C
        when "1100"=>SEG7<="0110011";: h1 P8 s% Z' H5 Y0 Z7 G0 o, p, U
        when "1101"=>SEG7<="1011011";
; O5 B/ p7 p; U  Y        when "1110"=>SEG7<="1011111";) l# C7 F1 {& j+ A1 Z1 `$ y/ m
        when "1111"=>SEG7<="1110000";4 g, x& l4 n6 Y9 m
        when others=>SEG7<="0000000";  _$ k! Y. c& u' \5 J3 A
    end case;
1 M" {9 M! t/ |% S! ^& hend process;
; G* X' Z& u$ rend arch;
作者: ssejack1    時間: 2009-2-2 01:02 PM
process(RST,SW)5 a1 o! j6 b: L- H6 j3 u0 Z* i
begin
/ T6 t" W- `/ p: S; ^    if RST='1' then: x/ x' x' v$ O% j& r9 N
        SWCNT<="000";
, M  g: k4 X2 B" L) E    elsif rising_edge(SW) then6 l4 X7 i- X2 F8 ]; y/ m
        SWCNT<=SWCNT+'1';' \9 G1 S2 y2 J+ I) R, B
    end if;
3 P$ h* }8 t: j( U% e& w8 q  W# c( lend process;
2 L  w% o/ _- d9 ^9 Y- `將 SW 以 數ms~數十ms 的取樣率取到穩定的 High/Low 才當成上述的 clock 信號就可以解決




歡迎光臨 Chip123 科技應用創新平台 (http://www.chip123.com/) Powered by Discuz! X3.2