FPGA开发中按键消抖与单脉冲发生器电路

时间:2022-10-17 04:37:24

FPGA开发中按键消抖与单脉冲发生器电路

摘 要:在介绍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

else if(n_Kd == 1′b1)Q

else if(Q

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]..

[2]余孟尝.数字电子技术基础[M].北京:高等教育出版社,1999.

[3]\罗斯.数字系统设计与VHDL[M].金明录,刘倩,译.北京:电子工业出版社,2008.

[4]单脉冲发生器电路[EB/OL]..

[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年出生,在读硕士研究生。主要研究方向为计算机应用技术。

上一篇:多通道实时CAN总线模拟器设计 下一篇:嵌入式系统低功耗设计研究