摘要:在MAX+PlusⅡ開發環境下,采用現場可編程門陣列設計了一個簡單的鍵盤掃描電路,解決了按鍵顫抖帶來的信號混亂問題。此次設計為了減少整體設計中的問題,將整個電路分成各個分模塊,再使用VHDL硬件描述語言進行程序設計并生成模塊,最后將各個分模塊采用圖形編輯最終實現設計要求。
關鍵詞:現場可編程門陣列 鍵盤掃描 顫抖 MAX+PlusⅡ
1 概述
現場可編程門陣列即FPGA(Field Programmable Gate Array),它是在可編程器件的基礎上進一步發展的產物。隨著EDA技術的發展,采用現場可編程門陣列的掃描鍵盤因其結構簡單,能有效防止按鍵顫抖帶來的信號混亂等優點在電子信號輸入電路的應用中得到廣泛使用。本文通過采用FPGA圖形編輯實現一個4*3的鍵盤掃描電路,來說明現場可編程門陣列在此類電路的設計和應用中的優點。筆者使用的軟件環境是MAX+PlusⅡ,將整個電路分成各個分模塊,再使用VHDL硬件描述語言進行程序設計并生成模塊,最后將各個分模塊采用圖形編輯最終實現設計要求。
2 基于FPGA的4*3式鍵盤掃描程序的設計
2.1 顫抖消除電路
■
圖1
因為按鍵大多數是式開關結構,在開關切換的瞬間會在接觸點出現來回顫抖的現象,對于激活關閉一般電器如開關日光燈、電視等一般電子用品,并不會有何影響,但對于靈敏度較高的電路,這種現象卻可能造成錯誤動作影響到正確性。顫抖現象產生的原因可從圖1說明,雖然是按下按鍵一次然后放掉,然而實際產生的按鍵信號卻不只跳動一次,經過取樣信號的檢查后,將會造成誤判,以為鍵盤按下了兩次。
如果調整抽樣頻率(如圖2),可以發現顫抖現象獲得了改善。
■
圖2
程序如下:
ENTITY debouncing IS
PORT(d_in,clk :IN STD_LOGIC;d_out:OUT STD_
LOGIC);
END debouncing ;
ARCHITECTURE a OF debouncing IS
signal vcc,inv_d:std_logic;
signal d1,d0:std_logic;
signal q0,q1:std_logic;
BEGIN
vcc<='1';
inv_d <=not d_in;
dff1:dff PORT MAP(d=>vcc,q=>q0 ,clk=>clk,clrn=>inv_d,prn=>vcc);
dff2:dff PORT MAP(d=>vcc,q=>q1, clk=>clk,clrn=>q0,prn=>vcc);
process(clk)
begin
if clk'event and clk='1'then
d0<=not q1;
d1<=d0;
end if;
end process;
d_out <= not(d1 and not d0);
END a;
編譯仿真如圖3:
由仿真波形圖可看出,原本的顫抖現象經過顫抖消除電路處理后已經消除,不會再產生混亂的信號。
2.2 鍵盤掃描:鍵盤上的每一個按鍵都是開關電路,當某個按鍵按下時,該按鍵的觸點的狀態為邏輯0,反之,未被按下時的狀態為邏輯1。掃描信號由KA3~KA0進入鍵盤,變化的邏輯狀態順序依次為1110→1101→1011→0111→1110。每次掃描一排,依序地循環。
程序如下:
PORT(CLK:IN STD_LOGIC;
CNT_OUT:OUT STD_LOGIC_VECTOR(1 downto 0);
CLK_SCAN :OUT STD_LOGIC_VECTOR(3 downto 0));
END scan;
ARCHITECTURE a OF scan IS
SIGNAL Q: STD_LOGIC_VECTOR (19 downto 0);
SIGNAL CNT,S : STD_LOGIC_VECTOR (1 downto 0);
SIGNAL SEL: STD_LOGIC_VECTOR (3 downto 0);
BEGIN
process(clk)
begin
IF CLK'Event AND CLK='1'then
Q<=Q+1;
END IF;
END PROCESS;
CNT<=Q(4 DOWNTO 3);
SEL <=\"1110\" WHEN S=0 ELSE
\"1101\" WHEN S=1 ELSE
\"1011\" WHEN S=2 ELSE
\"0111\"
CONNECTION
S<=CNT;
CNT_OUT<=CNT;
CLK_SCAN<=SEL;
END a;
說明:當鍵盤掃描所需的信號從計數器中取出后,將鍵盤掃描信號利用WHEN…ELSE語句將計數結果進行轉換,依序1110→1101→1011→0111→1110…循環下去。因為WHEN…ELSE語句為并行同時性語句,所以必須放在process指令的外部。
編譯仿真結果:(圖4)
仿真圖中的CLK_SCAN(3 DOWNTO 0)是電路所產生的鍵盤掃描序列(1110→1101→1011→0111→1110….,即KA3~KA0)。由仿真圖看出,掃描序列與鍵盤掃描信號一一對應。實現了對鍵盤的掃描。
2.3 鍵盤譯碼。根據上述鍵盤的按鍵特點,按鍵可分為數字按鍵和文字按鍵,沒一個按鍵都可能負責不同的功能。數字按鍵主要是用來輸入數字,鍵盤所產生的輸出(KB2~KB0)無法直接拿來使用;另外不同的數字按鍵也擔負不同的功能,因此必須由鍵盤譯碼電路來規劃每個按鍵的輸出形式,以便執行相應的動作。設計鍵盤譯碼電路程序如下:
PORT(CLK:IN STD_LOGIC;
CLK_KEYBOARD:IN STD_LOGIC_VECTOR(1 downto 0);
C:IN STD_LOGIC_VECTOR(2 downto 0);
OUT_NUMB :OUT STD_LOGIC_VECTOR(3 downto 0));
END key_decoder;
BEGIN
PROCESS(clk)
begin
Z<=CLK_KEYBOARDC;
IF CLK'EVENT AND CLK='1'THEN
case Z is
when\"11101\"=>N<=\"0000\" ;-0
when\"00011\"=>N<=\"0001\" ;-1
when\"00101\"=>N<=\"0010\" ;-2
when\"00110\"=>N<=\"0011\" ;-3
when\"01011\"=>N<=\"0100\" ;-4
when\"01101\"=>N<=\"0101\" ;-5
when\"01110\"=>N<=\"0110\" ;-6
when\"10011\"=>N<=\"0111\" ;-7
when\"10101\"=>N<=\"1000\" ;-8
when\"10110\"=>N<=\"1001\" ;-9
when\"11110\"=>N<=\"1010\" ;-#
when\"11011\"=>N<=\"1011\";-*
when others=>N<=\"1111\";
end case;
END IF;
END PROCESS;
OUT_NUMB<=N;
END a;
編譯仿真:(圖5)
說明:從仿真圖的結果可以看到,00 011代表按下的按鍵為“1”。01 100為“15” 10 101為“8”。鍵盤譯碼程序能正確地執行各項動作,未出現顫抖和錯誤的按鍵情況。
3 總結
通過測試,根據程序所設定的列掃描信號和對應的鍵盤響應信號來確定按鍵的位置。通過本文的研究表明,使用現場可編程門陣列實現了鍵盤掃描電路的設計,減少了復雜的硬件電路的設計,對于復雜鍵盤的掃描程序的設計帶來便利和可行性。
參考文獻:
[1]番松,黃繼業.EDA技術與VHDL[M].
北京:清華大學出版社,2005.7.
[2]袁文波.FPGA應用開發從實踐到提高[M].中國電力出版社,2007.
[3]鄭采君.基于CPLD的矩陣鍵盤掃描模塊設計[J].電子設計工程,2010(10).
作者簡介:
曹磊(1985-),男,陜西漢中人,助教,研究方向:電子及智能控制方向。