module Button(Clk,Rst,Sw,Led);// 模块接口
input Clk; //时钟信号
input Rst; //复位信号
input [4 : 1] Sw; //按钮SW输入,按下为0,抬起为1
output [4 : 1] Led; // 4个led 输出
reg [4 : 1] Led;
reg [4 : 1] Sw1;
reg [4 : 1] Sw1_r;
wire [4 : 1] Sample1;
reg [4 : 1] Sw2;
reg [4 : 1] Sw2_r;
wire [4 : 1] Sample2;
reg [19 : 0] cnt;
//第一次读取按键状态
always @ (posedge Clk , negedge Rst)
if(!Rst) Sw1 <= 4'b1111;
else Sw1 <= Sw;
//第一次读取的按键状态放入锁存器
always @ (posedge Clk , negedge Rst)
if(!Rst) Sw1_r <= 4'b1111;
else Sw1_r <= Sw1;
//Sample仅保持一个时钟周期
assign Sample1 = Sw1_r & (!Sw1);
//延时20MS后,第二次读取按键状态
always @ (posedge Clk , negedge Rst)
if(!Rst) Sw2 <= 4'b1111;
else if (cnt == 20'hF_FFFF) Sw2 <= Sw;
else Sw2 <= 4'b1111;
//第二次读取的按键状态放入锁存器
always @ (posedge Clk , negedge Rst)
if(!Rst) Sw2_r <= 4'b1111;
else Sw2_r <= Sw2;
//Sample2仅保持一个时钟周期
assign Sample2 = Sw2_r & (!Sw2);
//计数器,定时20MS
always @ (posedge Clk , negedge Rst)
if(!Rst) cnt <= 0;
else if (Sample1) cnt <= 0;
else cnt <= cnt + 1'b1;
//LED控制
always @ (posedge Clk , negedge Rst)
if(!Rst) Led <= 4'b0000;
else if (Sample2) Led <= Sample2;
else Led <= 4'b0000;
endmodule
求大神帮忙看看,我这个按键去抖有什么问题,我发现在sample1就出不来正确的波形。
另外,求大神讲下教程里的去抖程序,我有点看不懂。
|