修改以上代码,使其能够完全消抖
时间: 2024-03-02 09:02:50 浏览: 18
以下是修改后的Verilog代码,可以实现完全消抖功能:
```verilog
module key_debounce (
input wire clk, //系统时钟 50MHz
input wire rst_n, //复位信号
input wire key_in, //按键输入信号
output reg key_out //消抖之后的按键信号
);
localparam BIT_CNT = 4; // 计时器宽度
localparam MAX_CNT = 16'hFFFF; // 最大计数值,用于计时20ms
reg [BIT_CNT-1:0] cnt; // 计时器计数器
reg [BIT_CNT-1:0] last_cnt; // 上一次计数器值,用于比较计数器是否在增加
reg key_in_sync; // 按键输入信号同步后的值
reg key_r0; // 滤波后的按键信号
reg key_r1; // 滤波后的按键信号
wire nedge; // 下降沿检测信号
reg flag; // 标志位,检测到下降沿后设置为1
reg [BIT_CNT-1:0] debounce_cnt; // 消抖计时器
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
key_in_sync <= 1'b1;
key_r0 <= 1'b1;
key_r1 <= 1'b1;
flag <= 1'b0;
debounce_cnt <= 0;
end else begin
key_in_sync <= key_in;
key_r0 <= key_in_sync;
key_r1 <= key_r0;
if (!key_r0 && key_r1) begin
flag <= 1'b1;
debounce_cnt <= 0;
end else if (flag && debounce_cnt < MAX_CNT) begin
debounce_cnt <= debounce_cnt + 1;
end else begin
flag <= 1'b0;
debounce_cnt <= 0;
end
end
end
assign nedge = ~key_r0 & key_r1;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
last_cnt <= 0;
cnt <= 0;
end else if (flag && debounce_cnt == 1) begin
cnt <= 0;
last_cnt <= 0;
end else if (flag && debounce_cnt > 1 && debounce_cnt <= MAX_CNT) begin
if (cnt == last_cnt) begin
cnt <= cnt + 1;
end else begin
cnt <= last_cnt;
end
last_cnt <= cnt;
end else begin
cnt <= 0;
last_cnt <= 0;
end
end
assign key_out = (flag && debounce_cnt == MAX_CNT) ? ~key_r0 : 1'b0;
endmodule // key_debounce
```
这个版本的按键消抖模块与之前的版本相比,增加了以下功能:
1. 添加了一个消抖计时器,用于计时20ms,确保按键信号完全消抖。
2. 添加了一个标志位 flag,用于表示是否检测到按键的下降沿,如果检测到,则设置 flag 为 1。
3. 修改了延时模块,使其能够根据消抖计时器的计数器值进行计时,达到20ms后才会输出消抖之后的按键信号。
4. 将 key_in 改为 key_in_sync,表示同步后的按键信号,避免异步信号的带来的问题。
5. 修改了 key_out 的计算方式,如果消抖计时器的计数器值等于最大计数值,说明按键信号已经完全消抖,此时输出 ~key_r0(取反后的滤波后的按键信号),否则输出低电平。
对于该代码,需要在实际硬件环境中进行测试和验证,以确保按键消抖功能的正确性和稳定性。同时,还需要根据实际情况进行参数配置和电路实现。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)