|
此程式為一個每按一次TACT SW就會進行累加1的程式,並且LED亮度會每累加一次
/ a/ N) P1 o* g5 k: B) U& e就會增加,共8段亮度(0~7),此程式這些功能都可以了,但是會有開關彈跳的問題,( U; J1 ^8 Z" W p
希望能有高手幫我解決此問題
; R, ^! m F3 @" v! ]( E) k t/ a7 d4 W: E
+ ^1 p/ x0 ?7 k, W# R/ T8 ~
library ieee;4 g' o- A5 ?+ h$ _! `& @
use ieee.std_logic_1164.all;
& K6 `1 ^+ k9 Y! _* i Buse ieee.std_logic_arith.all;
$ G+ Q- H) I. ^3 Uuse ieee.std_logic_unsigned.all;" i# s5 _' z/ Y! D! a9 v4 k! B
- O7 j! K" e1 k
entity pwm8 is Port (
& v) J3 T& V. `. b) w7 m6 |( J8 ]$ M CLK : in std_logic;--clock 1KHZ K# d$ T A8 s( p( ^$ t
RST : in std_logic;--reset C4 m/ X) g# s& l9 g& \
SW : in std_logic;--switch in8 {$ q& G. _: }0 }& M0 o
SEG7 : out std_logic_vector(6 downto 0));--& P+ u4 y, F5 M
end pwm8;# z9 A: v* U' t# t% d2 E/ T1 f
8 q: e! D, H# S! G
architecture arch of pwm8 is+ R5 |# O# ?4 U/ U d
) P- U; ?. F9 e; }; Lsignal SWCNT : std_logic_vector(2 downto 0);6 Q1 ^% f; C. e o; t
signal PWMCNT : std_logic_vector(2 downto 0);$ @# f8 d; h5 b' U) Q+ `$ s+ n
signal DISP : std_logic;
6 A) d$ l8 r7 [- H4 _ Y( a9 ?5 P( m5 c! c1 a
begin$ i8 ~/ O' s3 n( w- A! I
& {/ Y. U/ E0 l; b; F--toggle switch input counter
( n8 P7 }, {- Q* H+ g7 Bprocess(RST,SW)
4 N" m; K$ `2 L l7 p8 Cbegin
3 z: U z/ l; y% B: c w if RST='1' then
& |$ e0 X9 l6 m1 h& P7 j0 j SWCNT<="000";& _2 {' c2 ~& ]1 R
elsif rising_edge(SW) then6 j8 Q1 a) T; m# s3 r
SWCNT<=SWCNT+'1';
2 \1 I6 u! h$ c2 Q) t end if;7 t/ c/ Z9 |( P& p$ g1 j! i7 V
end process;
. w* U+ j$ I+ S; m+ p: O3 m& ^; a5 i# j4 V
--pwm counter
+ z; {$ s& L$ h' p, Rprocess(RST,CLK)
4 a! m9 h+ n' A% O$ `8 [begin' v0 U' o$ t( {/ [
if RST='1' then
6 H( x; e( O0 K$ j PWMCNT<="000";' ^: \ ]' N& z' \9 j- N. j
DISP<='0';
3 y! c7 l. l. l1 B, |' R elsif rising_edge(CLK) then
7 w; m9 r- ? ^' v7 c PWMCNT<=PWMCNT+'1';
, ~6 G6 i8 h8 q+ W if (PWMCNT="111") then& N6 Q% k# e5 q6 V8 q e# ?
DISP<='1';
8 V" b- E4 U& n3 K elsif (PWMCNT=SWCNT) then
+ o# [" }+ g& b7 H$ Y+ X DISP<='0';/ x6 a0 A8 H% [. G2 |
end if;
1 M' {. m+ s1 ~7 s end if;
" `( u4 @ C& G9 b+ cend process;
( l: F% F3 Q5 v0 Y- `+ L& b, W" }. e, p4 W2 [
--7-segment display decoder
2 ]/ F. D' d* F" uprocess(DISP,SWCNT)
% ^3 u4 c m2 L* hvariable DISPEN : std_logic_vector(3 downto 0);! \& C- t3 v" R9 X4 A) Q3 c
begin' A2 m1 T$ }+ f( y) G* S
DISPEN := DISP SWCNT;
1 s. E" S% I; `7 X. n case DISPEN is --SEG7<="abcdefg"9 b( F: @: [ Y0 a
when "1000"=>SEG7<="1111110";
- O" {! m0 _7 `, ^ when "1001"=>SEG7<="0110000";
% J% J' }! _! t0 Q& D9 v when "1010"=>SEG7<="1101101";# m/ T. p0 h! D- ~+ M5 z
when "1011"=>SEG7<="1111001";) m2 e5 L. Z: \
when "1100"=>SEG7<="0110011";
' Q; t- s4 I+ p" A5 s1 t when "1101"=>SEG7<="1011011";& K8 B. ?, z- ]/ s
when "1110"=>SEG7<="1011111";
* X) z" r; J6 g# \ when "1111"=>SEG7<="1110000";6 n: S. z) }6 N1 w# u: u2 o
when others=>SEG7<="0000000";% t4 }% q6 E5 c8 w m
end case;
9 ^$ f4 G& D2 X3 Gend process;) {2 r! Z" h4 a7 r3 u
end arch; |
|