邢自茹 史明健
摘 要:在介紹FPGA開(kāi)發(fā)中按鍵消抖電路和單脈沖發(fā)生器電路原理的基礎(chǔ)上,設(shè)計(jì)實(shí)現(xiàn)了鍵控單脈沖發(fā)生器,利用計(jì)數(shù)器解決了按鍵高頻消抖問(wèn)題,并通過(guò)按鍵產(chǎn)生與時(shí)鐘脈沖完全相同的單脈沖。該單脈沖鍵控發(fā)生器可獨(dú)立應(yīng)用于其他FPGA電路設(shè)計(jì)中。在Quartus環(huán)境下給出Verilog HDL語(yǔ)言的行為及描述,并進(jìn)行仿真實(shí)驗(yàn),結(jié)果顯示該電路合理可行。
關(guān)鍵詞:單脈沖發(fā)生器;按鍵消抖;FPGA;Verilog HDL
中圖分類號(hào):TN782 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):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開(kāi)發(fā)中常用到單脈沖發(fā)生器。一些文章介紹過(guò)產(chǎn)生單脈沖的電路,產(chǎn)生的單脈沖脈寬和相位都不能與時(shí)鐘同步,只能用在要求不嚴(yán)格的場(chǎng)合。筆者目前從事的課題中需要一個(gè)與時(shí)鐘周期等寬,相位與時(shí)鐘周期相同的鍵控單脈沖發(fā)生器。鍵控單脈沖發(fā)生器需要按鍵產(chǎn)生單脈沖,但大多數(shù)帶有FPGA芯片的開(kāi)發(fā)板提供的是高頻時(shí)鐘脈沖,按鍵時(shí)會(huì)存在抖動(dòng)問(wèn)題。為此筆者專門設(shè)計(jì)了按鍵消抖電路消除抖動(dòng),為產(chǎn)生單脈沖提供穩(wěn)定的按鍵信號(hào)。
1 按鍵消抖電路原理[1]
為了使按鍵消抖電路模塊簡(jiǎn)潔,移植性好,在此用計(jì)數(shù)器的方式實(shí)現(xiàn)按鍵消抖的功能。
計(jì)數(shù)器模值n根據(jù)抖動(dòng)信號(hào)的脈沖寬度和采樣脈沖信號(hào)CLK的周期大小決定。計(jì)數(shù)器模值n=延時(shí)/脈沖信號(hào)采樣周期。一般按鍵抖動(dòng)時(shí)間為5~10 ms,甚至更長(zhǎng)。筆者用的開(kāi)發(fā)板提供的系統(tǒng)時(shí)鐘為24 MHz,按公式計(jì)算,當(dāng)計(jì)數(shù)器模值取20位,計(jì)數(shù)到219即h8_0000時(shí),大約延時(shí)22 ms。計(jì)數(shù)期間認(rèn)為是按鍵的抖動(dòng)信號(hào),不做采樣;計(jì)數(shù)器停止計(jì)數(shù),認(rèn)為采樣信號(hào)為穩(wěn)定按鍵信號(hào)。這樣就可以把按鍵時(shí)間小于22 ms的抖動(dòng)信號(hào)濾掉。
引入一個(gè)采樣脈沖信號(hào)CLK,并輸入按鍵信號(hào)KEY。KEY輸入低電平,計(jì)數(shù)器開(kāi)始做加法計(jì)數(shù),當(dāng)計(jì)數(shù)到h8_0000即計(jì)數(shù)器中最高位Q19為1,計(jì)數(shù)器停止計(jì)數(shù),輸出Q19,作為按鍵的穩(wěn)定輸出,計(jì)數(shù)期間Q19輸出為0;KEY輸入高電平,計(jì)數(shù)器清零,Q19輸出為0。所以該電路需按鍵22 ms才會(huì)得到有效信號(hào)。
2 鍵控單脈沖發(fā)生器電路原理[2,3]
鍵控單脈沖發(fā)生器 [4]利用上述電路解決按鍵消抖問(wèn)題,得到穩(wěn)定的信號(hào)。用兩個(gè)D觸發(fā)器[5]和一個(gè)與門產(chǎn)生單脈沖,如圖1所示。
圖1 鍵控單脈沖發(fā)生器電路圖
D觸發(fā)器U2A收到穩(wěn)定信號(hào)D1=1后被觸發(fā)。觸發(fā)器U2A中的Q1端得到與CLK同步的正向脈沖。輸出Q1到D觸發(fā)器U3A,得到比Q1延遲一個(gè)時(shí)鐘周期的的正向脈沖,將Q2端輸出取反得到一個(gè)負(fù)向脈沖。Q1與Qn2的輸出作為一個(gè)與門的輸入,會(huì)輸出一個(gè)脈寬是原時(shí)鐘周期2倍的單脈沖。
為了使得出的單脈沖脈寬與時(shí)鐘周期相等,相位與時(shí)鐘周期相同,對(duì)圖1中電路設(shè)計(jì)做了改進(jìn),如圖2所示[6]。
圖2 相位調(diào)整后單脈沖發(fā)生器電路圖
圖2中時(shí)鐘送入D觸發(fā)器前加了非門,使Q1端產(chǎn)生與n_CLK(CLK的反向脈沖信號(hào))同步的正向脈沖,與門輸出單脈沖與CLK差半個(gè)時(shí)鐘周期,作為D觸發(fā)器U4A的輸入D4,在CLK上升沿U4A被觸發(fā),使單脈沖脈寬與時(shí)鐘周期相同,實(shí)現(xiàn)了等脈寬。并延遲了半個(gè)時(shí)鐘周期使輸出脈沖與時(shí)鐘周期對(duì)應(yīng),實(shí)現(xiàn)了相位調(diào)整。整個(gè)單脈沖發(fā)生器的時(shí)序圖如圖3所示(圖3中的t1,t2是任意鍵按下與鍵抬起時(shí)刻)。
圖3 單脈沖發(fā)生器時(shí)序圖
3 基于FPGA下的按鍵消抖計(jì)數(shù)器和單脈沖發(fā)生器的Verilog HDL語(yǔ)言描述[7,8]
圖1中的按鍵消抖計(jì)數(shù)器電路,其進(jìn)行描述的Verilog HDL語(yǔ)言[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
代碼中的復(fù)位n_rst和按鍵n_Kd都是低電平有效。鍵控單脈沖發(fā)生器的Verilog HDL語(yǔ)言代碼如下:
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觸發(fā)器DFF,實(shí)現(xiàn)這個(gè)模塊的代碼比較簡(jiǎn)單,此處從略。
4 結(jié) 語(yǔ)
該文中的設(shè)計(jì),實(shí)現(xiàn)了鍵控單脈沖發(fā)生器,產(chǎn)生脈寬等于時(shí)鐘脈沖,輸出脈沖與時(shí)鐘周期對(duì)應(yīng)的單脈沖,并解決了按鍵消抖問(wèn)題,可以應(yīng)用到各種需要產(chǎn)生單脈沖的FPGA電路設(shè)計(jì)中。
按鍵消抖電路可獨(dú)立地應(yīng)用于其他FPGA電路設(shè)計(jì)中。本文中設(shè)計(jì)的20 b計(jì)數(shù)器是根據(jù)筆者課題需要而定。其他設(shè)計(jì)中可以根據(jù)按鍵抖動(dòng)時(shí)間可利用公式計(jì)算出計(jì)數(shù)器模值設(shè)計(jì)計(jì)數(shù)器。
參考文獻(xiàn)
[1]實(shí)用可控的按鍵抖動(dòng)消除電路[EB/OL].http://www.ic37.com.
[2]余孟嘗.數(shù)字電子技術(shù)基礎(chǔ)[M].北京:高等教育出版社,1999.
[3]羅斯.數(shù)字系統(tǒng)設(shè)計(jì)與VHDL[M].金明錄,劉倩,譯.北京:電子工業(yè)出版社,2008.
[4]單脈沖發(fā)生器電路[EB/OL].http://www.dzcpkf.com.
[5]李亞伯.數(shù)字電路與系統(tǒng) [M].北京:電子工業(yè)出版社,2001.
[6]王兢.數(shù)字電路與系統(tǒng)[M].北京:電子工業(yè)出版社,2007.
[7]夏宇聞.Verilog數(shù)字系統(tǒng)設(shè)計(jì)教程[M].北京:北京航空航天大學(xué)出版社,1996.
[8]楊恒.FPGA/VHDL快速工程實(shí)踐入門與提高[M].北京:北京航空航天大學(xué)出版社,2003.
[9]常曉明,李媛媛.Verilog-HDL工程實(shí)踐入門[M].北京:北京航空航天大學(xué)出版社,2005.
[10]王誠(chéng),吳繼華.Altera FPGA/CPLD設(shè)計(jì)[M].北京:人民郵電出版社,2005.
作者簡(jiǎn)介 邢自茹 女,1982年出生,在讀碩士研究生。主要研究方向?yàn)橛?jì)算機(jī)應(yīng)用技術(shù)網(wǎng)絡(luò)與通訊。
史明健 男,1980年出生,在讀碩士研究生。主要研究方向?yàn)橛?jì)算機(jī)應(yīng)用技術(shù)。