搜索
bottom↓
回复: 2

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

[复制链接]

出0入0汤圆

发表于 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 [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, 杜汶泽)

出0入0汤圆

发表于 2014-8-12 09:45:23 | 显示全部楼层
case的default呢

出0入0汤圆

 楼主| 发表于 2014-8-12 10:06:59 | 显示全部楼层

我要是default那我该怎么写呢?那每次clk_10m上升沿不又没值了吗....?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表