手动按键复位程序(包含按键消抖)
1 //这是一个按键复位程序 2 module stable_key( 3 i_clkin, 4 i_inKey, 5 o_outKey 6 ); 7 8 input i_clkin; 9 input i_inKey; 10 output o_outKey; 11 12 reg key=1; 13 reg key_get = 1; //key输出指示信号 14 reg [20:0] cntK = 0; 15 reg o_outKey_r = 1; 16 17 always@(posedge i_clkin) 18 if(key != i_inKey) //首先判断i_inKey信号是否有电平变化, 19 begin //如果有电平变化,计数器和输出信号指示信号复位 20 cntK <= 0; 21 key_get <= 0; //按键消抖 22 end 23 else if(cntK == 1999999) 24 begin 25 o_outKey_r <= key; 26 cntK <= 0; 27 key_get <= 1; 28 end 29 else if(key_get == 0) 30 begin 31 cntK <= cntK + 21\'b1; 32 end 33 34 key <= i_inKey; 35 36 37 assign o_outKey = o_outKey_r; 38 endmodule
程序解释:按键信号从i_inKey端口输入,复位信号o_outKey端口输出。 reg key=1; reg o_outKey_r = 1;都保持高电平,若i_inKey接收到低电平信号,
则会触发 key != i_inKey,同时,在always块语句末尾将i_inKey输入的电平信号用reg key存储,在以后的时钟周期中,由于key_get == 0一直都触发cnK进行计数。
当计数满足1999999时候,产生复位信号,计数器归0和key_get = 1,代表接收到了按键输入信号。
消抖:当按键按下后,i_inKey会发生电平变化,但由于按键的抖动,使得计数器在1999999内,i_inKey的电平信号再次发生跳变,则会触发 key != i_inKey 语句,使得计数器归0,key_get也为0,代表没有接收到按键信号。