|
此程式為一個每按一次TACT SW就會進行累加1的程式,並且LED亮度會每累加一次
" y6 A! N6 X: G就會增加,共8段亮度(0~7),此程式這些功能都可以了,但是會有開關彈跳的問題,- z# {* ^, o* T
希望能有高手幫我解決此問題
X1 Z$ _: E" b, L
* G' D" j( O7 n# J% d8 Z/ p6 F& z. B9 k
library ieee;
9 V4 ^/ }0 w7 b: ~2 i( U( y. ause ieee.std_logic_1164.all;
' Y8 W7 ` ^ ause ieee.std_logic_arith.all;
$ U0 \8 l$ {/ `* m' g5 o1 H) ause ieee.std_logic_unsigned.all;' z) |# d3 r) w5 L; I; O
& X3 o' [' N. Q2 D
entity pwm8 is Port (
/ v3 M, @( @0 {* ]; C( H( L, }8 Y: r CLK : in std_logic;--clock 1KHZ
; P6 w1 T7 a+ j. G c4 l RST : in std_logic;--reset
$ z% c( v8 a' r; `; t( S SW : in std_logic;--switch in% _" V1 m4 C3 r( I2 @" j# I |" o1 m
SEG7 : out std_logic_vector(6 downto 0));--% ]$ K0 Z/ ?$ P6 m
end pwm8;
- s# v5 p+ x; s9 R) q$ l% s Z. u, ?; R
architecture arch of pwm8 is$ J# C9 k. T5 t0 |# u
' k, c: M9 ^: U9 Z( r8 Vsignal SWCNT : std_logic_vector(2 downto 0);
4 n( m7 U+ u: u0 n2 q# w; ksignal PWMCNT : std_logic_vector(2 downto 0);4 U" f2 A0 \! H: X
signal DISP : std_logic;# }/ {/ l- S/ S+ O- R6 o. x
- N0 L) L) G1 n# y9 Q' tbegin
( t b- P2 b0 J4 v
: ^, [2 L, u$ z) h8 u--toggle switch input counter
. e* |9 \; i$ C1 H+ r, W5 M( @ sprocess(RST,SW)
9 C; m$ M* F8 h" C8 V6 v3 e" m4 ^begin, f( [( f, Q% P: N8 t
if RST='1' then
, M% G6 C% q1 P2 K; r! A: ] O3 i SWCNT<="000";
( K. {3 R1 b$ t+ C elsif rising_edge(SW) then: S9 o8 y. `$ u6 N$ a# n+ e7 l
SWCNT<=SWCNT+'1';! z+ r7 b3 c) E7 h, l: W0 K ~
end if;
! ~ {$ T; ?7 I, C$ B/ pend process;$ M1 s# e! q/ s9 }
- g1 i, G$ M# X5 Z) y--pwm counter
% x( y' A' ^/ o) c% b- p! E; Oprocess(RST,CLK)
" a4 U T, ^% d5 ^/ o+ d1 Tbegin
6 ]: Z* m; I7 Q6 H1 y( {4 I5 S9 T9 t if RST='1' then. Z; r% L# T% K# Y
PWMCNT<="000";8 n$ {9 m( R' ]6 ?/ j% m
DISP<='0';
/ b: |) v- u( n; @! ? elsif rising_edge(CLK) then; {: E; v. I& U7 r; \0 E4 R
PWMCNT<=PWMCNT+'1';- l- j7 {) G" U0 V% {4 ]* F3 {
if (PWMCNT="111") then$ ~& M) w6 C2 }. N' k2 C: G A) N
DISP<='1';1 x8 ^, B$ W* U9 t( U3 G( d/ B" H
elsif (PWMCNT=SWCNT) then
8 l! R+ c4 V5 g w$ k# o DISP<='0';
% r1 Y* \( n- r4 t end if;3 K) u- a* M. a% x8 U& @4 r
end if;% O* j6 M1 [+ q
end process;4 k6 v# a" x5 J
2 r% }' o! _0 L
--7-segment display decoder& N6 y$ |& o. `( @3 B& k" f! J' q
process(DISP,SWCNT)
" k5 t- x4 l: T- e) Hvariable DISPEN : std_logic_vector(3 downto 0);
5 g0 d u, O3 y$ x9 K$ Ybegin
- k9 _7 z. j" Y( a" v% A$ { e; I DISPEN := DISP SWCNT;
5 G! l& r- G, {2 d case DISPEN is --SEG7<="abcdefg", s" G3 ^- v; R4 y9 H, _
when "1000"=>SEG7<="1111110";
. x% q+ X1 h3 | when "1001"=>SEG7<="0110000";+ M' O+ w' p3 {8 ~# D/ [
when "1010"=>SEG7<="1101101";$ E. b% r# `/ s/ X; m
when "1011"=>SEG7<="1111001";
6 v( U' V: p4 ?5 c when "1100"=>SEG7<="0110011";
' h! \& k& c! d when "1101"=>SEG7<="1011011";
3 m& s& u( n8 c9 x3 J when "1110"=>SEG7<="1011111";
# w2 Z" G# n2 R5 }9 _" Q when "1111"=>SEG7<="1110000"; Y' N' |8 G) Y8 z4 R* e5 g
when others=>SEG7<="0000000";: d) S, d* H$ D6 C: J- C Z; ]
end case;
" ?6 M$ L! e3 u- b5 f Q0 f; vend process;1 m% ?) ~7 c8 t, m+ o+ N* h
end arch; |
|