Chip123 科技應用創新平台
標題:
此VHDL程式中的TACT SW要如何加才能防止開關彈跳
[打印本頁]
作者:
still
時間:
2009-1-18 10:06 PM
標題:
此VHDL程式中的TACT SW要如何加才能防止開關彈跳
此程式為一個每按一次TACT SW就會進行累加1的程式,並且LED亮度會每累加一次
4 r: s2 U' p- d" A9 W4 } P( m4 X
就會增加,共8段亮度(0~7),此程式這些功能都可以了,但是會有開關彈跳的問題,
# w$ B8 L) a! O+ N9 g" T% ]$ Q
希望能有高手幫我解決此問題
- t, y3 y9 H! F) ]) {2 w `
+ ^" @" S5 U4 K7 U* p
! k$ |4 q, {5 j! \4 N% k
library ieee;
* E5 F4 B# n. E# K
use ieee.std_logic_1164.all;
4 }: \% L2 @8 n0 n8 b
use ieee.std_logic_arith.all;
5 _3 L" I1 M+ z/ v
use ieee.std_logic_unsigned.all;
# \; ]% x5 c5 l0 F4 M7 Y3 o2 R9 V
- }: x: j: x# T. p2 [
entity pwm8 is Port (
: E' t" K7 ^, Y
CLK : in std_logic;--clock 1KHZ
) V( z4 f/ m3 W- z- Y/ k$ R) q
RST : in std_logic;--reset
" T. J) h. @; c6 T
SW : in std_logic;--switch in
: S+ A0 L, H) y9 a! ]
SEG7 : out std_logic_vector(6 downto 0));--
& f8 m) b# _, k$ N
end pwm8;
* x. Z0 _& @6 c; b
& m; U% o: _5 V% J9 V
architecture arch of pwm8 is
# v( ?' e, N' w+ A8 ~ E
4 g8 ~( ]" P; D% p
signal SWCNT : std_logic_vector(2 downto 0);
. B6 U, T# D2 u2 y5 _3 E6 y
signal PWMCNT : std_logic_vector(2 downto 0);
6 A) U8 [; f/ t% W( F \9 s
signal DISP : std_logic;
8 @% C% X. E$ r8 Z
' A* ?1 |7 `$ C% ^' S# Z; r5 t
begin
$ ?$ s% H; k4 z" p/ C
6 D: g7 W0 N1 e* [9 I
--toggle switch input counter
. w9 `/ Z/ \- Z, q' i
process(RST,SW)
$ Y! g& R# t: Z- d
begin
@6 o5 s5 F' P4 I/ H) k
if RST='1' then
0 q( Z% o8 Z4 }
SWCNT<="000";
2 O* n j7 R* L6 N2 N6 y! q
elsif rising_edge(SW) then
( K3 T) _& m5 B4 Y+ [7 l
SWCNT<=SWCNT+'1';
' R" Y+ M1 H0 j, {9 K
end if;
0 ^0 R0 u% Q! l* z
end process;
1 M4 H( d3 m* l1 x9 I& M, k2 j
8 T, H) ?" @) I
--pwm counter
+ V( i7 e! n4 k$ i% s) \2 ~" F" G
process(RST,CLK)
; s( t- |. G5 f [7 V9 N$ R
begin
8 @7 g2 Y/ E' R4 [8 n* ~
if RST='1' then
5 X" C' n' i2 r" ]
PWMCNT<="000";
7 U+ w/ @8 u' j7 Y
DISP<='0';
. p V- t" p" C7 O6 ?1 a' t4 I
elsif rising_edge(CLK) then
) I& R2 o, Z. o6 I8 i2 g' Z
PWMCNT<=PWMCNT+'1';
4 j% w1 r. o" A% ~) w8 i1 Y
if (PWMCNT="111") then
+ s0 _* Z- ] z5 U4 U% K" s
DISP<='1';
* { o p' k* \4 Z/ G
elsif (PWMCNT=SWCNT) then
: \( B6 a+ ]: W" p2 n3 ^! ]5 a* s, g
DISP<='0';
- N' x6 R+ O& [: l8 Y
end if;
: k+ @- l0 f' w7 O
end if;
# j! C, L0 c* T, N% \
end process;
9 e2 |; u+ L6 v
' I; j& k4 W: _# e" Z: l+ L* E3 c
--7-segment display decoder
/ p' D) r9 F/ x+ W, Y
process(DISP,SWCNT)
) \ K2 }/ K$ [; |5 ~; p
variable DISPEN : std_logic_vector(3 downto 0);
' d, I! J; m7 |% {; i6 h
begin
& L% ]6 v* @- {/ B }$ ]
DISPEN := DISP SWCNT;
! C& ?. r/ H# P; }, e
case DISPEN is --SEG7<="abcdefg"
0 [! }" ^# q/ C, ?* s- n8 S
when "1000"=>SEG7<="1111110";
1 n, Y$ V5 r+ [7 X6 B( x
when "1001"=>SEG7<="0110000";
- C; a/ s, S- A- m: Q: N+ [/ _: |
when "1010"=>SEG7<="1101101";
' C8 Z. I- G6 j0 c! U1 }3 W2 D, I
when "1011"=>SEG7<="1111001";
8 ~6 r# J3 O# D9 T1 h# C
when "1100"=>SEG7<="0110011";
: h1 P8 s% Z' H5 Y0 Z7 G0 o, p, U
when "1101"=>SEG7<="1011011";
; O5 B/ p7 p; U Y
when "1110"=>SEG7<="1011111";
) l# C7 F1 {& j+ A1 Z1 `$ y/ m
when "1111"=>SEG7<="1110000";
4 g, x& l4 n6 Y9 m
when others=>SEG7<="0000000";
_$ k! Y. c& u' \5 J3 A
end case;
1 M" {9 M! t/ |% S! ^& h
end process;
; G* X' Z& u$ r
end arch;
作者:
ssejack1
時間:
2009-2-2 01:02 PM
process(RST,SW)
5 a1 o! j6 b: L- H6 j3 u0 Z* i
begin
/ T6 t" W- `/ p: S; ^
if RST='1' then
: x/ x' x' v$ O% j& r9 N
SWCNT<="000";
, M g: k4 X2 B" L) E
elsif rising_edge(SW) then
6 l4 X7 i- X2 F8 ]; y/ m
SWCNT<=SWCNT+'1';
' \9 G1 S2 y2 J+ I) R, B
end if;
3 P$ h* }8 t: j( U% e& w8 q W# c( l
end process;
2 L w% o/ _- d9 ^9 Y- `
將 SW 以 數ms~數十ms 的取樣率取到穩定的 High/Low 才當成上述的 clock 信號就可以解決
歡迎光臨 Chip123 科技應用創新平台 (http://www.chip123.com/)
Powered by Discuz! X3.2