|
此程式為一個每按一次TACT SW就會進行累加1的程式,並且LED亮度會每累加一次, V, n- l; r. `! O- o: ^1 ~9 R
就會增加,共8段亮度(0~7),此程式這些功能都可以了,但是會有開關彈跳的問題,, }2 r7 l4 Y7 d
希望能有高手幫我解決此問題2 M3 }# E; F) H- [# L* n" M
# H# a. a7 U, ^; J4 r2 S- r% ?
, x/ I1 l0 w7 I3 v& O+ H( @library ieee;. W( J* J4 g% j2 V; c
use ieee.std_logic_1164.all;2 ~! O7 A' U6 l; ^+ o9 ]
use ieee.std_logic_arith.all;
6 L; ]) p m$ H7 H& A9 M2 V9 V& ]2 tuse ieee.std_logic_unsigned.all;
2 [: P9 J0 e& o \# U3 S
) l6 N: k6 c6 D$ k) s$ v2 _entity pwm8 is Port (
+ ]' F7 g1 H6 x+ J CLK : in std_logic;--clock 1KHZ
y& m4 r' l, \ RST : in std_logic;--reset
% e5 Q, w2 L/ p$ R SW : in std_logic;--switch in' Q, ~% ~3 ?" L# o4 |. k
SEG7 : out std_logic_vector(6 downto 0));--2 J& e! j! h6 C/ h5 C! J5 P
end pwm8;0 `; ^! Q+ v2 Y' ]; ^) Z" O
6 ^; v w& l" C( j8 p3 L, l
architecture arch of pwm8 is" b% E* e# Y2 V) T* P
* @- @0 K, }" d. P9 esignal SWCNT : std_logic_vector(2 downto 0);
- S$ Q9 j, i. a* R- Q* Nsignal PWMCNT : std_logic_vector(2 downto 0);& h* Z) k0 E! G, K( _5 m: x6 _* A
signal DISP : std_logic;1 r- z: W7 D) r5 _+ ]
C3 \8 s M4 i
begin
! R+ E/ q, Q/ v1 B1 z
' P& L/ t0 ~* e. p$ g( g) [3 O( l* k--toggle switch input counter' A" B; G: m$ `4 M
process(RST,SW)1 S* q$ W8 c! q, l) \8 c8 W. k
begin
% e; y5 U; R4 ^" W/ ]% O; s if RST='1' then
( n" t$ x% }3 z$ V; Q SWCNT<="000";
4 O. y3 H$ h0 L elsif rising_edge(SW) then
6 x# j7 T' S! S' u! `' R- n SWCNT<=SWCNT+'1';- V& k5 Z& L0 q: K2 q
end if;
& \5 L: {% P3 S8 Tend process;
7 U {; w2 \" j7 O% |4 i9 h7 ]$ ~: k
0 A7 k" m4 o) X, E% I--pwm counter
/ |1 V( f4 v) I/ O( @process(RST,CLK)" Z% l( K6 S4 s+ a/ W; n# x
begin
2 O5 q$ h3 H1 S9 \/ a+ ^2 z' T) D if RST='1' then% b/ _/ I4 B q' \* j1 h4 p) e
PWMCNT<="000";
% E' w6 c4 J7 A9 ?/ @5 h+ V3 H; o DISP<='0';
! x O5 X1 X; V) W elsif rising_edge(CLK) then
4 W( |: J( X3 s; h! ? PWMCNT<=PWMCNT+'1';9 D/ p: R! ^8 r
if (PWMCNT="111") then7 F3 X2 J; y7 v7 K J' D, X* O
DISP<='1';
( Q! ^. K s" g" J! b2 v elsif (PWMCNT=SWCNT) then
6 Y8 L8 W6 V- |; g9 _1 i DISP<='0';# _, D( o8 d8 h7 a8 i+ n J
end if;
1 {! c6 V7 a. l! ^- Q end if;' D( G7 v" i. q) u/ k* V; Q
end process;
5 M+ J0 e5 b0 m( `3 B$ P$ J/ r2 V8 C0 [2 O4 C" r. w
--7-segment display decoder
5 a. j' G/ E; ^$ g, nprocess(DISP,SWCNT)& A1 @/ J; |& o# T6 E3 P0 h0 F
variable DISPEN : std_logic_vector(3 downto 0);+ F$ m8 t3 }$ L6 l' [% b
begin3 S3 g. Q3 f! p K8 p
DISPEN := DISP SWCNT;
2 `8 `' O/ M. k0 x& @ case DISPEN is --SEG7<="abcdefg"
% y6 \% V0 V% k when "1000"=>SEG7<="1111110";
' m. S+ U- F! [& w3 p9 q when "1001"=>SEG7<="0110000";4 |% V$ X; O9 U( }- V
when "1010"=>SEG7<="1101101";( d* R; |0 L+ ~! b7 i
when "1011"=>SEG7<="1111001";
% r: h/ z" a) `( G$ m- t2 Q) r2 y when "1100"=>SEG7<="0110011";. x! E% o0 c8 U7 T# @& w2 W4 p) W# q
when "1101"=>SEG7<="1011011";& P! n; b' U/ x0 Q2 {5 {6 Y* U
when "1110"=>SEG7<="1011111";3 f, O: L+ \, f6 J) m5 `8 q) @; z/ W8 M
when "1111"=>SEG7<="1110000";$ c! I1 N8 @( o. ~" k
when others=>SEG7<="0000000";. P7 A: P3 V! Z5 K5 Y$ l
end case;
6 B4 n, U: F) o4 S% Fend process;
) E( G( N8 h% ?end arch; |
|