`timescale 1ns / 1ps
module key_skew(
clk ,
rst_n ,
//其他信号
key,
led
);
//参数定义
parameter DATA_W = 20;
parameter CNT20MS_W = 1000000;
//输入信号定义
input clk ;//50M
input rst_n ;//接的按键,按键按下为1 ,所以复位值为1
input key ;
//输出信号定义
output led ;
//输出信号reg定义
reg key_out ;
//中间信号定义
reg key_in_r;
reg key_in_r1;
reg key_out;
reg[DATA_W-1:0] cnt_20ms;
wire key_press_flag;
//key_in_r 打2拍,去亚稳态, 作为输入信号
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b1)begin
key_in_r<=0;
end
else begin
key_in_r<=key;
key_in_r1<=key_in_r;
end
end
assign key_press_flag=key_in_r^key_in_r1;//此处异或,判断是否有按键按下
//
//cnt_20ms 不停的数20ms,但是有按键按下的时候重新数。
always@(posedge clk or negedge rst_n)begin
if(rst_n==1'b1)begin
cnt_20ms<=0;
end
else if( cnt_20ms==CNT20MS_W-1||key_press_flag) begin
cnt_20ms<=0;
end
else begin
cnt_20ms<=cnt_20ms+1;
end
end
//key_out 20ms 缓存一次key_in_r的值
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b1)begin
key_out<=0;
end
else if( cnt_20ms==CNT20MS_W-1) begin
key_out<=key_in_r;
end
else begin
key_out<=key_out;
end
end
assign led=key_out;//led就是key_out,wire连起来的
endmodule
FPGA 去抖模块 verilog代码
最新推荐文章于 2023-07-11 09:27:34 发布