飞泉

【红色飓风Nano二代测评】按键设计--延时去抖动,同步电路设计

0
阅读(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


波形输出如下图所示: