|
发表于 2010-8-16 22:45:45
|
显示全部楼层
我照着单片机的思想 用verilog调了一个,用着灰常稳定,愿与天下人共享
/***************************************************************************************
FILE NAME : Key_Scan.v
AUTHOR : Crazy Bingo
FUNCTION : Take away the jitter of Independent Key
SETUP TIME : 2010/5/5
***************************************************************************************/
/* 每一次按键,前后大约是20ms,
** 由于干扰的存在,要消除抖动,才能保证系统的稳定性
** 在单片机中检测按键用延时,抖动检测,松手检测
** 在FPGA 中同样可以利用单片机思想在状态机中实现
** 整个状态分为:
(1)按键检测
(2)消抖动(按键检测) Delay_10ms
(3)执行操作
(4)松手检测(消抖动) Delay_10ms
(5)松手检测 Delay_10ms
*/
module Key_Scan(
input CLOCK_50,
input Key,
input RST_n,
output reg [3:0] CLK_Class
);
reg [17:0] count; //Delay_10ms
reg CLK_100Hz; //100HZ(10ms)时钟信
reg [2:0] state; //状态标志
always @(posedge CLOCK_50 or negedge RST_n)
begin
if(!RST_n)
begin
CLK_100Hz<=0;
count<=0;
end
else
begin
if(count<18'd250000)
count<=count+1'b1;
else
begin
count<=0;
CLK_100Hz<=~CLK_100Hz;
end
end
end
always@(posedge CLK_100Hz or negedge RST_n)
begin
if(!RST_n)
CLK_Class <= 0;
else
begin
case(state) //按键,不按下去的时候是VCC高,按下去的时候是GND低
0:
begin
if(!Key) //检测键盘是否被按下(Delay_5ms)
state <= 1;
else
state <= 0; //未按下,循环检测
end
1:
begin
if(!Key) //检测键盘是否真的被按下,还是抖动(消抖动(Delay_5ms))
state <= 2; //检测到不是抖动,进行下一步操作
else
state <= 0; //是抖动,回去继续检测按键
end
2:
begin
CLK_Class <= CLK_Class+1'b1;
state <= 3; //只进行加1操作,不连加
end
// if(!Key)
// begin
// CLK_Class <= CLK_Class+1'b1;
// state <= 2; //连加,就返回本进程
// end
// else
// state <= 3;
3:
begin
if(Key) //松手(VCC)检测,有可能是抖动
state <= 4;
else //检测到还是(GND)低电平,未松手
state <= 3;
end
4:
begin
if(Key) //松手(VCC)检测,有可能是抖动
state <= 0;
else
state <= 4; //检测到还是(GND)低电平,未松手
end
endcase
end
end
endmodule |
|