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
上一篇:
IDEA上Java项目控制台中文乱码