关于特权同学中按键消抖的一个问题。。。
代码如下:这也是对3个独立按键进行消抖的module key_debounce (
clk_10m,
rst_n,
key_in,
en,
cnt_r
);
input clk_10m,rst_n;
input key_in;
output en;
output cnt_r;
reg en;
reg cnt_r;
//-----------------------------------------
reg key_rst;
always @ (posedge clk_10m or negedge rst_n)
if(~rst_n)
key_rst <= 1'b1;
else
key_rst <= key_in;
reg 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 key_an = key_rst_r & (~key_rst); //当key_rst由1变0时,key_an的值变高,维持一个时钟周期
//--------------------------------------
reg 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 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 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 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) begin cnt_r <= 8'd0; en <= 1'b1; end
// if(key_pluse) begin cnt_r <= 8'd64; en <= 1'b1; end
// if(key_pluse) begin cnt_r <= 8'd128; en <= 1'b1; end
// end
end
endmodule
为什么我用case语句检测按键按下时 cnt_r 始终为0,而 en 可以为 1 ?
若用下面的 if 语句判断则 cnt_r 和 en 都可以赋值,这是怎么回事? case的default呢 wangjun403 发表于 2014-8-12 09:45
case的default呢
我要是default那我该怎么写呢?那每次clk_10m上升沿不又没值了吗....?
页:
[1]