Chip123 科技應用創新平台

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

作者: still    時間: 2009-1-18 10:06 PM
標題: 此VHDL程式中的TACT SW要如何加才能防止開關彈跳
此程式為一個每按一次TACT SW就會進行累加1的程式,並且LED亮度會每累加一次% ~" i0 r( {  h2 S) W+ ?/ p
就會增加,共8段亮度(0~7),此程式這些功能都可以了,但是會有開關彈跳的問題,
! u% X5 E" u0 |% `0 H. l希望能有高手幫我解決此問題) m# V5 t, [3 p7 C8 m8 y( h6 n

$ n' |& n/ o; {1 W- g& Z. e
* S" t; u* T4 v5 R' f; hlibrary ieee;. G7 \5 P. L; v0 |1 G
use ieee.std_logic_1164.all;+ ~4 R. c; ^2 f3 ~
use ieee.std_logic_arith.all;
/ Q( B, E" N& }  @7 X  q6 I6 Tuse ieee.std_logic_unsigned.all;( p4 M' @& ?" Y- K5 ]0 i# q

% ?) |4 `" j* ?* d9 D: E" @entity pwm8 is Port (
, @; \  I+ |% t    CLK : in std_logic;--clock 1KHZ
. x& y" B8 y4 [+ ~* }" c( Z3 I0 z4 Z    RST : in std_logic;--reset" }8 s/ d+ Y- k" I+ L
    SW  : in std_logic;--switch in
) ]3 U, G% @3 [2 r$ ~    SEG7 : out std_logic_vector(6 downto 0));--* S, |5 [7 I. f3 w
end pwm8;
) x. s+ S5 i1 z0 R
& F5 o5 L' q  Z7 c. b, uarchitecture arch of pwm8 is
8 [1 W8 R) D9 ~) V0 \
! z) N" J) _, J9 u' L- r1 t' Lsignal  SWCNT : std_logic_vector(2 downto 0);) S# V/ f) s9 z
signal  PWMCNT : std_logic_vector(2 downto 0);
3 e9 d6 T" W* p6 s* `signal  DISP : std_logic;
5 R! w& K9 ]. n6 G. C7 E& E5 d- z( G3 v2 s- ?, R2 r2 X4 C/ j
begin5 m6 r, Y! r3 k/ L, F. [  D2 B

, z: h8 L" R. o- h: o5 d--toggle switch input counter
: G0 D; I2 h4 `: o' L) S0 L, Yprocess(RST,SW)+ \4 u: b" V: }- y4 p! X
begin, b5 u2 Z$ }8 r/ A
    if RST='1' then) d3 w' ^' i8 z/ q, k
        SWCNT<="000";
" e0 S1 ]! L8 G/ E1 ]1 M1 M: e( n    elsif rising_edge(SW) then' t$ r& V& r) }6 f
        SWCNT<=SWCNT+'1';
" G! z% @9 E$ X, a( ~2 ]8 [- a    end if;
1 w* T1 ]( Y7 s6 R. O% T9 Q" H: {end process;
4 @) N! Z# t: y: E
* H: L/ y& G" h8 R; V0 Z--pwm counter3 q: U5 \  c2 s  v: H
process(RST,CLK)' d* O5 H% I. }- X+ H+ y0 t
begin
1 M% P% x; |0 {- r. b; d  n    if RST='1' then
9 u9 N, `  Y' j7 U2 z        PWMCNT<="000";
/ ~' z0 x6 w% {* C        DISP<='0';" X+ ?& v" X' e. `2 a) g( V
    elsif rising_edge(CLK) then
0 Z) Y6 ?  N4 y! _        PWMCNT<=PWMCNT+'1';
+ x5 ]- ^* ~# r8 E. v5 i9 N2 F) i        if (PWMCNT="111") then) t) d+ ]  ]: e8 c: |: ^5 d
            DISP<='1';
: \: @! A+ v! m8 e% L# E7 \; {        elsif (PWMCNT=SWCNT) then7 J. }) t0 P6 B  }5 f
            DISP<='0';( b' M. E1 U2 l/ ]/ O! a
        end if;
# P/ \7 F; e4 @4 a& P8 p& a7 b    end if;& s( z8 i# y- }9 i* O
end process;
" n8 b& e) r2 t/ X5 y
$ X/ @3 r1 X' p--7-segment display decoder
1 ^" S# O* |: I7 o7 X; X) b7 s4 `process(DISP,SWCNT)
0 @; F- ^' o$ }9 _variable DISPEN : std_logic_vector(3 downto 0);  x" i. o; d' l; \4 ]
begin# e- S1 a3 y% w
    DISPEN := DISP SWCNT;
, b9 A$ k% E8 p. F/ p. O/ x$ Q    case DISPEN is --SEG7<="abcdefg"; j& v$ x: F; J- O
        when "1000"=>SEG7<="1111110";
! {9 M: H- x: K1 b        when "1001"=>SEG7<="0110000";/ Y/ o9 N  _1 u2 Q
        when "1010"=>SEG7<="1101101";* ^+ P! _: \+ X
        when "1011"=>SEG7<="1111001";
2 Q/ O# G" ~$ r9 m; j        when "1100"=>SEG7<="0110011";, D& E/ Z, M1 n$ F% n+ S, J6 q" F
        when "1101"=>SEG7<="1011011";: A+ |% r) y% K2 H" D
        when "1110"=>SEG7<="1011111";
1 h1 X- `3 A9 F        when "1111"=>SEG7<="1110000";
1 {& b7 x, E0 E( g- s1 [        when others=>SEG7<="0000000";* N' P* M0 A" k$ a. q# K# L
    end case;* c) f2 A8 Q  @! m
end process;7 b5 p. C5 V$ a) O3 Y  p
end arch;
作者: ssejack1    時間: 2009-2-2 01:02 PM
process(RST,SW)
0 Y2 E9 _1 p' B7 I: Wbegin2 s/ `0 r3 v* C  t8 k) g
    if RST='1' then
0 r8 O7 }) b4 D1 V" o0 e% j        SWCNT<="000";
7 m! B! q. m3 j) N; V$ V, {    elsif rising_edge(SW) then' f% h8 W' x6 r4 J
        SWCNT<=SWCNT+'1';
6 e* y7 {' L1 v    end if;8 ~- Y; ~8 f( e# g
end process;
) A* Q1 t7 F9 ]. {6 d% x8 V! ~將 SW 以 數ms~數十ms 的取樣率取到穩定的 High/Low 才當成上述的 clock 信號就可以解決




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