李 莉
(山西工程技術學院 信息工程與自動化系,山西 陽泉 045000)
隨著EDA技術的發(fā)展,大規(guī)??删幊踢壿嬈骷﨔PGA[1]越來越廣泛地應用到電子設計中,涉及電子、通信、航天、自動化等領域。FPGA以其具有體積小、功耗低、設計靈活、可靠性高的特點,已經(jīng)成為電子設計的重要元件之一。鍵盤作為人機交互界面的重要組成部分一直是設計者關注的焦點。一旦對按鍵進行誤判會影響整個系統(tǒng)的穩(wěn)定性。 根據(jù)設計中按鍵數(shù)量的多少,按鍵電路分為單獨按鍵、獨立鍵盤和矩陣鍵盤。 本文就這三種不同按鍵形式給出了不同設計方案。
如圖1(a)所示,當按鍵穩(wěn)定按下去時,檢測Z點為低電平,當按鍵抬起時,檢測Z點為高電平。但是在按鍵實際按下到抬起的過程中,檢測Z點電位會出現(xiàn)前沿和后沿的抖動。抖動時間一般為5 ms~10 ms。抖動的原因是按鍵是機械觸點的開關,存在彈性作用。因為有抖動的存在,會導致控制器多次誤讀,認為按鍵多次按下,進而多次進入相應的子程序去執(zhí)行,所以對于彈簧觸點的機械開關,必須進行消抖處理。
圖1 單個按鍵示意圖
常用的消抖的方法有RS觸發(fā)器消抖[2]、軟件消抖和基于有限狀態(tài)機消抖[3,4]。本文單獨按鍵的消抖采用基于有限狀態(tài)機的方法。采用有限狀態(tài)機設計的系統(tǒng)具有高速、高穩(wěn)定性的特點。有限狀態(tài)機分為Mealy型狀態(tài)機和Moore型狀態(tài)機。Mealy型狀態(tài)機屬于同步輸出狀態(tài)機,Moore型狀態(tài)機屬于異步輸出狀態(tài)機,Moore型狀態(tài)機的輸出只和當前狀態(tài)有關系。本設計采用單進程Moore型狀態(tài)機,組合邏輯和時序邏輯在同一個進程中,可以避免輸出時毛刺的產(chǎn)生。
根據(jù)按鍵從按下到抬起的實際情況,如圖1(b)所示,存在5個狀態(tài)。S0:按鍵沒有按下時的穩(wěn)定的狀態(tài);S1:按鍵被按下的一瞬間的狀態(tài);S2:按鍵被按下抖動時的狀態(tài);S3:按鍵穩(wěn)定按下時的狀態(tài);S4:按鍵松開一瞬間的狀態(tài);S5:按鍵松開抖動時的狀態(tài)。圖2為單獨按鍵的狀態(tài)轉(zhuǎn)換圖。rst為復位信號,高電平復位,clk為時鐘信號,data為輸入信號也就是圖1(a)Z點的信號,q為輸出信號,鍵穩(wěn)定按下為低電平。
圖2 單獨按鍵狀態(tài)轉(zhuǎn)換圖
圖3是模擬仿真單個按鍵從按下到抬起的過程。當rst為高電平時,F(xiàn)PGA復位,這時的狀態(tài)為S0,在第一個clk時鐘脈沖的上升沿輸入為低電平,輸出q為高電平,并且狀態(tài)為S1;在第2個clk時鐘脈沖的上升沿輸入為高電平,輸出q為高電平,并且狀態(tài)為S2,表明在抖動過程中;在第3個clk時鐘脈沖的上升沿輸入為低電平,輸出q為高電平,并且狀態(tài)為S1;在第4個clk時鐘脈沖的上升沿輸入為低電平,狀態(tài)為S3,表明按鍵穩(wěn)定按下,但是輸出q為高電平,這是由于是Moore型狀態(tài)機,輸出滯后一個clk脈沖,輸出q在下一個clk時鐘脈沖的上升沿才會變成低電平;在第5個clk時鐘脈沖處是模擬仿真按鍵抬起時的抖動。采用單進程Moore型狀態(tài)機可以有效避免毛刺出現(xiàn)。從圖3看出單個按鍵的仿真波形結(jié)果良好。
圖3 單個按鍵仿真波形
對于獨立鍵盤的設計可以利用單獨按鍵的設計結(jié)果,把單個按鍵當成一個組件在獨立按鍵中使用。利用元件例化語句設計頂層設計實體。 witdth表示獨立按鍵的個數(shù),根據(jù)實際使用中鍵的個數(shù),在程序中給witdth賦相應的初值,元件例化語句[5]如下。圖4為獨立鍵盤的設計實體。
aa: for i in 0 to width-1 generate
bb: button3 port map(clk=>clk,rst=>rst,data=>data(i),q=>q(i));
圖4 獨立鍵盤實體
對于按鍵數(shù)量較多的電子系統(tǒng),鍵盤的設計多采用矩陣鍵盤,可以節(jié)省I/O口數(shù)量。4*4鍵盤往往作為標準矩陣鍵盤,所以本文以4*4鍵盤為例介紹矩陣鍵盤的設計。對于矩陣鍵盤的設計重點在于消抖動和得到鍵值。
人在1s內(nèi)最多可以按下按鍵10次,每次按鍵的時間最短為100 ms。在這100 ms里按鍵的抖動時間通常在5ms~10ms之間(不同種類按鍵的抖動時間略有不同),按鍵穩(wěn)定按下的最短時間大約為50 ms。所以可以把鍵盤掃描周期設為40 ms,這樣只要有鍵穩(wěn)定按下(按下為低電平),低電平必然出現(xiàn)在時鐘脈沖的上升沿,通過檢測在時鐘脈沖的上升沿上是否有低電平就知道有沒有鍵按下。如果出現(xiàn)低電平,表明有鍵按下,如果出現(xiàn)高電平表明沒有鍵按下。但是如果按鍵的抖動正好出現(xiàn)在時鐘信號的上升沿處,雖然是小概率事件, FPGA也會認為按鍵已穩(wěn)定按下一次,造成系統(tǒng)誤操作一次??梢酝ㄟ^延時檢測[7]的方法解決這一問題。在時鐘脈沖的上升沿處檢測到輸入為低電平,有可能是抖動過程,所以延時10 ms后再檢測一次,如果還是低電平表明有鍵按下,如果是高電平表明是抖動過程。具體實現(xiàn)方法為:如果所用FPGA的頻率為50 MHz,經(jīng)過分頻[8]后,可降至1 KHz記為clk,周期為1 ms, 在clk的上升沿處檢測是否有低電平出現(xiàn),如果有,開始計數(shù) ,若低電平持續(xù)的時間小于10個clkz周期,認為是按鍵的抖動,輸出高電平。否則認為是有鍵按下,輸出低電平。
圖5 矩陣鍵盤消抖波形圖
從圖5可以看出,當輸入高電平時,輸出為高電平,當輸入為低電平,并且持續(xù)10個clk周期時才輸出低電平;這里可以根據(jù)不同按鍵抖動時間長短的不同更改程序中計數(shù)初值;如果輸入的低電平持續(xù)時間小于10 ms,輸出為高電平,認為是抖動狀態(tài)。從圖5看出,輸出有毛刺,但是毛刺出現(xiàn)在時鐘脈沖的上升沿后,并結(jié)束于下降沿之前,不影響后續(xù)對輸出結(jié)果output的使用。在矩陣鍵盤的去抖動設計中通過元件例化語句把以上結(jié)果放入4*4矩陣電路設計中。
以4*4鍵盤為例,如圖6所示,鍵盤的4條列線(輸入)連FPGA的4根I/O線并接上拉電阻后接正電源,4條行線(輸出)直接連FPGA的I/O線。FPGA逐行掃描[9],掃描碼(KY4、KY5、KY6、KY7)依次為0111,1011,1101,1110。如果當前掃描碼為0111,表示正在掃描第一行,如果列線KY3、KY2、KY1、KY0為1011,表示鍵值是2的鍵按下。如果列線KY3、KY2、KY1、KY0為1111,表示沒有鍵按下。
圖6 4*4鍵盤電路
圖7 矩陣鍵盤仿真波形圖
clk_1khz為頻率為1 kHz的時鐘信號,是消抖時使用的時鐘信號。 clk_saomiao為頻率25 Hz的時鐘信號,是掃描時鐘周期信號。這兩個頻率的信號都可以通過分頻得到。keyout為行線輸出, keyout 在每個掃描周期依次輸出7(0111)、B(1011)、D(1101)、E(1110)。keyin為列線輸入,keyin為F時表示無鍵按下,為7(0111)時,表示第一列有鍵按下。當掃描碼為D,同時輸入信號為7時,這個時候的鍵值為11,根據(jù)程序,掃描碼在掃描時鐘周期的上升沿出現(xiàn),鍵值在掃描時鐘周期的下降沿出現(xiàn)。仿真結(jié)果正確。
電子系統(tǒng)中采用FPGA控制鍵盤實時性高并可以有效節(jié)省CPU的資源,優(yōu)化電路設計。本文重點對于不同鍵盤采用不同設計方法,針對性強,對于單個按鍵和獨立鍵盤采用有限狀態(tài)機的方法消抖,采用單進程Moore型有限狀態(tài)機可避免輸出產(chǎn)生毛刺;對于矩陣鍵盤采用延時消抖的方法,對于不同的按鍵抖動時間不同,可以通過修改程序中的計數(shù)次數(shù)改變延時時間。這兩種方法在實際使用中誤差最小。兩種設計結(jié)果均可作為子模塊的形式,供上一級程序使用,可移植性好。