|
此程式為一個每按一次TACT SW就會進行累加1的程式,並且LED亮度會每累加一次
7 f, [8 M+ Q8 v7 d; @, C就會增加,共8段亮度(0~7),此程式這些功能都可以了,但是會有開關彈跳的問題,( `5 v/ f: N* S# C, W" [
希望能有高手幫我解決此問題& o- l Z& g0 E3 p1 p
. i. v; o$ A2 ^
! K3 c; V1 R7 ]# rlibrary ieee;: t; R- Z% o6 ^ ?2 g1 e" ]& Q
use ieee.std_logic_1164.all;
( r( I6 I8 M9 ^! `9 X! cuse ieee.std_logic_arith.all;: J+ A; A, Q" e2 X$ n9 P5 z
use ieee.std_logic_unsigned.all;
6 m' }* I+ s4 e
; m) S) D4 L9 w. V1 W+ zentity pwm8 is Port (0 F0 [- P4 F/ R8 r3 b2 B
CLK : in std_logic;--clock 1KHZ
5 P9 a2 g4 a. i0 t' y/ U) e RST : in std_logic;--reset
4 s4 m! B M, g( x% y7 \6 } SW : in std_logic;--switch in- e& A3 A, f4 t* x1 f4 C- t& f
SEG7 : out std_logic_vector(6 downto 0));--; E6 e- t/ r: Q) R6 P# e
end pwm8;
" N1 k! E2 Z* ?7 T. k
" |% X4 A0 Q [* t, f8 ^. xarchitecture arch of pwm8 is0 J& A: E% _! T
9 g! S6 F2 [, n3 d" r$ B* k9 S
signal SWCNT : std_logic_vector(2 downto 0);
0 N6 Z9 B% _! ]0 G* F1 r- N- psignal PWMCNT : std_logic_vector(2 downto 0);- y5 ]5 e1 y( u3 o8 J
signal DISP : std_logic;
0 G% k; v8 i: S' U
m0 A+ W0 b9 c+ l5 Nbegin$ B; ?# ]8 {0 }2 k
) j$ Y& Q d: o" M3 F--toggle switch input counter
Q4 o) e5 |3 R7 P1 p+ b$ Oprocess(RST,SW)
& d6 \/ c Y. ]$ k( `; _: Bbegin
5 h+ k( K9 m0 {" w- g! ~9 |# {- R if RST='1' then9 w \5 P+ E W+ d( h O& @/ ~
SWCNT<="000";$ U: f! u; Y% `- }- f- y0 x: E
elsif rising_edge(SW) then7 \8 P7 k6 b; l' x- F' ?
SWCNT<=SWCNT+'1';
8 d! w6 o3 N% y$ s end if;
) S1 F; [& x5 g0 G kend process;
% G+ j2 r& w% J+ h' A7 g& P( r% I- N7 B* C+ t- q( } B
--pwm counter) k$ P i' h& W( F$ O8 t' d! r+ E' R& ^
process(RST,CLK)
3 G2 Y7 A( o0 V$ Y2 N* U0 J/ E8 n6 `begin
! j* F' Y) u! B* j if RST='1' then
' f+ E5 h( n3 k4 Y! A8 B PWMCNT<="000";
7 ~0 a+ d& b0 J% V$ w DISP<='0';: I0 u, d2 v' c9 T0 W& E% o
elsif rising_edge(CLK) then4 `% f4 J: e. ]! J ?0 p* U
PWMCNT<=PWMCNT+'1';+ A6 ^% D- @' z
if (PWMCNT="111") then/ v' I) w$ H$ e/ y" E* P
DISP<='1';8 X% B2 m7 ~& d+ H: c3 [! K6 d
elsif (PWMCNT=SWCNT) then
- ^1 C5 ~/ z/ i DISP<='0';
; @! }0 T' ~$ [, [( n. b end if;
2 u1 i6 r/ S M" y" s) u3 R+ z end if;
+ `; n# z- ~8 a" ^1 h/ d% [end process;
* N0 D3 f" X4 j# V4 {
7 b% M( [* O1 v--7-segment display decoder6 J3 g1 ]5 G8 [+ A2 d& V2 w$ W+ x
process(DISP,SWCNT)6 ]) m8 D" }) |% t/ w$ k
variable DISPEN : std_logic_vector(3 downto 0);6 w" Q1 L1 L. D1 {, S
begin
( s8 }/ ~1 q4 y0 N DISPEN := DISP SWCNT;2 I1 }4 r8 e+ _- S" l0 G
case DISPEN is --SEG7<="abcdefg"
. q* W9 l; }* `6 P when "1000"=>SEG7<="1111110";7 Y# ?' S6 Y6 q$ ~/ e, y: c3 V
when "1001"=>SEG7<="0110000";
3 A9 W( P( _7 i when "1010"=>SEG7<="1101101";: K; r: O, |; V: j a
when "1011"=>SEG7<="1111001";6 s, W$ Z: Y* N7 `, X! n( z8 e$ S
when "1100"=>SEG7<="0110011";
0 m: M% b8 p7 q when "1101"=>SEG7<="1011011";
1 d: z0 ?1 ^2 h) K# N when "1110"=>SEG7<="1011111";" O; Q0 P/ e; Q3 l6 G4 p
when "1111"=>SEG7<="1110000";
0 b' y8 g+ ^- {' `: m2 @' l. \" s when others=>SEG7<="0000000";
, E2 q! L+ R! A% W' ] end case;
9 M* |7 s% H9 U5 Y% e0 \5 z5 ~. z4 `end process;
( P& T l3 b% {end arch; |
|