集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1274|回复: 3

求高人分析讲解按键消抖程序

[复制链接]
左手倒影 发表于 2016-4-20 18:55:21 | 显示全部楼层 |阅读模式
//4个独立按键S1/S2/S3/S4的按下与否(注意P12的PIN1-2短接),对应控制LED D2/D3/D4/D5/D6的亮灭切换
module cy4(
                        input ext_clk_25m,        //外部输入25MHz时钟信号
                        input ext_rst_n,        //外部输入复位信号,低电平有效
                        input[3:0] key_v,        //4个独立按键输入,未按下为高电平,按下后为低电平
                        output reg[7:0] led                //8个LED指示灯接口       
                    );

//-------------------------------------
//按键抖动判断逻辑
wire key;        //所有按键值相与的结果,用于按键触发判断
reg[3:0] keyr;  //按键值key的缓存寄存器

assign key = key_v[0] & key_v[1] & key_v[2] & key_v[3];

always @(posedge ext_clk_25m or negedge ext_rst_n)
    if (!ext_rst_n) keyr <= 4'b1111;
    else keyr <= {keyr[2:0],key};

wire key_neg = ~keyr[2] & keyr[3];        //有按键被按下       
wire key_pos = keyr[2] & ~keyr[3];        //有按键被释放

//-------------------------------------
//定时计数逻辑,用于对按键的消抖判断
reg[19:0]  cnt;       

        //按键消抖定时计数器
always @ (posedge ext_clk_25m or negedge ext_rst_n)
   if (!ext_rst_n) cnt <= 20'd0;       
        else if(key_pos || key_neg) cnt <= 20'd0;
        else if(cnt < 20'd999_999) cnt <= cnt + 1'b1;
        else cnt <= 20'd0;
  
reg[3:0] key_value[1:0];

        //定时采集按键值
always @(posedge ext_clk_25m or negedge ext_rst_n)
    if (!ext_rst_n) begin
                key_value[0] <= 4'b1111;
                key_value[1] <= 4'b1111;
        end
        else begin
                key_value[1] <= key_value[0];               
                if(cnt == 20'd999_999) key_value[0] <= key_v;        //定时键值采集
                else ;       
        end

wire[3:0] key_press = key_value[1] & ~key_value[0];                //消抖后按键值变化标志位

//-------------------------------------
//LED切换控制

always @ (posedge ext_clk_25m or negedge ext_rst_n)
    if (!ext_rst_n) led <= 8'hff;
    else if(key_press[0]) led[0] <= ~led[0];
        else if(key_press[1]) led[1] <= ~led[1];
        else if(key_press[2]) led[2] <= ~led[2];
        else if(key_press[3]) led[3] <= ~led[3];
        else ;
  
endmodule
陈飞龙 发表于 2016-4-21 10:05:19 | 显示全部楼层
至芯ZX_1开发板资料整理
http://www.fpgaw.com/forum.php?m ... 6&fromuid=29512
(出处: fpga论坛|fpga设计论坛)
好多文档自己查吧
 楼主| 左手倒影 发表于 2016-4-21 15:02:34 | 显示全部楼层
万分感谢,我买的开发板是勇敢的芯,不知道是不是一样板子
陈飞龙 发表于 2016-4-22 21:32:49 | 显示全部楼层
不是,但代码都一样
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-5-6 14:31 , Processed in 0.063530 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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