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