天堂,你的歌 发表于 2014-8-12 09:42:00

关于特权同学中按键消抖的一个问题。。。

代码如下:这也是对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 都可以赋值,这是怎么回事?

wangjun403 发表于 2014-8-12 09:45:23

case的default呢

天堂,你的歌 发表于 2014-8-12 10:06:59

wangjun403 发表于 2014-8-12 09:45
case的default呢

我要是default那我该怎么写呢?那每次clk_10m上升沿不又没值了吗....?
页: [1]
查看完整版本: 关于特权同学中按键消抖的一个问题。。。