module sw_debounce(
clk, rst_n,
sw1_n, sw2_n,
led_d1, led_d2
);
input clk;
input rst_n;
input sw1_n, sw2_n;
output led_d1;
output led_d2;
//------------------------------
reg [1:0] key_rst;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
key_rst <= 2'b11;
else
key_rst <= {sw2_n, sw1_n};
end
reg [1:0] key_rst_r;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
key_rst_r <= 2'b11;
else
key_rst_r <= key_rst;
end
wire key_an;
assign key_an = key_rst_r & ~key_rst;
//-----------------------count-------------
reg [19:0] cnt;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt <= 0;
else if(key_an)
cnt <= 0;
else
cnt <= cnt + 1;
end
reg [1:0] low_sw;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
low_sw <= 2'b11;
else if(cnt == 20'hFFFFF)
low_sw <= {sw2_n, sw1_n};
end
reg [1:0] low_sw_r;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
low_sw_r <= 2'b11;
else
low_sw_r <= low_sw;
end
wire [1:0] led_ctrl;
assign led_ctrl = low_sw_r & ~low_sw;
//------------------------------------------
reg [1:0] led;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
led <= 2'b00;
else
begin
if(led_ctrl[0] == 1) led[0] <= ~led[0];
if(led_ctrl[1] == 1) led[1] <= ~led[1];
end
end
assign led_d1 = led[0];
assign led_d2 = led[1];
endmodule