Chip123 科技應用創新平台
標題:
此VHDL程式中的TACT SW要如何加才能防止開關彈跳
[打印本頁]
作者:
still
時間:
2009-1-18 10:06 PM
標題:
此VHDL程式中的TACT SW要如何加才能防止開關彈跳
此程式為一個每按一次TACT SW就會進行累加1的程式,並且LED亮度會每累加一次
% ~" i0 r( { h2 S) W+ ?/ p
就會增加,共8段亮度(0~7),此程式這些功能都可以了,但是會有開關彈跳的問題,
! u% X5 E" u0 |% `0 H. l
希望能有高手幫我解決此問題
) m# V5 t, [3 p7 C8 m8 y( h6 n
$ n' |& n/ o; {1 W- g& Z. e
* S" t; u* T4 v5 R' f; h
library ieee;
. G7 \5 P. L; v0 |1 G
use ieee.std_logic_1164.all;
+ ~4 R. c; ^2 f3 ~
use ieee.std_logic_arith.all;
/ Q( B, E" N& } @7 X q6 I6 T
use ieee.std_logic_unsigned.all;
( p4 M' @& ?" Y- K5 ]0 i# q
% ?) |4 `" j* ?* d9 D: E" @
entity pwm8 is Port (
, @; \ I+ |% t
CLK : in std_logic;--clock 1KHZ
. x& y" B8 y4 [+ ~* }" c( Z3 I0 z4 Z
RST : in std_logic;--reset
" }8 s/ d+ Y- k" I+ L
SW : in std_logic;--switch in
) ]3 U, G% @3 [2 r$ ~
SEG7 : out std_logic_vector(6 downto 0));--
* S, |5 [7 I. f3 w
end pwm8;
) x. s+ S5 i1 z0 R
& F5 o5 L' q Z7 c. b, u
architecture arch of pwm8 is
8 [1 W8 R) D9 ~) V0 \
! z) N" J) _, J9 u' L- r1 t' L
signal SWCNT : std_logic_vector(2 downto 0);
) S# V/ f) s9 z
signal PWMCNT : std_logic_vector(2 downto 0);
3 e9 d6 T" W* p6 s* `
signal DISP : std_logic;
5 R! w& K9 ]. n6 G. C7 E& E5 d- z
( G3 v2 s- ?, R2 r2 X4 C/ j
begin
5 m6 r, Y! r3 k/ L, F. [ D2 B
, z: h8 L" R. o- h: o5 d
--toggle switch input counter
: G0 D; I2 h4 `: o' L) S0 L, Y
process(RST,SW)
+ \4 u: b" V: }- y4 p! X
begin
, b5 u2 Z$ }8 r/ A
if RST='1' then
) d3 w' ^' i8 z/ q, k
SWCNT<="000";
" e0 S1 ]! L8 G/ E1 ]1 M1 M: e( n
elsif rising_edge(SW) then
' t$ r& V& r) }6 f
SWCNT<=SWCNT+'1';
" G! z% @9 E$ X, a( ~2 ]8 [- a
end if;
1 w* T1 ]( Y7 s6 R. O% T9 Q" H: {
end process;
4 @) N! Z# t: y: E
* H: L/ y& G" h8 R; V0 Z
--pwm counter
3 q: U5 \ c2 s v: H
process(RST,CLK)
' d* O5 H% I. }- X+ H+ y0 t
begin
1 M% P% x; |0 {- r. b; d n
if RST='1' then
9 u9 N, ` Y' j7 U2 z
PWMCNT<="000";
/ ~' z0 x6 w% {* C
DISP<='0';
" X+ ?& v" X' e. `2 a) g( V
elsif rising_edge(CLK) then
0 Z) Y6 ? N4 y! _
PWMCNT<=PWMCNT+'1';
+ x5 ]- ^* ~# r8 E. v5 i9 N2 F) i
if (PWMCNT="111") then
) t) d+ ] ]: e8 c: |: ^5 d
DISP<='1';
: \: @! A+ v! m8 e% L# E7 \; {
elsif (PWMCNT=SWCNT) then
7 J. }) t0 P6 B }5 f
DISP<='0';
( b' M. E1 U2 l/ ]/ O! a
end if;
# P/ \7 F; e4 @4 a& P8 p& a7 b
end if;
& s( z8 i# y- }9 i* O
end process;
" n8 b& e) r2 t/ X5 y
$ X/ @3 r1 X' p
--7-segment display decoder
1 ^" S# O* |: I7 o7 X; X) b7 s4 `
process(DISP,SWCNT)
0 @; F- ^' o$ }9 _
variable DISPEN : std_logic_vector(3 downto 0);
x" i. o; d' l; \4 ]
begin
# e- S1 a3 y% w
DISPEN := DISP SWCNT;
, b9 A$ k% E8 p. F/ p. O/ x$ Q
case DISPEN is --SEG7<="abcdefg"
; j& v$ x: F; J- O
when "1000"=>SEG7<="1111110";
! {9 M: H- x: K1 b
when "1001"=>SEG7<="0110000";
/ Y/ o9 N _1 u2 Q
when "1010"=>SEG7<="1101101";
* ^+ P! _: \+ X
when "1011"=>SEG7<="1111001";
2 Q/ O# G" ~$ r9 m; j
when "1100"=>SEG7<="0110011";
, D& E/ Z, M1 n$ F% n+ S, J6 q" F
when "1101"=>SEG7<="1011011";
: A+ |% r) y% K2 H" D
when "1110"=>SEG7<="1011111";
1 h1 X- `3 A9 F
when "1111"=>SEG7<="1110000";
1 {& b7 x, E0 E( g- s1 [
when others=>SEG7<="0000000";
* N' P* M0 A" k$ a. q# K# L
end case;
* c) f2 A8 Q @! m
end process;
7 b5 p. C5 V$ a) O3 Y p
end arch;
作者:
ssejack1
時間:
2009-2-2 01:02 PM
process(RST,SW)
0 Y2 E9 _1 p' B7 I: W
begin
2 s/ `0 r3 v* C t8 k) g
if RST='1' then
0 r8 O7 }) b4 D1 V" o0 e% j
SWCNT<="000";
7 m! B! q. m3 j) N; V$ V, {
elsif rising_edge(SW) then
' f% h8 W' x6 r4 J
SWCNT<=SWCNT+'1';
6 e* y7 {' L1 v
end if;
8 ~- Y; ~8 f( e# g
end process;
) A* Q1 t7 F9 ]. {6 d% x8 V! ~
將 SW 以 數ms~數十ms 的取樣率取到穩定的 High/Low 才當成上述的 clock 信號就可以解決
歡迎光臨 Chip123 科技應用創新平台 (http://chip123.com/)
Powered by Discuz! X3.2