Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 6939|回復: 1
打印 上一主題 下一主題

[問題求助] 此VHDL程式中的TACT SW要如何加才能防止開關彈跳

[複製鏈接]
跳轉到指定樓層
1#
發表於 2009-1-18 22:06:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
此程式為一個每按一次TACT SW就會進行累加1的程式,並且LED亮度會每累加一次
$ \# x2 t7 f- j就會增加,共8段亮度(0~7),此程式這些功能都可以了,但是會有開關彈跳的問題,4 O$ N/ _1 _; J+ J( i9 F
希望能有高手幫我解決此問題3 [* f3 r! y) p3 z
, u" ~+ }  h; i& h

1 a( [4 S0 L; p: Ylibrary ieee;
# ^6 H0 y8 Y7 ^% Euse ieee.std_logic_1164.all;
, i( i+ y4 U0 u8 ~$ E7 o: Muse ieee.std_logic_arith.all;8 G1 h) {: S1 t' `5 n! F8 E+ ]! D9 |
use ieee.std_logic_unsigned.all;3 m# x% @1 M6 b/ @# O8 g+ ~/ B
. M$ O3 w" P8 G# d
entity pwm8 is Port (1 ?+ J5 m& L' C$ [" X
    CLK : in std_logic;--clock 1KHZ
) O  J/ y$ W: l% L, r7 g    RST : in std_logic;--reset, g7 @$ K1 l; Z, `9 _& C! P
    SW  : in std_logic;--switch in
) m5 L) D8 F) M* t: H    SEG7 : out std_logic_vector(6 downto 0));--
( v' q( }" n8 ?9 uend pwm8;
. C3 @( ~9 s" m& b* K2 W) z/ l4 u7 _. ^) Y
architecture arch of pwm8 is
) s3 v& E, i5 A- q
5 m* ^+ z: P' ?  _3 \signal  SWCNT : std_logic_vector(2 downto 0);: n4 ?1 P2 w: K1 ]; i
signal  PWMCNT : std_logic_vector(2 downto 0);
4 V3 `: F* Q% jsignal  DISP : std_logic;
( c+ N- z& ?0 J8 x3 @2 Y+ z
) {! [/ t; }  o' O* Q' W* Lbegin8 ]# W& u4 n) T# I" X4 v

- d% M) _5 t( l# \2 V--toggle switch input counter% |( Z5 T9 y+ B* [+ s! e
process(RST,SW)& l& x, `% w- i" g
begin: U2 u- _+ l1 Q4 J
    if RST='1' then
5 U& F7 i, n0 x$ m' C% D. w/ E        SWCNT<="000";; P- q4 f# m' Q, p" J
    elsif rising_edge(SW) then
& d2 a# D1 H2 F  \8 f        SWCNT<=SWCNT+'1';  N- }8 F( |; P$ d
    end if;. i- h, N1 X. }1 C" e0 r
end process;
+ a. w5 D( f! O: B* l' E& s+ A5 }( s! n4 k( s* M5 _
--pwm counter- d+ v! G4 x9 C& p
process(RST,CLK)) @3 c6 U  q/ H. [0 @: }% [' f
begin
; q! \$ b+ i2 Z4 Z    if RST='1' then
* L$ |1 o/ y# N        PWMCNT<="000";! M2 K% t" D( ?6 P2 Z
        DISP<='0';
1 Y* C; }8 \8 K5 n8 u! }    elsif rising_edge(CLK) then, p9 E! r& N3 C- |' w
        PWMCNT<=PWMCNT+'1';8 }3 W6 t$ X2 Q1 S( E! Y) c
        if (PWMCNT="111") then
' I8 m) t: r4 Y8 L" X3 R            DISP<='1';! @4 c7 r# D: O9 i: b0 P& J# O
        elsif (PWMCNT=SWCNT) then
7 s0 V0 [& `6 {; X# A' R% q            DISP<='0';) H+ d0 z9 o; q
        end if;: e1 u; r" s) Y1 D
    end if;9 T' k6 K2 B" i7 r! \
end process;3 s( ^! \6 w: W+ ?* o4 |' @" a0 U
3 J6 x9 S: {6 v+ F9 f. m) v9 w- `) |
--7-segment display decoder3 l* g% {4 N/ j& Z/ x6 I( ?
process(DISP,SWCNT)5 f4 Q! `. e. s2 u$ Y
variable DISPEN : std_logic_vector(3 downto 0);, Y: k5 D$ m& c; z3 @) |8 E
begin
9 Z1 n0 b1 L# x5 y7 b9 }) Z    DISPEN := DISP SWCNT;. G) }1 _; T+ m# u' o' z; {# V
    case DISPEN is --SEG7<="abcdefg"6 [& c# ~- H& D, l0 B* O
        when "1000"=>SEG7<="1111110";
0 m, w& J4 I! R" u7 V; g        when "1001"=>SEG7<="0110000";6 b/ [' x9 E6 R6 \4 [9 u; c
        when "1010"=>SEG7<="1101101";& B& E! y: d! {$ w' O
        when "1011"=>SEG7<="1111001";
* i  @( c5 c! R: h8 s" o        when "1100"=>SEG7<="0110011";
8 f$ I" s2 p3 }& ]1 E) V        when "1101"=>SEG7<="1011011";
6 ]% e* I' c7 _+ t7 e        when "1110"=>SEG7<="1011111";
8 ]1 ^1 ^) V0 u- o$ a: j9 r        when "1111"=>SEG7<="1110000";
9 A  w% w- P' _' \        when others=>SEG7<="0000000";
( M( \/ S7 x2 G0 T    end case;
. h/ X1 [/ a' T$ p+ Nend process;$ E$ _. B6 |$ f. p( t& Y
end arch;
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2009-2-2 13:02:01 | 只看該作者
process(RST,SW)
% P8 q8 S3 l" p. v# {begin- N+ P( k0 Q! S5 m! Y" w
    if RST='1' then
( Z. R* O, \0 a$ C( [. L$ w        SWCNT<="000";# G# A! m+ L- [5 ]& S8 k
    elsif rising_edge(SW) then. P6 S% K+ k4 ^8 u. X+ W
        SWCNT<=SWCNT+'1';
( U4 f2 _+ D4 M8 [4 a# W9 w4 k1 v- P    end if;: t9 ]1 X4 H) _
end process;
) n! _; u2 Y/ u+ }/ `5 p  w將 SW 以 數ms~數十ms 的取樣率取到穩定的 High/Low 才當成上述的 clock 信號就可以解決
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2024-6-4 11:27 AM , Processed in 0.116515 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表