【红色飓风Nano二代测评】按键设计--延时去抖动,同步电路设计
0赞
发表于 2014/5/23 23:00:54
阅读(1703)
按键去抖动,使用同步电路设计实现。不多说,上代码:
module Button(Clk,Rst,Sw1,Sw2,Led); input Clk; input Rst; input Sw1; input Sw2; output [3 : 0] Led; reg [20 : 0]C1; reg [20 : 0]C2; reg [1 :0 ]Ledn; reg [3 :0 ]Led; reg Sw1D,Sw1D1,Sw2D,Sw2D1; wire Sw1_IsDwon,Sw2_IsDwon; assign Sw1_IsDwon = !Sw1D1 && Sw1D; assign Sw2_IsDwon = !Sw2D1 && Sw2D; always @(posedge Clk ) begin if( !Rst )begin // Sw1D1 <= 1'b0; Sw2D1 <= 1'b0; end else begin Sw1D1 <= Sw1D; Sw2D1 <= Sw2D; end end always @(posedge Clk ) if( !Rst )begin Sw1D <= 1'b0; Sw2D <= 1'b0; end else begin if( C1[ 20 ] ) Sw1D <= 1'b1; else if( Sw1D && C1==0 ) Sw1D <=1'b0; if( C2[ 20 ] ) Sw2D <= 1'b1; else if( Sw2D && C2==0 ) Sw2D <=1'b0; end always @(posedge Clk ) if( !Rst )begin C1 <= 21'd0; C2 <= 21'd0; end else begin if( !Sw1 ) begin if( !C1[ 20 ] ) C1 <= C1 + 1'b1; end else if( C1 > 0 ) C1 <= C1 - 1'b1; if( !Sw2 ) begin if( !C2[ 20 ] ) C2 <= C2 + 1'b1; end else if( C2 > 0 ) C2 <= C2 - 1'b1; end always @( posedge Clk ) if(!Rst)begin Ledn <= 2'd0;Led <= 4'h0; end else begin if( Sw1Up ) Ledn <= Ledn + 1'b1; else if( Sw2Up ) Ledn <= Ledn - 1'b1; Led <= 4'h0; Led[Ledn] <= 1'b1; end endmodule
为此,写了仿真测试代码,代码如下:
module Button_tb; reg Clk; reg Rst; reg Sw1; reg Sw2; wire [3:0] Led; Button uut (.Clk(Clk), .Rst(Rst), .Sw1(Sw1), .Sw2(Sw2), .Led(Led)); initial begin Clk = 0; Rst = 0; Sw1 = 1; Sw2 = 1; #10 Clk = !Clk; #10 Clk = !Clk; #10 Clk = !Clk; Rst = 1; forever #10 Clk = !Clk; end initial begin #100; Sw1=0; #10000000; Sw1=0; Sw2=0; end initial begin $monitor($time,,,"Led= %b ",Led); end endmodule
波形输出如下图所示: