|
此程式為一個每按一次TACT SW就會進行累加1的程式,並且LED亮度會每累加一次+ h: G: T! t5 G9 b7 u
就會增加,共8段亮度(0~7),此程式這些功能都可以了,但是會有開關彈跳的問題,
* M1 X( s/ ], l, I* h( u( B" b希望能有高手幫我解決此問題% @' m$ I( B# ^. i" v
7 g& o1 ~- s8 ~ c
) B' i" l$ W O& ]6 ]$ Elibrary ieee;0 t W/ Q( D- @% Q2 k+ ]& Z. D
use ieee.std_logic_1164.all;
* B- m1 z, ]2 q& Uuse ieee.std_logic_arith.all;
! G3 c* V* I% q) X+ Duse ieee.std_logic_unsigned.all;
' g9 A4 ~' K# C* e3 }; g' K3 o2 P
0 C$ ~4 d. ?9 @entity pwm8 is Port (' Y R% W- [+ u j+ {4 Y; `
CLK : in std_logic;--clock 1KHZ
1 G: f. P W, O- w' o5 I: ` RST : in std_logic;--reset8 ]! q. v x( T+ d' P$ K [% r
SW : in std_logic;--switch in
4 P# R% v' [$ Z/ G @5 u* P SEG7 : out std_logic_vector(6 downto 0));--
' \) B2 }; A: @8 h. Hend pwm8;+ }2 y5 p+ h/ k
; Q2 x" m+ |3 k/ h9 C
architecture arch of pwm8 is1 l7 M% u3 |- W R& t
6 l! j& ~3 m4 R) G: a
signal SWCNT : std_logic_vector(2 downto 0); Z. c9 d: J1 m, J( B6 h
signal PWMCNT : std_logic_vector(2 downto 0);
) ^! Q7 s1 P" \+ e& z" c$ b' ]. rsignal DISP : std_logic;
- D# v8 l7 C% E K9 k3 o; [0 D# L0 x# Q/ v6 j. p
begin
: ?& f" o) p, |' e6 u. f5 v( b6 |/ J+ R0 E
--toggle switch input counter& I1 Z9 S D. P9 G5 b$ T
process(RST,SW)
! X7 ~* W( D* D; p `" z4 hbegin
) m6 z, R" t" J+ S+ m0 U if RST='1' then
: u$ N t: s! t, K( {5 K- e$ p" ^ SWCNT<="000";7 c1 w2 A# R* T7 N
elsif rising_edge(SW) then# I2 M0 i ^* x) f% ~7 N0 Q
SWCNT<=SWCNT+'1';
+ E6 }6 _9 q5 d8 C8 \" B end if;' P a4 K) m9 \2 d; W
end process;
8 i) N$ \8 m; ~( V2 c/ r, V0 V
' }* z$ F: T$ D8 C2 O) x--pwm counter
5 D# P Z0 P) j' O& hprocess(RST,CLK): k! G9 f) F4 j4 W
begin
" P* `6 d, T" g: l* F6 {" l if RST='1' then
9 ^0 X5 P3 e6 K Q; b! e: R7 f PWMCNT<="000";
; N. q9 B9 n) V6 A W% |# }' ] DISP<='0';
( X% H+ [9 v/ L7 H9 d9 @ elsif rising_edge(CLK) then
$ O+ R# L8 [8 `0 U7 Y' I5 e6 l t0 b& p PWMCNT<=PWMCNT+'1';
( L5 R# F$ k+ O$ _2 I$ X9 p" M if (PWMCNT="111") then" {( l9 s0 G a: K1 u Z- [
DISP<='1';
' S: r' }7 @ u elsif (PWMCNT=SWCNT) then
' q( `# M* b3 _: r6 u8 i5 ~2 h) {" k4 } DISP<='0';
j [% p$ s% A- w1 l1 m5 s9 [ end if;0 `/ |& \" @' X' N
end if;
5 r% ~# W7 l1 R; F0 y, s- Zend process;2 f! |8 ?1 \! K0 Z
5 V9 v: q, C0 e1 [% @3 m) @( V
--7-segment display decoder6 I3 i/ X/ s5 v/ g0 h
process(DISP,SWCNT)
, r( [" x9 {8 h, V: Z. [variable DISPEN : std_logic_vector(3 downto 0);
& b, s* E$ {1 S, U: S; Ebegin
0 {2 `6 A+ S! x3 g DISPEN := DISP SWCNT;
7 Z& _' a2 U0 c! Z6 o case DISPEN is --SEG7<="abcdefg"
" u, l8 {9 @# p1 j% x$ Q$ N& X when "1000"=>SEG7<="1111110";
6 m4 C. x0 I5 Q S$ H when "1001"=>SEG7<="0110000";
6 k0 c# `5 s$ p* t when "1010"=>SEG7<="1101101";. x- K/ Y- M! \' X0 z
when "1011"=>SEG7<="1111001";) V* o; c' J( s5 g
when "1100"=>SEG7<="0110011";, ], H! Z& {% x, s
when "1101"=>SEG7<="1011011";% T( {' y0 D; i6 n, x, u8 J) r
when "1110"=>SEG7<="1011111";
6 u& b& h1 { i* `- r- o9 k, s when "1111"=>SEG7<="1110000";
% Q2 D6 h. w0 ] when others=>SEG7<="0000000";
+ k* [3 _7 Z5 e end case;2 Y9 j8 }5 Y* z) b; Y- L* H
end process;
$ r4 p& B1 _; K3 L* @' l7 o% q g$ lend arch; |
|