|
此程式為一個每按一次TACT SW就會進行累加1的程式,並且LED亮度會每累加一次
* _: R& p1 L" G1 b) x( {. ?就會增加,共8段亮度(0~7),此程式這些功能都可以了,但是會有開關彈跳的問題,2 O/ C. [( P* b
希望能有高手幫我解決此問題: P6 F& p2 z! T: z; l" Z
) b8 ]" N/ X0 H- f& b- R7 }
; K9 V% @/ \& hlibrary ieee;
9 Q6 y6 W, i- U3 s" D$ f7 Z3 Buse ieee.std_logic_1164.all;
9 K9 I4 o( f7 c, suse ieee.std_logic_arith.all;
( T- r' {/ D+ M3 ouse ieee.std_logic_unsigned.all;
6 _+ A8 r. u, m6 Q2 o2 M6 a: r' f* W7 ^
entity pwm8 is Port (. ^& G& f) ?1 |* U+ d! _1 ]0 X2 ]
CLK : in std_logic;--clock 1KHZ, u4 ]6 o* x }9 {3 e' F
RST : in std_logic;--reset* T% N! x- E$ S1 |1 E' H* R
SW : in std_logic;--switch in4 T& I3 k0 V' `/ n T
SEG7 : out std_logic_vector(6 downto 0));--+ J c3 E% D2 B" r" i6 Y
end pwm8;
2 U' ]! p* u2 B1 N% ~* M. {1 t, c# d9 l# u0 T7 B
architecture arch of pwm8 is" f# ?3 v5 F# Z
6 ? }7 ?9 h. h
signal SWCNT : std_logic_vector(2 downto 0);& { W. Q$ m9 Q/ ]' e* ]4 q" Q
signal PWMCNT : std_logic_vector(2 downto 0);+ P2 i- e: x+ {+ ]
signal DISP : std_logic;) ?# ^/ C% l5 E
7 A8 r9 w" F |. w
begin9 Y4 P! _6 ]7 c, `, c! q1 c
$ a y7 D, Y3 R' C--toggle switch input counter
- W( ~! x5 U7 W7 L2 ?/ fprocess(RST,SW)( s9 d1 E% R, y7 w# |
begin
' p& W- K3 C9 n* j if RST='1' then$ X* I. B- m. C# w
SWCNT<="000";
r+ [3 r3 b" ]1 I9 X2 @2 b+ g+ Z elsif rising_edge(SW) then) w- F$ s, K8 J* N ?: |6 h1 _
SWCNT<=SWCNT+'1';+ U& `9 t" i9 i1 S0 {
end if;' @5 x o% \4 F) s2 D+ L
end process;
9 q3 E C( J( v6 t* N! B& r4 E1 R/ I$ A9 Z# a
--pwm counter
3 N$ E# g( H0 w# x: G, u* Wprocess(RST,CLK)$ C2 ?2 b$ f4 k9 o/ M
begin4 w! U9 s) y& P; y4 l8 l3 |
if RST='1' then/ k* c; H. U& f/ n" ]. x0 w& ?
PWMCNT<="000";) z( c# v8 \. ~, e) L
DISP<='0';
: M' f. @6 b( `3 F( W( ~" q- S elsif rising_edge(CLK) then2 _' a) I: |9 A3 t. A$ k, D! H @
PWMCNT<=PWMCNT+'1';
" x) b, m( U3 \$ @! J7 ~5 \ if (PWMCNT="111") then
' j" o% F5 m: [1 _, ]2 J+ w DISP<='1';
( {5 ~" V- U2 o7 {- Z& C# u elsif (PWMCNT=SWCNT) then
# |2 s0 [( c J- g9 h$ ?$ x DISP<='0';
' x$ c) t/ W3 s6 X end if;
: d0 J6 L# v# E, U2 q end if;% g% H2 [1 D5 N% M; e \
end process;. m$ p7 {# q# |* ^' U3 i* v
' g9 e6 J0 m: n. l' p* \8 q--7-segment display decoder. `1 o$ Y3 V6 |& X* \
process(DISP,SWCNT)4 f# H6 q+ ]: h" _+ L/ S, t: a
variable DISPEN : std_logic_vector(3 downto 0);+ {' b. e2 Z( _# T8 `8 e
begin I6 I( n4 N; h- r5 m
DISPEN := DISP SWCNT;
6 g& w" J- z( W4 g" a case DISPEN is --SEG7<="abcdefg"7 m6 k! j) U N2 @3 Y
when "1000"=>SEG7<="1111110";5 G. Z( ~+ E1 |" C/ f# X
when "1001"=>SEG7<="0110000";& _" ~* Y/ p: W. y7 B# p3 N5 B# ]) o
when "1010"=>SEG7<="1101101";; u- M% E* u: L/ A$ C* {& H
when "1011"=>SEG7<="1111001";1 d9 _; ~; a5 l E
when "1100"=>SEG7<="0110011";
, C# _. }2 G; Z5 }3 s& T when "1101"=>SEG7<="1011011";
* N8 f# ?8 m* }8 L when "1110"=>SEG7<="1011111";4 p5 I8 F$ G! |( `) k
when "1111"=>SEG7<="1110000";
' U- b ]3 n' x9 g& | when others=>SEG7<="0000000";
7 k* P. O4 | f- P$ U2 F$ U7 Q end case;+ H8 O k! k& n9 V) e4 |5 m) T4 }
end process;, ^& i1 f3 S6 }4 d4 D
end arch; |
|