邢自茹 史明健
摘 要:在介紹FPGA開發中按鍵消抖電路和單脈沖發生器電路原理的基礎上,設計實現了鍵控單脈沖發生器,利用計數器解決了按鍵高頻消抖問題,并通過按鍵產生與時鐘脈沖完全相同的單脈沖。該單脈沖鍵控發生器可獨立應用于其他FPGA電路設計中。在Quartus環境下給出Verilog HDL語言的行為及描述,并進行仿真實驗,結果顯示該電路合理可行。
關鍵詞:單脈沖發生器;按鍵消抖;FPGA;Verilog HDL
中圖分類號:TN782 文獻標識碼:A
文章編號:1004-373X(2009)21-171-02
Elimination Buffeting of Keystroke and Single Pulse Generator
Circuit in FPGA Development Process
XING Ziru,SHI Mingjian
(Inner Mongolia University of Technology,Huhhot,010051,China)
Abstract:The circuit principle of elimination buffeting of keystroke and a single pulse generator in FPGA development are introduced,and keying single pulse generator is achieved.It solves eliminating high-frequency buffeting problem by a counter and produces the single pulse which has the same pulse width and same phase with clock cycle.Keying a single pulse generator can be applied to other independent FPGA design.The behavior and description based on Verilog HDL language are given and it is simulated in Quartus software,the method is proved logical and feasible as a result.
Keywords:single pulse generator;elimination buffeting of keystroke;FPGA;Verilog HDL
FPGA開發中常用到單脈沖發生器。一些文章介紹過產生單脈沖的電路,產生的單脈沖脈寬和相位都不能與時鐘同步,只能用在要求不嚴格的場合。筆者目前從事的課題中需要一個與時鐘周期等寬,相位與時鐘周期相同的鍵控單脈沖發生器。鍵控單脈沖發生器需要按鍵產生單脈沖,但大多數帶有FPGA芯片的開發板提供的是高頻時鐘脈沖,按鍵時會存在抖動問題。為此筆者專門設計了按鍵消抖電路消除抖動,為產生單脈沖提供穩定的按鍵信號。
1 按鍵消抖電路原理[1]
為了使按鍵消抖電路模塊簡潔,移植性好,在此用計數器的方式實現按鍵消抖的功能。
計數器模值n根據抖動信號的脈沖寬度和采樣脈沖信號CLK的周期大小決定。計數器模值n=延時/脈沖信號采樣周期。一般按鍵抖動時間為5~10 ms,甚至更長。筆者用的開發板提供的系統時鐘為24 MHz,按公式計算,當計數器模值取20位,計數到219即h8_0000時,大約延時22 ms。計數期間認為是按鍵的抖動信號,不做采樣;計數器停止計數,認為采樣信號為穩定按鍵信號。這樣就可以把按鍵時間小于22 ms的抖動信號濾掉。
引入一個采樣脈沖信號CLK,并輸入按鍵信號KEY。KEY輸入低電平,計數器開始做加法計數,當計數到h8_0000即計數器中最高位Q19為1,計數器停止計數,輸出Q19,作為按鍵的穩定輸出,計數期間Q19輸出為0;KEY輸入高電平,計數器清零,Q19輸出為0。所以該電路需按鍵22 ms才會得到有效信號。
2 鍵控單脈沖發生器電路原理[2,3]
鍵控單脈沖發生器 [4]利用上述電路解決按鍵消抖問題,得到穩定的信號。用兩個D觸發器[5]和一個與門產生單脈沖,如圖1所示。
圖1 鍵控單脈沖發生器電路圖
D觸發器U2A收到穩定信號D1=1后被觸發。觸發器U2A中的Q1端得到與CLK同步的正向脈沖。輸出Q1到D觸發器U3A,得到比Q1延遲一個時鐘周期的的正向脈沖,將Q2端輸出取反得到一個負向脈沖。Q1與Qn2的輸出作為一個與門的輸入,會輸出一個脈寬是原時鐘周期2倍的單脈沖。
為了使得出的單脈沖脈寬與時鐘周期相等,相位與時鐘周期相同,對圖1中電路設計做了改進,如圖2所示[6]。
圖2 相位調整后單脈沖發生器電路圖
圖2中時鐘送入D觸發器前加了非門,使Q1端產生與n_CLK(CLK的反向脈沖信號)同步的正向脈沖,與門輸出單脈沖與CLK差半個時鐘周期,作為D觸發器U4A的輸入D4,在CLK上升沿U4A被觸發,使單脈沖脈寬與時鐘周期相同,實現了等脈寬。并延遲了半個時鐘周期使輸出脈沖與時鐘周期對應,實現了相位調整。整個單脈沖發生器的時序圖如圖3所示(圖3中的t1,t2是任意鍵按下與鍵抬起時刻)。
圖3 單脈沖發生器時序圖
3 基于FPGA下的按鍵消抖計數器和單脈沖發生器的Verilog HDL語言描述[7,8]
圖1中的按鍵消抖計數器電路,其進行描述的Verilog HDL語言[9]代碼如下:
module kb_debounce(clk,n_rst,n_Kd,Krdy);
input clk,n_rst,n_Kd;
output Krdy;
reg[19:0] Q;
assign Krdy = Q[19];
always @ (posedge clk or negedge n_rst)
begin
if(!n_rst) Q <= 0;
else if(n_Kd == 1′b1)Q <= 0;
else if(Q<20′h8_0000) Q <= (Q+1)% 21′h10_0000;
end
endmodule
代碼中的復位n_rst和按鍵n_Kd都是低電平有效。鍵控單脈沖發生器的Verilog HDL語言代碼如下:
module kb_click(clk,n_rst,n_Kd,click);
input clk,n_rst,n_Kd;
output click;
wire click,U1,U2,U3,U4;
kb_debounce(.clk(clk),.n_rst(n_rst),.n_Kd(n_Kd),.Krdy(U1));
DFF (.clk(~clk),.n_rst(n_rst),.D(U1),.Q(U2));
DFF(.clk(~clk),.n_rst(n_rst),.D(U2),.Q(U3));
assign U4=(U2 &~U3);
DFF(.clk(clk),.n_rst(n_rst),.D(U4),.Q(click));
Endmodule
代碼中還用到了D觸發器DFF,實現這個模塊的代碼比較簡單,此處從略。
4 結 語
該文中的設計,實現了鍵控單脈沖發生器,產生脈寬等于時鐘脈沖,輸出脈沖與時鐘周期對應的單脈沖,并解決了按鍵消抖問題,可以應用到各種需要產生單脈沖的FPGA電路設計中。
按鍵消抖電路可獨立地應用于其他FPGA電路設計中。本文中設計的20 b計數器是根據筆者課題需要而定。其他設計中可以根據按鍵抖動時間可利用公式計算出計數器模值設計計數器。
參考文獻
[1]實用可控的按鍵抖動消除電路[EB/OL].http://www.ic37.com.
[2]余孟嘗.數字電子技術基礎[M].北京:高等教育出版社,1999.
[3]羅斯.數字系統設計與VHDL[M].金明錄,劉倩,譯.北京:電子工業出版社,2008.
[4]單脈沖發生器電路[EB/OL].http://www.dzcpkf.com.
[5]李亞伯.數字電路與系統 [M].北京:電子工業出版社,2001.
[6]王兢.數字電路與系統[M].北京:電子工業出版社,2007.
[7]夏宇聞.Verilog數字系統設計教程[M].北京:北京航空航天大學出版社,1996.
[8]楊恒.FPGA/VHDL快速工程實踐入門與提高[M].北京:北京航空航天大學出版社,2003.
[9]常曉明,李媛媛.Verilog-HDL工程實踐入門[M].北京:北京航空航天大學出版社,2005.
[10]王誠,吳繼華.Altera FPGA/CPLD設計[M].北京:人民郵電出版社,2005.
作者簡介 邢自茹 女,1982年出生,在讀碩士研究生。主要研究方向為計算機應用技術網絡與通訊。
史明健 男,1980年出生,在讀碩士研究生。主要研究方向為計算機應用技術。