|
此程式為一個每按一次TACT SW就會進行累加1的程式,並且LED亮度會每累加一次, K, ], u7 M, L8 Z7 H% u
就會增加,共8段亮度(0~7),此程式這些功能都可以了,但是會有開關彈跳的問題,- G/ R+ J: t; @
希望能有高手幫我解決此問題
- v: [' A& \3 w0 Z( y
5 a0 C8 d% B7 T2 J( H! w% O, w, g* m2 F3 Y4 e Z* T3 U
library ieee;
' U; Y5 A! f8 z6 |+ i7 i/ m2 }. T0 w$ Kuse ieee.std_logic_1164.all;$ {* J6 q! u8 e
use ieee.std_logic_arith.all;$ s5 z* ]$ n$ M" D- x
use ieee.std_logic_unsigned.all;
- `; H) F; _9 Q# t7 T$ C9 K" r4 A
entity pwm8 is Port (
1 l; Q a' A" x! l* O CLK : in std_logic;--clock 1KHZ
: t& N7 I; f7 Z+ b4 I- D0 X RST : in std_logic;--reset. d- V# ]/ F0 C( t
SW : in std_logic;--switch in4 r- G9 Q3 N( p2 O* k
SEG7 : out std_logic_vector(6 downto 0));--
( V o' j3 V3 ^+ ]end pwm8;
7 U$ b) z6 e" t" x- e6 H! r0 o% t+ w8 d
architecture arch of pwm8 is P# Q4 z5 h% A$ ^3 b
+ B# v( n/ p' A5 v( @! X# [+ isignal SWCNT : std_logic_vector(2 downto 0);: `' l- W9 a; d6 L% v3 C5 y
signal PWMCNT : std_logic_vector(2 downto 0);- B6 g7 L3 r; p6 x& K" h
signal DISP : std_logic;! P7 D q' H' w9 X! h
* m9 g8 |( ]$ g4 p
begin8 u' z: U( p2 o6 P B4 H7 b
! g6 e( {8 V! }0 m% c/ H g+ {
--toggle switch input counter5 F& j3 y$ i1 [& O3 r( V/ C6 A
process(RST,SW)
) b3 A2 w( |+ x) K% A% i( z2 {1 Ubegin" ]% A3 ]% s6 u' B3 E; O
if RST='1' then+ _4 B; t6 s& T) m/ I# z1 Y9 g+ }
SWCNT<="000";& W8 c7 q, _) d6 m6 z' k
elsif rising_edge(SW) then( l) h6 v2 I" E `! S7 b
SWCNT<=SWCNT+'1';
# B, S/ s9 @! A# R1 H end if;* l+ l- {1 e4 ?# T6 }# k1 c7 X
end process;# y7 H) \" f) ~" @
* J0 p# W% K# g4 T
--pwm counter
0 _( _. H0 c, j7 R$ \+ _process(RST,CLK)+ q& X1 g" u$ x# v" _/ l
begin
: i3 y. [# j' m+ d* V if RST='1' then' k" f5 k5 ]1 F
PWMCNT<="000";
9 ]: E; y1 ^1 T# A% f, ~ DISP<='0';7 ~$ X9 t, Z* H; b. _- ^: R) g+ {/ b
elsif rising_edge(CLK) then
/ K! t& V7 m$ o ~* u" B PWMCNT<=PWMCNT+'1';) I* E. B: W( V
if (PWMCNT="111") then
# I2 E" C/ h5 d4 ~ DISP<='1';
/ l4 \3 E8 ~) ?# B+ A8 K4 P$ { elsif (PWMCNT=SWCNT) then* a1 B, _1 C0 o; V0 [# K8 @! I
DISP<='0';
7 J! ^! h$ A) [; B4 C end if;% ^6 N; H, g& O- \- [$ ?4 ]2 _% U; C
end if;
- S; t7 B- g( A {$ S. Tend process;5 j) h9 O5 ^, l. @1 r, o
. ], D t4 S2 b1 [6 N: u--7-segment display decoder! K. [& R3 ^) [: D! a: e
process(DISP,SWCNT); {. H# h/ O3 @4 H3 O+ {
variable DISPEN : std_logic_vector(3 downto 0);# t0 q9 X3 ~6 {6 f6 N+ D
begin
. L* f0 h) d3 o4 c DISPEN := DISP SWCNT;1 V- T. m: m9 b
case DISPEN is --SEG7<="abcdefg"4 {1 c) E# M: c& S0 G4 ]7 x+ L' t
when "1000"=>SEG7<="1111110";1 W- f1 P0 N9 r, B# `' M1 E' I
when "1001"=>SEG7<="0110000";5 G- m0 x6 s2 g2 ~7 L9 M2 P/ K% r1 e* |
when "1010"=>SEG7<="1101101";
5 c& x0 [) w9 O7 v! X when "1011"=>SEG7<="1111001";
- A7 p: D6 _7 R, ^/ h when "1100"=>SEG7<="0110011";
6 F5 W+ V1 n+ E/ a5 d when "1101"=>SEG7<="1011011";' ]1 H3 ~( G8 U |2 @3 b& \, z
when "1110"=>SEG7<="1011111";% }( m: h5 w: l5 Q+ u5 c$ O
when "1111"=>SEG7<="1110000";
+ {* Z# m- O9 i. U when others=>SEG7<="0000000";1 \+ Y+ l) s1 A/ Z" P) F% u" O2 a; a
end case;# R3 C, C6 Z8 ] @9 ^
end process;7 f; Y; N% q' K
end arch; |
|