资源描述:
《[电子设计精品] vhdl任意整数的分频器的设计(从1到任意位)》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、1、按键去抖电路的设计一、按键电路 常用的非编码键盘,每个键都是一个常开开关电路。 计数器输入脉冲最好不要直接接普通的按键开关,因为记数器的记数速度非常快,按键、触点等接触时会有多次接通和断开的现象。我们感觉不到,可是记数器却都记录了下来。例如,虽然只按了1下,记数器可能记了3下。因此,使用按键的记数电路都会增加单稳态电路避免记数错误。二、按键消抖 通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号小型如下图。由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一
2、连串的抖动,如下图。抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。这是一个很重要的时间参数,在很多场合都要用到。 按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。键抖动会引起一次按键被误读多次。为确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。按键的抖动,可用硬件或软件两种方法。24三、硬件消抖 在键数较少时可用硬件方法消除键抖动。下图所示的RS触发器为常用的硬件去抖。图中两个“与非”门构成一个RS触发器。当按键未按下时,输出为1;当键按下
3、时,输出为0。此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),中要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。这一点通过分析RS触发器的工作过程很容易得到验证。 利用电容的放电延时,采用并联电容法,也可以实现硬件消抖:四、软件延时消抖24如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测
4、到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。五、VHDL按键去抖按键检测需要消抖,一般有硬件和软件两种方式。硬件就是加去抖动电路,这样从根本上解决按键抖动问题。除了用专用电路以外,用可编程FPGA或者CPLD设计相应的逻辑和时序电路,对按键信号进行处理,同样可以达到去抖动的目的。本例中用状态机实现了消抖电路:端口描述:clk输入检测时钟;reset复位信号;din原始按键信号输入;dout去抖动输出信号。VHDL源码如下:LIBRARYieee;USEieee.std_logic_1164.all;USEieee.st
5、d_logic_unsigned.all;ENTITYxiaodISPORT(clk:INSTD_LOGIC;reset:INSTD_LOGIC;din:INSTD_LOGIC;dout:OUTSTD_LOGIC);ENDENTITY;ARCHITECTURERTLOFxiaodISTYPEstateIS(s0,s1,s2,s3);24SIGNALpre_s,next_s:state;BEGINP0:PROCESS(reset,clk)BEGINifreset='0'thenpre_s<=s0;elsifrising_edge(clk)thenpre_s<=
6、next_s;elsenull;endif;ENDPROCESSP0;P1:PROCESS(pre_s,next_s,din)BEGINcasepre_siswhens0=>dout<='1';ifdin='1'thennext_s<=s0;elsenext_s<=s1;endif;whens1=>dout<='1';ifdin='1'thennext_s<=s0;elsenext_s<=s2;endif;whens2=>dout<='1';ifdin='1'thennext_s<=s0;elsenext_s<=s3;endif;whens3=>dout<=
7、'0';ifdin='1'thennext_s<=s0;elsenext_s<=s1;endif;endcase;ENDPROCESSP1;ENDRTL;多按键去抖动电路VHDL源码,按键个数参数化,每个按键处理调用了上面的模块:LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_arith.all;USEieee.std_logic_unsigned.all;ENTITYNxiaodISGENERIC(width:positive:=5);PORT24(clk:INSTD_LOGIC;reset
8、:INSTD_LOGIC;din:INSTD_LOG