Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 9454|回復: 6
打印 上一主題 下一主題

[問題求助] Vhdl 彈跳開關 問題

[複製鏈接]
跳轉到指定樓層
1#
發表於 2009-1-8 21:26:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
LIBRARY ieee;
6 z0 T& R, x  @7 kUSE ieee.std_logic_1164.all;
& o! Y" m% b: I, H, HUSE ieee.std_logic_unsigned.all;+ e' ?* @% Q- M" [
ENTITY SWSTOP IS
2 Z+ ?/ p0 u  B" t, K1 L9 G        PORT(Hand        : IN  STD_LOGIC;                                 / W  U: D- z/ F% T2 t
                 CO                    : OUT STD_LOGIC) ;       
- k& Q/ ~  }  ]( r6 d7 BEND SWSTOP;' X2 g3 Z6 q! U& Z3 @% D7 Y5 ?4 C
ARCHITECTURE arc OF SWSTOP IS
; _/ p+ X1 Y6 Y" a4 u; b8 G# O BEGIN' A- w3 Y( f! L# B9 C9 u
  PROCESS (Hand)/ M: g! |( y2 x. s9 l
    VARIABLE imper :STD_LOGIC_VECTOR(1 downto 0) :="00";& ?8 y/ f4 r1 t4 Z( O! h+ G0 ~
    5 W0 y& D; C3 o- n7 R3 ]% V! i
  BEGIN
: I$ a1 g8 l7 E& i, k/ t7 v, S' D" @, k; L
     IF (Hand'event AND Hand='1') THEN 8 o4 M, H8 t+ i
                  + D) b: y, K& D8 O
     IF imper <"11" THEN imper := imper+1;8 U8 n8 o4 E7 H. d
     ELSE imper:="00";. E9 P' O8 i% e) O0 W5 |1 m
     
+ V) b9 m- S. s& Q  U& L     END IF;         
  Q$ C! D4 G" x2 z9 h1 _( T; Z6 Y& c     END IF;: }% b4 B. x6 P# P, k% d
     : `4 F0 }! a+ b9 |7 t6 J% r* L
      CO <= imper(0) ; ' T3 `! o2 j5 ?
        END PROCESS ;
4 q: T( k; N7 P/ e  D& ?6 e# K   5 S! h: h: t+ i5 B4 u# S
END arc;
' o% P. g) M: m8 S; b9 @
' R9 ?6 ~6 P; J, ~6 D
以上是我設計的開關
/ Q# c" Z- O8 N! t0 ?  h9 r: y; Y可是好像沒有彈跳功能?!7 d( d1 l  r# U6 S
我的問題是
# T0 g  `/ n/ e( s# Y3 J0 R: C9 j按一下的時候,應該 -1
7 S& C; S5 h+ [: v  x( a6 |8 c但是有時候會忽然 -2 -3 .....
$ }! E! K9 Y! y* Z; R2 @$ K是沒有同步咩?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2009-1-12 21:01:02 | 只看該作者
如果您的 hand 是由 push button 按而產生者建議要加入 debounce 功能,否則在彈跳暫態會觸發.......?次
3#
發表於 2009-1-13 12:10:32 | 只看該作者
VHDL Debounce_Process 寫法,你也可參考ISE VHDL範例
: o  L  r/ a2 v# J3 J& V
4 Q1 z6 V5 B0 d0 C8 Tprocess(clk,button)4 E. `! z  h3 y+ x% a0 B
begin* {# T4 j0 W0 z; R( L8 t
if clk'event and clk = '1' then
! `- L; V  K) M button1 <= button;
' t8 i/ [0 \$ x( S" d end if;( d/ v1 P+ B2 _, }# k" j
end process Debounce_Process;
; m- h# N8 D1 |* z- p, }1 u  p- m mybutton <= button1;
4#
發表於 2009-3-17 00:41:25 | 只看該作者
應該是按鍵開關彈跳的問題,當在按下和放開的瞬間,會有些微小的震動現象.
0 e# o: C7 b; i由於按鍵訊號的數位處理方式,可能將這些震動轉換成高頻率的雜訊依附在實際ON/OFF變化的兩側.% K8 }" d4 E+ Z& ^9 k8 ^
可以使用一個較慢的頻率來做取樣控制.
5#
發表於 2009-3-24 09:26:10 | 只看該作者
網路上有些Debounce程式你可以參考- P$ l3 ^; C" N4 _

/ ^6 i: i/ Z) u: N///////////////////////////////////////////////////////////////////////////////' I& ?. s, z+ U- J
//
5 _+ A3 ?! a% S- i, F// Pushbutton Debounce Module
" s* y; j6 ?& l4 {6 A3 f+ d; v. T//
7 l$ X. b  i8 f; D* `) [///////////////////////////////////////////////////////////////////////////////& [. Z4 w5 X# [" z8 B
module debounce (reset, clk, noisy, clean);& L. N: ]2 O& j3 q, }" U$ X: T
   input reset, clk, noisy;
. U$ `& D) d) `8 N   output clean;
* ?! L( K5 f* b, ~- T/ ^% M5 H$ P! @7 X
   parameter NDELAY = 650000;
) q/ z1 [' z# K1 G+ c8 r& y: |/ p   parameter NBITS = 20;# O* Q! d  I. E1 e9 W

- y; }# U) j0 C1 c) U# W   reg [NBITS-1:0] count;8 H: b2 w# O3 q! |
   reg xnew, clean;: M% P+ U: \7 \" i8 _. l4 N! C! s

! Q* \$ ?# n  @3 o   always @(posedge clk)8 j* ]4 s8 r1 X9 n
     if (reset) begin xnew <= noisy; clean <= noisy; count <= 0; end
  v+ B, J: T. |" _8 X% o; r/ `# `4 n     else if (noisy != xnew) begin xnew <= noisy; count <= 0; end
) m5 \) E" q) c" M4 q     else if (count == NDELAY) clean <= xnew;
$ w/ Y3 g/ {# d     else count <= count+1;
) |6 C; X. Z  {, Y' Y( |% X. V6 {; J2 c5 a5 g2 j' O4 `
endmodule
6#
發表於 2009-6-19 22:51:39 | 只看該作者
感謝debounce的code介紹分享
- G' F- S5 }/ F5 S6 I2 Y6 n7 i* O機械開關的確需要考慮數ms的彈跳
! x6 Y7 C' D0 h4 e! c" Q' \不然開關驅動會造成災難!
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2024-5-19 08:47 AM , Processed in 0.110514 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表