FPGA检测按键长按检测

原理

和按键按下正常检测不一样,检测按键长按要计数。 使用的basys3,时钟100MHZ,所以一秒的计数就要计数到,99_999_999。 由于这个模块本来要计数,所以加不加延时消抖对工程实现的结果影响是不大的,只会造成按下设置的时间不一样。

代码

代码就直接使用不加消抖了,直接用。

module key_test2(
	clk,			//时钟信号100Mhz
	rst,			//按键复位
	key,			//用户按键
	out			
    );
 
//端口定义
	input clk;
	input rst;
	input key;
	
	output reg out;
 
	reg[31:0] count;	
	reg last_key; //旧扫描按键电平
	wire flag_up; //上升沿检测标志\\
	wire flag_down; //上升沿检测标志\\
	
//	wire  keys_deb;
//btn_deb btn_deb2
//(
//   .  clk(clk),  //100MHz
//   .  btn_in(key),
//   .  btn_deb(keys_deb)
//);
/*
** 按键状态保存一个时钟周期	
*/
always @(posedge clk)
	begin
		last_key <= key;
	end
 
assign flag_up = (~last_key) & key; 	   //检测按键松的上升沿
assign flag_down = (~key) & last_key; 	   //检测按键松的下降沿


/*
**	count计数,测量按键按下时间长度
*/
always @(posedge clk or negedge rst)
	begin 
		if (!rst)
			count <= 32d0;
		else if (key == 1)
			count <= count +1b1;
		else if (flag_down == 1) begin
			count <= 32d0;
		end	
	end
/*
**	根据按键按下时间的长短进行相应的动作
*/
always @(posedge clk or negedge rst) 
begin
		if (!rst)
			out <= 0;
	else if (count >= 32d99999_999)//1s
			 out <= 1b1;
	else if (count <= 32d99999_999)
			 out <= 1b0;			 
	end
	
endmodule
经验分享 程序员 微信小程序 职场和发展