diff --git a/SDVD.xpr b/SDVD.xpr
index fc10aaa..b9cde0e 100644
--- a/SDVD.xpr
+++ b/SDVD.xpr
@@ -45,7 +45,7 @@
-
+
@@ -61,7 +61,7 @@
-
+
@@ -168,16 +168,8 @@
-
-
-
-
-
-
-
-
@@ -185,7 +177,7 @@
-
+
diff --git a/design/debouncer.sv b/design/debouncer.sv
index 836d5f9..88a2c95 100644
--- a/design/debouncer.sv
+++ b/design/debouncer.sv
@@ -11,6 +11,10 @@ always_ff @(posedge clk) begin
pressed <= 1;
else if (pressed && !source)
pressed <= 0;
+ else if (pressed && source)
+ pressed <= 0;
+ else if (!pressed && !source)
+ pressed <= 0;
end
diff --git a/verification/debouncer_tb.sv b/verification/debouncer_tb.sv
index f98a0fa..a541ac4 100644
--- a/verification/debouncer_tb.sv
+++ b/verification/debouncer_tb.sv
@@ -1,8 +1,63 @@
+`timescale 1ns / 1ps
module debouncer_tb;
logic clk,reset,source;
wire out;
+int errors;
+
debouncer Dut (.*);
+initial begin
+ clk = 0;
+ forever #10 clk = ~clk;
+end
+
+initial begin
+ $display("Testing debouncer");
+ reset = 1;
+ source = 0;
+ @(posedge clk);
+ @(posedge clk);
+ reset = 0;
+ @(posedge clk);
+ source = 1;
+ #1;
+ assert (out == 1) else begin
+ $error("Output not brought high during first press");
+ errors++;
+ end
+ @(posedge clk);
+ #1;
+ assert (out == 0) else begin
+ $error("Output not brought low after first press");
+ errors++;
+ end
+ @(posedge clk);
+ source = 0;
+ @(posedge clk);
+ source = 1;
+ #1;
+ assert (out == 1) else begin
+ $error("Output not brought high during second press");
+ errors++;
+ end
+ source = 0;
+ @(posedge clk);
+ #1;
+ assert (out == 0) else begin
+ $error("Output not brought low after second press");
+ errors++;
+ end
+
+ if (errors == 0)
+ $display("Found no errors while testing debouncer");
+
+ $finish;
+
+end
+
+
+
+
endmodule