|
代码如下:这也是对3个独立按键进行消抖的
module key_debounce (
clk_10m,
rst_n,
key_in,
en,
cnt_r
);
input clk_10m,rst_n;
input [0:2] key_in;
output en;
output [7:0] cnt_r;
reg en;
reg [7:0] cnt_r;
//-----------------------------------------
reg [0:2] key_rst;
always @ (posedge clk_10m or negedge rst_n)
if(~rst_n)
key_rst <= 1'b1;
else
key_rst <= key_in;
reg [0:2] key_rst_r;
always @ (posedge clk_10m or negedge rst_n)
if(~rst_n)
key_rst_r <= 1'b1;
else
key_rst_r <= key_rst;
wire [0:2] key_an = key_rst_r & (~key_rst); //当key_rst由1变0时,key_an的值变高,维持一个时钟周期
//--------------------------------------
reg [19:0] cnt;
always @ (posedge clk_10m or negedge rst_n)
if(~rst_n)
cnt <= 20'd0;
else if(key_an) //抖动中的高电平将cnt清0
cnt <= 20'd0;
else
cnt <= cnt + 1'b1;
reg [0:2] low_sw;
always @ (posedge clk_10m or negedge rst_n)
if(~rst_n)
low_sw <= 1'b1;
else if(cnt == 20'h2ffff) //计数约20ms
low_sw <= key_in;
//---------------------------------------------
reg [0:2] low_sw_r;
always @ (posedge clk_10m or negedge rst_n)
if(~rst_n)
low_sw_r <= 1'b1;
else
low_sw_r <= low_sw;
wire [0:2] key_pluse = low_sw_r & (~low_sw);
//-------------------------------------------
always @ (posedge clk_10m or negedge rst_n) begin
if(~rst_n)
en <= 1'b0;
case(key_pluse)
3'b100 : begin cnt_r <= 8'd0; en <= 1'b1; end
3'b010 : begin cnt_r <= 8'd64; en <= 1'b1; end
3'b001 : begin cnt_r <= 8'd128; en <= 1'b1; end
endcase
//else begin
// if(key_pluse[0]) begin cnt_r <= 8'd0; en <= 1'b1; end
// if(key_pluse[1]) begin cnt_r <= 8'd64; en <= 1'b1; end
// if(key_pluse[2]) begin cnt_r <= 8'd128; en <= 1'b1; end
// end
end
endmodule
为什么我用case语句检测按键按下时 cnt_r 始终为0,而 en 可以为 1 ?
若用下面的 if 语句判断则 cnt_r 和 en 都可以赋值,这是怎么回事? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|