OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7491|回复: 8

新手求助 4独立按键消抖问题

[复制链接]

1

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-12-17
在线时间
2 小时
发表于 2018-12-17 11:38:46 | 显示全部楼层 |阅读模式
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n) begin
        key_reg   <= 4'b1111;
        delay_cnt <= 32'd0;
    end
    else begin
        key_reg[0]<= key[0];
              if(key_reg [0]!= key[0])             //一旦检测到按键状态发生变化(有按键被按下或释放)
                    delay_cnt <= 32'd1000000;  //给延时计数器重新装载初始值(计数时间为20ms)
              else if(key_reg[0] == key[0]) begin  //在按键状态稳定时,计数器递减,开始20ms倒计时
                          if(delay_cnt > 32'd0)
                                delay_cnt <= delay_cnt - 1'b1;
                          else
                                delay_cnt <= delay_cnt;
              end
    end  
     
     else begin
        key_reg[1]<= key[1];
              if(key_reg [1]!= key[1])             //一旦检测到按键状态发生变化(有按键被按下或释放)
                    delay_cnt <= 32'd1000000;  //给延时计数器重新装载初始值(计数时间为20ms)
              else if(key_reg[1] == key[1]) begin  //在按键状态稳定时,计数器递减,开始20ms倒计时
                          if(delay_cnt > 32'd0)
                                delay_cnt <= delay_cnt - 1'b1;
                          else
                                delay_cnt <= delay_cnt;
              end
    end  
     
     else begin
        key_reg[2]<= key[2];
              if(key_reg [2]!= key[2])             //一旦检测到按键状态发生变化(有按键被按下或释放)
                    delay_cnt <= 32'd1000000;  //给延时计数器重新装载初始值(计数时间为20ms)
              else if(key_reg[2] == key[2]) begin  //在按键状态稳定时,计数器递减,开始20ms倒计时
                          if(delay_cnt > 32'd0)
                                delay_cnt <= delay_cnt - 1'b1;
                          else
                                delay_cnt <= delay_cnt;
              end
    end  
     
     else begin
        key_reg[3]<= key[3];
              if(key_reg [3]!= key[3])             //一旦检测到按键状态发生变化(有按键被按下或释放)
                    delay_cnt <= 32'd1000000;  //给延时计数器重新装载初始值(计数时间为20ms)
              else if(key_reg[3] == key[3]) begin  //在按键状态稳定时,计数器递减,开始20ms倒计时
                          if(delay_cnt > 32'd0)
                                delay_cnt <= delay_cnt - 1'b1;
                          else
                                delay_cnt <= delay_cnt;
              end
    end  
     
     
     
end

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2019-7-7
在线时间
6 小时
发表于 2019-8-29 23:59:41 | 显示全部楼层
QinQZ 发表于 2018-12-17 13:50
例程中提供的是对一个按键进行消抖,最简单的做法是将按键消抖模块例化四次,例化的四个模块输入端口就是ke ...

那请问我在使用的时候该怎么去使用这些按键呢?
回复 支持 1 反对 0

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-12-17
在线时间
2 小时
 楼主| 发表于 2018-12-17 11:39:08 | 显示全部楼层
编译器说我  Error (10170): Verilog HDL syntax error at LPL.v(60) near text "else";  expecting "end"
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-12-17
在线时间
2 小时
 楼主| 发表于 2018-12-17 11:44:33 | 显示全部楼层
请问这样写可以吗
回复 支持 反对

使用道具 举报

3

主题

2013

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5618
金钱
5618
注册时间
2018-10-21
在线时间
1591 小时
发表于 2018-12-17 13:48:31 | 显示全部楼层
Booboo 发表于 2018-12-17 11:39
编译器说我  Error (10170): Verilog HDL syntax error at LPL.v(60) near text "else";  expecting "end"
...

错误是因为你的代码中出现了一个if,多个else的情况;
一个if对应一个else;
想写多个else的话,只能是if、else if......最后一个是else
回复 支持 反对

使用道具 举报

3

主题

2013

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5618
金钱
5618
注册时间
2018-10-21
在线时间
1591 小时
发表于 2018-12-17 13:50:45 | 显示全部楼层
本帖最后由 QinQZ 于 2018-12-17 13:54 编辑

例程中提供的是对一个按键进行消抖,最简单的做法是将按键消抖模块例化四次,例化的四个模块输入端口就是key[0]~key[3];因为是同一个模块例化四次,所以四个例化名要不一样,比如
key_debounce u0_key_debounce(
    .sys_clk        (sys_clk),
    .sys_rst_n     (sys_rst_n),
   
    .key             (key[0]),
    .key_flag      (key_flag[0]),
    .key_value    (key_value[0])
    );

......
key_debounce u3_key_debounce(
    .sys_clk        (sys_clk),
    .sys_rst_n     (sys_rst_n),

    .key             (key[3]),
    .key_flag      (key_flag[3]),
    .key_value    (key_value[3])
    );

回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-12-17
在线时间
2 小时
 楼主| 发表于 2018-12-17 14:32:56 | 显示全部楼层
QinQZ 发表于 2018-12-17 13:48
错误是因为你的代码中出现了一个if,多个else的情况;
一个if对应一个else;
想写多个else的话,只能是 ...

好的 谢谢我改一下
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-12-17
在线时间
2 小时
 楼主| 发表于 2018-12-17 14:33:33 | 显示全部楼层
QinQZ 发表于 2018-12-17 13:50
例程中提供的是对一个按键进行消抖,最简单的做法是将按键消抖模块例化四次,例化的四个模块输入端口就是ke ...

谢谢大佬,已经成功
回复 支持 反对

使用道具 举报

0

主题

295

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2019-3-26
在线时间
9 小时
发表于 2019-4-16 09:28:03 | 显示全部楼层
多谢老司机分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 08:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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