|
此程式為一個每按一次TACT SW就會進行累加1的程式,並且LED亮度會每累加一次* q* [1 U3 {5 n) H) H# o0 w& R/ P
就會增加,共8段亮度(0~7),此程式這些功能都可以了,但是會有開關彈跳的問題,! g& E$ T) c2 U1 v/ b, q* J
希望能有高手幫我解決此問題7 L" ^1 g G& l
9 L" Q# e2 q) b! `7 @% L' a
6 ?! t' o- r6 a" c. _library ieee;& C" N# |9 I$ T( A1 a! N
use ieee.std_logic_1164.all;4 F( W; x+ @& X+ O
use ieee.std_logic_arith.all;; D9 k* t- u7 r$ t
use ieee.std_logic_unsigned.all;
$ R" _# N- w' y9 ?* H& h5 P$ e5 m0 Q) V0 k
entity pwm8 is Port (
3 j$ i- j2 e% | p+ x' h2 D CLK : in std_logic;--clock 1KHZ4 P& J8 o8 r: f- v6 F) B3 U
RST : in std_logic;--reset
0 `3 \* D9 \ E! W7 @ SW : in std_logic;--switch in
- r' G1 W/ w7 P3 Q/ m SEG7 : out std_logic_vector(6 downto 0));--
3 r8 @. r9 Y5 p! v" Y( Tend pwm8;
! L+ `: s% h! R& \: ^: @+ ^! R+ S9 a6 h) ~
architecture arch of pwm8 is
6 F& p1 f# y& ~! l( I$ H4 v
0 E7 p5 r( m! z5 h: L4 b, u" tsignal SWCNT : std_logic_vector(2 downto 0);
; D( c7 Y: P l. V0 w5 osignal PWMCNT : std_logic_vector(2 downto 0);. [) X7 I: a7 i* x0 w8 s
signal DISP : std_logic;" J* _! I' a& U1 o% h( J
' o4 Y& P. X: L" Wbegin; Z+ W& Y; S o, m7 M9 l2 e
v* X% R2 f5 R# g. {4 |7 d- a, B--toggle switch input counter% n- f3 |. s- ]7 _6 k
process(RST,SW)
& L% M' J# P. ^9 _4 Ubegin* Y$ t1 F8 ~7 B3 p+ h+ O ~
if RST='1' then
% w1 \9 p, S7 p) w! Q SWCNT<="000";; [" p4 V2 x2 q8 N0 T" _
elsif rising_edge(SW) then
+ p# {1 `( B* Z) |& ]& H: E SWCNT<=SWCNT+'1';
' c% v7 F* W$ N4 f3 k2 W6 {0 p" d end if;
- U6 Q3 h* u8 D0 fend process;. t( \" U# {; I% v* z" T
/ b7 d5 ~4 i6 A+ Z' U" `. E, h: Q7 i2 w--pwm counter4 T: g$ r- ^4 Y' ~
process(RST,CLK)
0 z& i! e3 }' ubegin; }6 }( R5 d( W+ z$ W8 r4 ?" |
if RST='1' then% k2 o6 h" ~6 S" x1 K9 h( B
PWMCNT<="000";5 S( W8 ~. A6 l4 |% \- w2 ~+ G
DISP<='0';) `* m# ~, \+ `' ]9 x, |0 m D
elsif rising_edge(CLK) then2 X6 I! w% `2 @; u
PWMCNT<=PWMCNT+'1';# o3 T2 q7 e1 }8 A: T
if (PWMCNT="111") then; v. s# M3 k& z. |2 E7 F
DISP<='1';
* [* |1 P3 h" O! Y! g% Z elsif (PWMCNT=SWCNT) then
5 b) X& n# k+ N! J4 M. E2 ~ DISP<='0';/ X- w- j- Z5 p( |0 ^
end if;8 f: {- I0 p3 ]4 B: O/ H
end if;
" q; x0 L4 M0 f Uend process;
8 m! k, @2 r/ v9 |
& h4 n8 s0 N3 d K- E--7-segment display decoder
$ {$ p$ i% N1 {( ^! Cprocess(DISP,SWCNT)- Q' R6 {0 g( L) _
variable DISPEN : std_logic_vector(3 downto 0);
% p F) i1 m$ a- @$ S, W6 e' \* }* ~begin
. Q* ^( c+ \1 t DISPEN := DISP SWCNT;
" P6 m0 W5 P5 c: w* K0 f case DISPEN is --SEG7<="abcdefg"
% B* K: P8 s* T2 Z9 T when "1000"=>SEG7<="1111110";1 w+ v, Q# [7 w V
when "1001"=>SEG7<="0110000";
R* E' {2 t% q, F+ p" j+ z when "1010"=>SEG7<="1101101";
8 C! }$ n5 ]8 r0 b when "1011"=>SEG7<="1111001";2 ?/ [* t g% F; ?/ f: B% N
when "1100"=>SEG7<="0110011";
; i; `: g. P c when "1101"=>SEG7<="1011011";
* a" |# N4 {& Q9 @) p Q* F5 h when "1110"=>SEG7<="1011111";& U$ e# h) Q- i, @7 e6 v
when "1111"=>SEG7<="1110000";6 R$ @; P, X( x2 \/ B% j. r
when others=>SEG7<="0000000";
. }3 l: R" v4 o5 P end case;( v$ n& R5 N0 X+ ^6 w R# F3 @+ a
end process;
- k* f: U3 D8 S' z4 k7 cend arch; |
|