|
此程式為一個每按一次TACT SW就會進行累加1的程式,並且LED亮度會每累加一次
2 L) ]9 J, l0 ~+ b, ]$ J K就會增加,共8段亮度(0~7),此程式這些功能都可以了,但是會有開關彈跳的問題,
0 o& h I7 W7 X* V' {希望能有高手幫我解決此問題/ b& Y6 N( ]' x" G% I5 z1 u
8 W' A# E6 c2 I7 x* S, e, @
' [* V; [: L) H" X4 @6 J- |4 flibrary ieee;2 Y0 Y4 {; O# t3 H# C* m0 W
use ieee.std_logic_1164.all;. \4 ^8 H( K, ^
use ieee.std_logic_arith.all;+ X+ t+ z# L* p. l$ X& p
use ieee.std_logic_unsigned.all;
2 g3 ]8 |3 d( U6 x
3 s' \8 L7 s9 ~& R- q# m8 Dentity pwm8 is Port (4 u3 m, m& J1 Y
CLK : in std_logic;--clock 1KHZ
: N0 }8 _8 I( }- [* C RST : in std_logic;--reset
& i b( B4 i( z' D SW : in std_logic;--switch in
" ~: ]. J9 l4 l) i" \1 k SEG7 : out std_logic_vector(6 downto 0));--8 r! o& G: ?9 l5 C9 J+ Q6 z; Y8 F
end pwm8;( I+ N) h9 o; x7 Y2 K5 p
+ B* w" Z& @/ K
architecture arch of pwm8 is
0 T$ ~) A1 H) T' j. p d) D% a. {
signal SWCNT : std_logic_vector(2 downto 0);
& A% n# V# z7 N" A. usignal PWMCNT : std_logic_vector(2 downto 0);+ |1 w b$ Q3 `! A$ s) }! n2 W; g: i9 ^
signal DISP : std_logic;+ N- i7 @, x% p- P- l0 Q! a
. P( B& B# | M. hbegin
; ]- A; e) B5 |# f# K) ]# O- N3 Q0 }! w$ |9 q& @
--toggle switch input counter5 \+ c C" C8 y1 A4 U* M1 t
process(RST,SW). r; f# M' w. T% e2 O- _0 B
begin
7 ]; l6 S1 C/ ?! e& z3 ` if RST='1' then
- |1 y2 E6 {9 Z+ @# ~: l SWCNT<="000";! X6 T5 K' W$ ^8 q8 C& `) |
elsif rising_edge(SW) then' R, A+ l; N& M' @2 E
SWCNT<=SWCNT+'1';
8 F# J' x3 a9 ~ end if; ?8 y0 ~4 P. x! B$ \
end process;# D8 m- d4 |+ y% H. K
S$ P# z- I6 g: }, r7 Z$ m
--pwm counter1 f2 P7 r1 @" ]) V( S
process(RST,CLK)
+ ?5 e& |# X" `2 u N7 i- p- Tbegin: y) K3 Y. a# q/ F+ }: X& m: f1 t
if RST='1' then
) D- Z$ \" U0 M$ b! h9 `7 R PWMCNT<="000";. [$ i8 F) X6 T) o& y4 p( j4 A
DISP<='0';
% x6 }2 K; q& k; u" W elsif rising_edge(CLK) then
. ?) s# u- h P5 I; z4 D PWMCNT<=PWMCNT+'1';1 i3 x5 t. u& z" b+ P
if (PWMCNT="111") then$ }: @, k7 v0 z
DISP<='1';+ `1 ]! t, a1 E& }
elsif (PWMCNT=SWCNT) then
]: u3 G8 X8 |8 v5 [* C DISP<='0';. G! s- J, _: `* X9 W& H8 }
end if;
1 i! |8 w( A: W$ | end if;+ {! D9 O( T H! }
end process;
& K: ?* k$ p1 C5 v; Y! d) ?0 [% }; i) g/ m& C# J
--7-segment display decoder
+ p% J% `7 R8 Y5 t+ G( fprocess(DISP,SWCNT)
3 J! r! n4 v) B4 q$ r3 J! Xvariable DISPEN : std_logic_vector(3 downto 0);
( N8 y4 l2 |4 G! o7 v- z( s3 Ibegin; k7 d4 r+ T" j9 b
DISPEN := DISP SWCNT; G K$ I+ e; l+ \
case DISPEN is --SEG7<="abcdefg") A2 H6 e" }# ~2 p- O% Y3 T8 x
when "1000"=>SEG7<="1111110";
5 k6 K# ?# q/ ]6 m0 N! z when "1001"=>SEG7<="0110000";
! t7 @& H y4 q. H9 j$ { when "1010"=>SEG7<="1101101";
$ ]4 L; k$ |3 M2 ~/ j8 Z when "1011"=>SEG7<="1111001";: |. f; i4 I( u( L. M
when "1100"=>SEG7<="0110011";
, a# t& [. C4 L% o' {# B when "1101"=>SEG7<="1011011";2 O& v; l: j* m: O- p: O
when "1110"=>SEG7<="1011111";
1 B8 G2 A7 Z5 q& u; W% D8 j# ] when "1111"=>SEG7<="1110000";
# F5 e+ I4 `+ s) X. E7 H when others=>SEG7<="0000000";
) t4 Y) f' w w end case;
, \. R% K9 f+ d" ^# iend process;
7 v7 k% q! p# e, Pend arch; |
|