摘 要:為了有效防止機械式鍵盤按鍵抖動帶來的數據錯誤,這里在Quartus Ⅱ開發環境下,采用VHDL語言設計了一種能夠將機械式4×4矩陣鍵盤的按鍵值依次顯示到8個7段數碼管上的矩陣鍵盤及顯示電路。仿真結果表明,所設計的矩陣鍵盤及顯示電路成功地實現了按鍵防抖和按鍵數據的準確顯示。以ACEX1K系列EP1K30QC208芯片為硬件環境,驗證了各項設計功能的正確性。關鍵詞:VHDL; 鍵盤; 按鍵防抖; 數碼管
中圖分類號:TN710-34; TP332.1+2 文獻標識碼:A 文章編號:1004-373X(2010)16-0014-03
Design of the Matrix Keyboard and Display Circuit Based on VHDL
ZHANG Xi-feng,QU Bao-peng
(Electronics Engineer Department of Shaanxi Institute of Technology, Xi’an 710300,China)
Abstract:The application of the FPGA/CPLD becomes more and more extensive in the design of digital system, and it has affected our life deeply. The data inputted by matrix keyboard and displayed by digital tube, the design is applied widely in electron equipments. In order to avoid the data mistakes resulted by the key-press shake, a matrix keyboard and display circuit which can display the key-press input data produced by 4×4 matrix keyboard in turn with 8 word 7-seg display was designed with the language of VHDL in the environment of Quartus Ⅱ. The simulation results indicate that the matrix keyboard and display circuit designed in this paper realized the key-press anti-shake and exact display. Finally, validity of whole designed functions was validated with the EP1K30QC208 chip of ACEX1K series.Keywords:VHDL; keyboard; anti-shake; digital tube
收稿日期:2010-03-12
FPGA/CPLD在數字系統設計中的廣泛應用,影響到了生產生活的各個方面[1-4]。在FPGA/CPLD的設計開發中,VHDL語言作為一種主流的硬件描述語言,具有設計效率高,可靠性好,易讀易懂等諸多優點[3,5-6]。作為一種功能強大的FPGA/CPLD數字系統開發環境,Altera公司推出的Quartus Ⅱ,為設計者提供了一種與結構無關的設計環境,使設計者能方便地進行設計輸入、快速處理和器件編程,為使用VHDL語言進行FPGA/CPLD設計提供了極大的便利[7]。
矩陣鍵盤作為一種常用的數據輸入設備,在各種電子設備上有著廣泛的應用,通過7段數碼管將按鍵數值進行顯示也是一種常用的數據顯示方式。在設計機械式矩陣鍵盤控制電路時,按鍵防抖和按鍵數據的譯碼顯示是兩個重要方面。
本文在Quartus Ⅱ開發環境下,采用VHDL語言設計了一種按鍵防抖并能連續記錄并顯示8次按鍵數值的矩陣鍵盤及顯示電路。
1 矩陣鍵盤及顯示電路設計思路
矩陣鍵盤及顯示電路能夠將機械式4×4矩陣鍵盤的按鍵值依次顯示到8個7段數碼管上,每次新的按鍵值顯示在最右端的第0號數碼管上,原有第0~6號數碼管顯示的數值整體左移到第1~7號數碼管上顯示,見圖1。總體而言,矩陣鍵盤及顯示電路的設計可分為4個部分:
(1) 矩陣鍵盤的行及列的掃描控制和譯碼。該設計所使用的鍵盤是通過將列掃描信號作為輸入信號,控制行掃描信號輸出,然后根據行及列的掃描結果進行譯碼。
(2) 機械式按鍵的防抖設計。由于機械式按鍵在按下和彈起的過程中均有5~10 ms的信號抖動時間,在信號抖動時間內無法有效判斷按鍵值,因此按鍵的防抖設計是非常關鍵的,也是該設計的一個重點。
(3) 按鍵數值的移位寄存。由于該設計需要在8個數碼管上依次顯示前后共8次按鍵的數值,因此對已有數據的存儲和調用也是該設計的重點所在。
(4) 數碼管的掃描和譯碼顯示。由于該設計使用了8個數碼管,因此需要對每個數碼管進行掃描控制,并根據按鍵值對每個數碼管進行7段數碼管的譯碼顯示。
2 矩陣鍵盤及顯示電路的實現
本文所設計的矩陣鍵盤及顯示電路的電路符號如圖2所示。其中,clk為時鐘信號輸入端(頻率可為1 024~32 768 Hz);start為清零控制端;kbrow為列掃描信號輸入端;kbcol為行掃描信號輸出端;scan為數碼管地址掃描信號輸出端;seg7為數碼管顯示信號輸出端。
圖1 矩陣鍵盤及顯示電路原理圖
圖2 矩陣鍵盤及顯示電路的電路符號
限于篇幅,在此不詳述所設計矩陣鍵盤及顯示電路的全部VHDL代碼,只對部分重要代碼段落進行詳細說明。
如圖1所示,全部代碼由7個進程(process)組成。其中,進程P1和P2用于對列掃描輸入信號kbrow進行讀取,并通過或非運算產生行掃描使能控制信號en對行掃描輸出信號kbcol進行控制,并生成一個與kbcol對應的狀態信號state。若沒有按鍵被按下(即kbrow=“0000”),則en=‘1’,行掃描輸出信號kbcol不斷循環掃描各行;若有按鍵被按下,en=‘0’,則行掃描停止,并鎖存當前kbcol的值。進程P1和P2的代碼如下:
P1:process(clk,kbrow)
begin
en<=not (kbrow(0) or kbrow(1) or kbrow(2)
or kbrow(3));
if(clk′event and clk=′1′) then
if en=′1′ then count<=count+1;
end if;
end if;
end process;
P2:process(clk)
begin
if clk′event and clk=′1′ then
case count is
when \"00\"=>kbcol<=\"0001\";
state<=\"00\";
when \"01\"=>kbcol<=\"0010\";
state<=\"01\";
when \"10\"=>kbcol<=\"0100\";
state<=\"10\";
when \"11\"=>kbcol<=\"1000\";
state<=\"11\";
when others=>kbcol<=\"1111\";
end case;
end if;
end process;
進程P3使用“case…when”語句,根據狀態信號state的值(即kbcol的值)和列掃描輸入信號kbrow的值進行按鍵值譯碼,生成一個4位二進制按鍵數值信號dat,用以記錄當前按鍵值。例如,當kbcol=“0010”,kbrow=“0001”時,“B”鍵按下,dat=“1011”。進程P3的代碼在此不再贅述。
進程P4和P5用于按鍵的防抖和按鍵值的移位寄存。通過將行掃描使能控制信號en不斷賦給一個8位二進制變量reg8,再將reg8賦給8位二進制信號key,實現對按鍵狀態的記錄,然后通過對key的各位數值進行與運算,生成防抖控制信號fnq。一旦有按鍵按下,en=‘0’,則即便是按鍵在抖動,key中至少也有1位數值為‘0’,從而使fnq=‘0’。只有當按鍵再次彈起,并且在連續8個時鐘周期內不再有新的按鍵按下,key的數值全為‘1’,則fnq=‘1’,fnq產生一個上升沿,從而觸發按鍵數值信號dat進入數值寄存信號temp(32位二進制數)的第0~3位,并將temp原來的第0~27位左移到第4~31位,實現1次按鍵按下的數值存儲。進程P4和P5的代碼如下:
P4:process(clk)
variable reg8:std_logic_vector(7 downto 0);
BEGIN
if(clk′event and clk=′1′) then
reg8:=reg8(6 downto 0)en;
end if;
key<=reg8;
end process;
fnq<=key(0) and key(1) and key(2) and key(3)
and key(4) and key(5) and key(6) and key(7);
P5:process(fnq,start)
BEGIN
IF start=′0′ then
temp<=\"00000000000000000000000000000000\";
elsif(fnq′event and fnq=′1′) then
temp<=temp(27 downto 0)dat;
end if;
end process;
進程P6用于將數值寄存信號temp的32位二進制數分配給8個數碼管,從而生成數碼管地址掃描輸出scan,以及數碼管數值信號data(4位2進制數)。進程P6代碼如下:
P6:process(clk,temp,cnt8)
begin
if clk′event and clk=′1′ then cnt8<=cnt8+1;
end if;
case cnt8 is
when 0=>scan<=\"000\";data<=temp(3 downto 0);
when 1=>scan<=\"001\";data<=temp(7 downto 4);
when 2=>scan<=\"010\";data<=temp(11 downto 8);
when 3=>scan<=\"011\";data<=temp(15 downto 12);
when 4=>scan<=\"100\";data<=temp(19 downto 16);
when 5=>scan<=\"101\";data<=temp(23 downto 20);
when 6=>scan<=\"110\";data<=temp(27 downto 24);
when 7=>scan<=\"111\";data<=temp(31 downto 28);
when others=>1;
end case;
end process;
進程P7用于將數碼管數值信號data譯碼成為7段數碼管顯示輸出seg7,進程P7的代碼在此不再贅述。
值得注意的是,本文設計的矩陣鍵盤及顯示電路在按鍵防抖和數據寄存部分設計得更加簡潔可靠,實現的功能更加強大,其具有如下特點:
(1) 為了實現按鍵防抖,本文采用對按鍵狀態連續記錄的方式,即在按鍵彈起后連續8個時鐘周期均無按鍵信號才確認1次按鍵有效,從而避免了按鍵按下和彈起過程中的數據抖動,相比于使用計數器從按鍵按下開始計數,直到5~10 ms后才讓按鍵有效的防抖方式[8-9],這里設計的按鍵防抖更加可靠,且可有效避免長時間按下按鍵產生的重復數據輸出,使每次按鍵無論時間長短均可且只會產生1次數據輸出。另外,當電路采用32 768 Hz以上的時鐘作為系統時鐘時,可以通過增加按鍵狀態連續記錄的時鐘周期數,實現可靠的防抖。
(2) 該設計采用一個32位一維數組temp作為數據寄存器,使用移位寄存方式,實現了對連續8次按鍵數據的存儲和調用,從而可以在8個數碼管上連續顯示數據。
3 仿真結果分析
本文設計的矩陣鍵盤及顯示電路在Quartus Ⅱ開發環境下進行了仿真驗證。其中,按鍵防抖功能的仿真波形如圖3所示。仿真結果分析如下:
(1) clk為時鐘輸入信號,作為系統時鐘;
(2) start為清零控制端,當其為高電平時,按鍵有效;
(3) kbrow為列掃輸入信號,kbcol為行掃輸出信號,圖3中對kbrow[1]的輸入波形進行設置,模擬了“A”鍵按下和彈起的過程;
(4) fnq為防抖控制信號,scan為數碼管地址掃描輸出,seg7為數碼管顯示輸出。由圖3可知,只有在按鍵彈起后,才有數據輸出,從而實現防抖功能。
圖3 矩陣鍵盤及顯示電路按鍵防抖仿真波形
該設計的其他功能也可以通過仿真驗證,不再贅述。
4 結 語
本文設計矩陣鍵盤及顯示電路在Quartus Ⅱ開發環境下進行仿真驗證后,下載到湖北眾友科技實業股份有限公司的ZY11EDA13BE實驗箱中進行了硬件驗證。該實驗箱使用ACEX1K系列EP1K30QC208芯片作為核心芯片。實驗證明,當電路的系統時鐘頻率在1 024~32 768 Hz范圍內時,電路均可穩定運行,按鍵防抖可靠、功能完整。當系統時鐘頻率低于1 024 Hz時,需要減少防抖記錄時鐘周期的個數,否則容易錯過短時按鍵動作;當系統時鐘頻率高于32 768 Hz時,需要增加防抖記錄時鐘周期的個數,以確保可靠的按鍵防抖。
參考文獻
[1]康華光.電子技術基礎(數字部分)[M].北京:高等教育出版社,2004.
[2]馬或,王丹利,王麗英.CPLD/FPGA可編程邏輯器件實用教程[M].北京:機械工業出版社,2006.
[3]侯伯亨,顧新.VHDL硬件描述語言與數字邏輯電路設計[M].西安:西安電子科技大學出版社,2000.
[4]李國麗,朱維勇,欒銘.EDA與數字系統設計[M].北京:機械工業出版社,2005.
[5]盧毅,賴杰.VHDL與數字電路設計[M].北京:科學出版社,2001.
[6]李志,田永清,朱仲英.VHDL的設計特點與應用研究[J].微型電腦應用,2002(10):5-8.
[7]周潤景,圖雅,張麗敏.基于Quartus Ⅱ的FPGA/CPLD數字系統設計實例[M].北京:電子工業出版社,2007.
[8]魯傳明,甕嘉民.基于VHDL的防抖型矩陣式鍵盤設計[J].河南工程學院學報,2009(3):58-62.
[9]樊國梁,張曉燕.基于VHDL的鍵盤掃描及顯示電路設計[J].電子世界,2005(2):25-26.