Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2009-1-18 22:06:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
此程式為一個每按一次TACT SW就會進行累加1的程式,並且LED亮度會每累加一次
/ a/ N) P1 o* g5 k: B) U& e就會增加,共8段亮度(0~7),此程式這些功能都可以了,但是會有開關彈跳的問題,( U; J1 ^8 Z" W  p
希望能有高手幫我解決此問題
; R, ^! m  F3 @" v! ]( E) k  t/ a7 d4 W: E
+ ^1 p/ x0 ?7 k, W# R/ T8 ~
library ieee;4 g' o- A5 ?+ h$ _! `& @
use ieee.std_logic_1164.all;
& K6 `1 ^+ k9 Y! _* i  Buse ieee.std_logic_arith.all;
$ G+ Q- H) I. ^3 Uuse ieee.std_logic_unsigned.all;" i# s5 _' z/ Y! D! a9 v4 k! B
- O7 j! K" e1 k
entity pwm8 is Port (
& v) J3 T& V. `. b) w7 m6 |( J8 ]$ M    CLK : in std_logic;--clock 1KHZ  K# d$ T  A8 s( p( ^$ t
    RST : in std_logic;--reset  C4 m/ X) g# s& l9 g& \
    SW  : in std_logic;--switch in8 {$ q& G. _: }0 }& M0 o
    SEG7 : out std_logic_vector(6 downto 0));--& P+ u4 y, F5 M
end pwm8;# z9 A: v* U' t# t% d2 E/ T1 f
8 q: e! D, H# S! G
architecture arch of pwm8 is+ R5 |# O# ?4 U/ U  d

) P- U; ?. F9 e; }; Lsignal  SWCNT : std_logic_vector(2 downto 0);6 Q1 ^% f; C. e  o; t
signal  PWMCNT : std_logic_vector(2 downto 0);$ @# f8 d; h5 b' U) Q+ `$ s+ n
signal  DISP : std_logic;
6 A) d$ l8 r7 [- H4 _  Y( a9 ?5 P( m5 c! c1 a
begin$ i8 ~/ O' s3 n( w- A! I

& {/ Y. U/ E0 l; b; F--toggle switch input counter
( n8 P7 }, {- Q* H+ g7 Bprocess(RST,SW)
4 N" m; K$ `2 L  l7 p8 Cbegin
3 z: U  z/ l; y% B: c  w    if RST='1' then
& |$ e0 X9 l6 m1 h& P7 j0 j        SWCNT<="000";& _2 {' c2 ~& ]1 R
    elsif rising_edge(SW) then6 j8 Q1 a) T; m# s3 r
        SWCNT<=SWCNT+'1';
2 \1 I6 u! h$ c2 Q) t    end if;7 t/ c/ Z9 |( P& p$ g1 j! i7 V
end process;
. w* U+ j$ I+ S; m+ p: O3 m& ^; a5 i# j4 V
--pwm counter
+ z; {$ s& L$ h' p, Rprocess(RST,CLK)
4 a! m9 h+ n' A% O$ `8 [begin' v0 U' o$ t( {/ [
    if RST='1' then
6 H( x; e( O0 K$ j        PWMCNT<="000";' ^: \  ]' N& z' \9 j- N. j
        DISP<='0';
3 y! c7 l. l. l1 B, |' R    elsif rising_edge(CLK) then
7 w; m9 r- ?  ^' v7 c        PWMCNT<=PWMCNT+'1';
, ~6 G6 i8 h8 q+ W        if (PWMCNT="111") then& N6 Q% k# e5 q6 V8 q  e# ?
            DISP<='1';
8 V" b- E4 U& n3 K        elsif (PWMCNT=SWCNT) then
+ o# [" }+ g& b7 H$ Y+ X            DISP<='0';/ x6 a0 A8 H% [. G2 |
        end if;
1 M' {. m+ s1 ~7 s    end if;
" `( u4 @  C& G9 b+ cend process;
( l: F% F3 Q5 v0 Y- `+ L& b, W" }. e, p4 W2 [
--7-segment display decoder
2 ]/ F. D' d* F" uprocess(DISP,SWCNT)
% ^3 u4 c  m2 L* hvariable DISPEN : std_logic_vector(3 downto 0);! \& C- t3 v" R9 X4 A) Q3 c
begin' A2 m1 T$ }+ f( y) G* S
    DISPEN := DISP SWCNT;
1 s. E" S% I; `7 X. n    case DISPEN is --SEG7<="abcdefg"9 b( F: @: [  Y0 a
        when "1000"=>SEG7<="1111110";
- O" {! m0 _7 `, ^        when "1001"=>SEG7<="0110000";
% J% J' }! _! t0 Q& D9 v        when "1010"=>SEG7<="1101101";# m/ T. p0 h! D- ~+ M5 z
        when "1011"=>SEG7<="1111001";) m2 e5 L. Z: \
        when "1100"=>SEG7<="0110011";
' Q; t- s4 I+ p" A5 s1 t        when "1101"=>SEG7<="1011011";& K8 B. ?, z- ]/ s
        when "1110"=>SEG7<="1011111";
* X) z" r; J6 g# \        when "1111"=>SEG7<="1110000";6 n: S. z) }6 N1 w# u: u2 o
        when others=>SEG7<="0000000";% t4 }% q6 E5 c8 w  m
    end case;
9 ^$ f4 G& D2 X3 Gend process;) {2 r! Z" h4 a7 r3 u
end arch;
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2009-2-2 13:02:01 | 只看該作者
process(RST,SW)0 S: R1 C: x$ x+ @* @) T
begin
/ U( r8 C9 M2 S. p' b/ f$ b( ]+ r  U    if RST='1' then& y: d$ f, s2 {8 o
        SWCNT<="000";" @. C: @# o8 ^1 u3 F
    elsif rising_edge(SW) then9 C5 S' s# U& L1 b5 h
        SWCNT<=SWCNT+'1';' s9 O7 W5 m) }, _# p" p0 Q6 p& m
    end if;: ?4 z+ A& a! Q: K
end process;
8 t- T  ^5 S2 R) _4 ]+ y將 SW 以 數ms~數十ms 的取樣率取到穩定的 High/Low 才當成上述的 clock 信號就可以解決
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-2-24 12:32 PM , Processed in 0.161009 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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