|
此程式為一個每按一次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; |
|