Debouncer circuit design in Verilog - Mini Project: Build & Apply
debouncer with inputs clk and noisy_in, and output clean_out. Declare clean_out as a reg type.Start by defining the module and its ports exactly as described.
debouncer module, declare a 16-bit register called counter initialized to 0, and a 1-bit register called button_sync initialized to 0.Use reg [15:0] counter = 0; and reg button_sync = 0; inside the module.
always @(posedge clk) block inside the module. Inside it, assign button_sync = noisy_in. Then, if button_sync equals noisy_in, increment counter until it reaches 50000. If they differ, reset counter to 0. When counter reaches 50000, set clean_out = button_sync.Use a clocked always block to sample input and count stable cycles before updating output.
testbench that instantiates debouncer. Simulate a noisy input sequence and use $display to print clean_out after each clock cycle.Create a testbench to simulate the debouncer and print the stable output.
Practice
What is the main purpose of a debouncer circuit in Verilog?
Solution
Step 1: Understand the problem of noisy signals
Mechanical buttons often produce multiple quick on/off signals (noise) when pressed.Step 2: Role of debouncer
A debouncer waits for the input to be stable for some time before changing the output, thus cleaning the noise.Final Answer:
To clean noisy button signals and produce a stable output -> Option DQuick Check:
Debouncer = Clean noisy signals [OK]
- Thinking debouncer speeds up the clock
- Confusing debouncer with analog to digital converter
- Assuming debouncer generates signals
Which of the following is the correct way to declare a 16-bit counter register in Verilog?
?Solution
Step 1: Understand Verilog register declaration
Registers use 'reg' keyword and bit width is declared as [MSB:LSB].Step 2: Check each option
reg [15:0] counter; correctly declares a 16-bit register from bit 15 down to 0.Final Answer:
reg [15:0] counter; -> Option BQuick Check:
16-bit reg = reg [15:0] name; [OK]
- Using wire instead of reg for counters
- Incorrect bit range syntax
- Declaring arrays instead of bit vectors
Given this Verilog snippet for a debouncer counter:
always @(posedge clk) begin
if (button == last_button) begin
if (counter < 3) counter <= counter + 1;
end else counter <= 0;
last_button <= button;
end
What is the value of counter after 5 clock cycles if button stays stable at 1?
Solution
Step 1: Analyze counter increment condition
Counter increments only if button equals last_button and counter is less than 3.Step 2: Trace counter over 5 cycles
Initially counter=0. It increments each cycle until it reaches 3, then stops incrementing.Final Answer:
3 -> Option CQuick Check:
Counter maxes at 3 despite 5 cycles [OK]
- Assuming counter increments beyond 3
- Ignoring last_button update
- Resetting counter incorrectly
Identify the error in this debouncer code snippet:
reg [3:0] counter;
reg last_button;
always @(posedge clk) begin
if (button == last_button) begin
counter = counter + 1;
end else begin
counter = 0;
end
last_button = button;
end
Solution
Step 1: Check assignment types in sequential always block
Sequential logic should use non-blocking assignments (<=) to avoid race conditions.Step 2: Identify the error
The code uses blocking assignments (=) inside a clocked always block, which is incorrect.Final Answer:
Using blocking assignments (=) inside always block for sequential logic -> Option AQuick Check:
Use <= for sequential logic assignments [OK]
- Using = instead of <=
- Ignoring sensitivity list importance
- Assuming initial values fix assignment errors
You want to design a debouncer that waits for 10ms of stable input before changing output. The clock frequency is 1MHz. How many bits should the counter have at minimum?
Solution
Step 1: Calculate required count for 10ms at 1MHz clock
10ms = 0.01 seconds. Clock period = 1us (1/1MHz). Number of counts = 0.01 / 0.000001 = 10,000 counts.Step 2: Find minimum bits to count 10,000
2^13 = 8192 (too small), 2^14 = 16384 (enough). So minimum 14 bits needed.Final Answer:
14 bits -> Option AQuick Check:
10,000 < 2^14 = 16384 [OK]
- Using clock frequency as count directly
- Choosing too few bits to cover count
- Confusing ms and us units
Ready to prove it?
Pass the test and this pattern moves unknown
