通过时序图可见:在按键过程中可能有三种情况发生,①抖动发生在时钟的某 个上升沿,此时的输入信号为低电平,则输出为低电平:②抖动发生在时钟的某个 上升沿,但此时的输入信号抖动为高电平,由于按键(低电平)时间通常在200ms 以上,则在下一个上升沿出为低由平,③封动发生在时钟信的两个相邻上升 之间,则在第二个上升沿 出高由平 ,释放键盘时的情况类似 可风 期大于抖动时间而远小于按键时间,去抖电路即可正确识读按键次数。 一股健盘任 被按下和释放时会造成持续时间不大于10ms的信号抖动,而按键时间通常在200ms 以上,所以可以使用较低频率的时钟信号作为消抖时钟。 程序清单 LIBRARYieee: USE ieee.std_logic_1164.ALL USE IEEE.STD_LOGIC_ARITH.ALL: USE IEEE STD LOGIC UNSIGNED ALL ENTITY debouncing IS PORT (clkSCAN:IN STD_LOGIC; d in:IN STD LOGIC VECTORG DOWNTO0 d out:OUT STD LOGIC VECTOR(3 DOWNTO0)): END debouncing ARCHITECTURE a OF debou TEMPA,TEMPB,TEMPC,TEMPD,TEMPE:STD LOGIC VECTOR(3 DOWNTOO signal COUNT:STD LOGIC_VECTOR(DOWNTO0); BEGIN process(clkSCAN) begin if clkScAn'event and clkSCAn=0'then TEMPA<=D IN IF TEMPE=D IN THEN IF COUNT>="1000"THEN COUNT<= 1000" D_OUT<=D IN: FLse COUNT<=COUNT+I D0UT<="1111" END IF; ELS COUNT<-="0000" D OUT<="1111" END IE: END IF; end process process(clkSCAN)
通过时序图可见:在按键过程中可能有三种情况发生,①抖动发生在时钟的某 个上升沿,此时的输入信号为低电平,则输出为低电平;②抖动发生在时钟的某个 上升沿,但此时的输入信号抖动为高电平,由于按键(低电平)时间通常在200ms 以上,则在下一个上升沿输出为低电平;③抖动发生在时钟信号的两个相邻上升沿 之间,则在第二个上升沿输出高电平。释放键盘时的情况类似,可见,只要时钟周 期大于抖动时间而远小于按键时间,去抖电路即可正确识读按键次数。一般键盘在 被按下和释放时会造成持续时间不大于10ms的信号抖动,而按键时间通常在200ms 以上,所以可以使用较低频率的时钟信号作为消抖时钟。 程序清单: LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL ; USE IEEE.STD_LOGIC_UNSIGNED.ALL ; ENTITY debouncing IS PORT (clkSCAN : IN STD_LOGIC; d_in:IN STD_LOGIC_VECTOR(3 DOWNTO 0); d_out: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END debouncing ; ARCHITECTURE a OF debouncing IS signal TEMPA,TEMPB,TEMPC,TEMPD,TEMPE: STD_LOGIC_VECTOR(3 DOWNTO 0); signal COUNT: STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN process (clkSCAN) begin if clkSCAN'event and clkSCAN='0' then TEMPA<=D_IN; IF TEMPE=D_IN THEN IF COUNT>="1000"THEN COUNT<="1000"; D_OUT<=D_IN; ELSE COUNT<=COUNT+1; D_OUT<="1111"; END IF; ELSE COUNT<="0000"; D_OUT<="1111"; END IF; END IF; end process ; process (clkSCAN)
begin if clkSCAN'event and clkSCAN='1'then TEMPB<=TEMPA: TEMPC<-TEMPB TEMPD<-TEMPC TEMPE<=TEMPD: ENDIF: END PROCESS 将din信号去抖后送给DOUT,其中din信号的变化规律是四个扫描时钟周 期内仅有一个时钟周期为输入按键值,其余时间保持为1111”。 仿真波形: Nm 042 30 35 4045u5055 65到 70758 d_in 1110¥ 1110 (5)键盘译码电路 从前面的键盘扫描电路的输出可以看出,扫描得到的信号规律性不强,例如数 字键主要用来输入数字,但键盘扫描输出无法拿来直接使用,必须对其进行译码才 能使用,如表1所示 程序清单: LIBRARY ieee; LIBRARY ieee. USE ieee std logic 1164 All USE IEEE.STD_LOGIC_ARITH.ALL USE IEEE.STD LOGIC UNSIGNED.ALL ENTITY KEYBOARD DEC IS PORT( cIkSCAn IN STD LOGIC S:IN STD LOGIC VECTOR (1 d d_IN:INSTD_LOGIC VECTOR(downto-key code after debounce out_numb:OUT STD LOGIC_VECTOR(3 downto0)); END KEYBOARD DEC; 常帝*率米本客客***本本本***本术***本本率本家**率本条**本米本客家***本家家**卡率常**卡米 ARCHITECTURE a OF KEYBOARD_DECIS signal Z:std_logie_VECTOR(5 downto0):-SCAN CODE BEGIN Z<=S &d_IN; PROCESS(elkSCAN) hegin IF CLKSCAN'EVENTAND CLKSCAN='0 THEN case Z is when"110111"=>out numb<"0000";-0 when"100111"=>out numb<"0001";-1
begin if clkSCAN'event and clkSCAN='1' then TEMPB<=TEMPA; TEMPC<=TEMPB; TEMPD<=TEMPC; TEMPE<=TEMPD; END IF; END PROCESS; END a; 说明:将d_in信号去抖后送给D_OUT,其中d_in信号的变化规律是四个扫描时钟周 期内仅有一个时钟周期为输入按键值,其余时间保持为“1111”。 仿真波形: (5)键盘译码电路 从前面的键盘扫描电路的输出可以看出,扫描得到的信号规律性不强,例如数 字键主要用来输入数字,但键盘扫描输出无法拿来直接使用,必须对其进行译码才 能使用,如表1所示。 程序清单: LIBRARY ieee; LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL ; USE IEEE.STD_LOGIC_UNSIGNED.ALL ; ENTITY KEYBOARD_DEC IS PORT ( clkSCAN : IN STD_LOGIC ; S: IN STD_LOGIC_VECTOR (1 downto 0); d_IN: IN STD_LOGIC_VECTOR (3 downto 0); -key code after debounce out_numb : OUT STD_LOGIC_VECTOR(3 downto 0)); END KEYBOARD_DEC ; -****************************************************** ARCHITECTURE a OF KEYBOARD_DEC IS signal Z: std_logic_VECTOR(5 downto 0) ; -SCAN CODE BEGIN Z<= S & d_IN; PROCESS(clkSCAN) begin IF CLKSCAN'EVENT AND CLKSCAN = '0' THEN case Z is when "110111" =>out_numb<= "0000" ;-0 when "100111" =>out_numb<= "0001" ;-1