Down counter design in Verilog - Mini Project: Build & Apply
down_counter with inputs clk and reset. Inside, declare a 4-bit register called count and initialize it to 15 when reset is high.Use an always block triggered on the positive edge of clk or reset. When reset is high, set count to 15.
always block, add logic to decrease count by 1 on each positive clock edge when reset is low and count is greater than 0.Use an if statement to check if count is greater than zero before subtracting 1.
count_out and assign it the value of the internal count register.Use an assign statement to connect the internal register count to the output count_out.
testbench that instantiates down_counter, applies a clock signal, asserts reset once, and prints the count_out value on each clock cycle for 20 cycles.Create a clock signal that toggles every 5 time units. Use initial block to assert reset at start, then release it. Use a repeat loop to print the count 20 times on clock rising edges.
Practice
What is the main function of a down counter in Verilog?
Solution
Step 1: Understand the counting direction
A down counter decreases its count value each clock cycle, moving backward.Step 2: Compare with other options
Counting forward is for up counters, clock generation and reset are different functions.Final Answer:
Counts backward from a start value to zero -> Option AQuick Check:
Down counter = counts backward [OK]
- Confusing down counter with up counter
- Thinking it generates clock signals
- Assuming it resets the system
Which of the following is the correct Verilog syntax to declare a 4-bit down counter register?
?Solution
Step 1: Identify correct register declaration
In Verilog, a 4-bit register is declared as reg [3:0] name; where 3:0 means 4 bits.Step 2: Check other options
wire is for connections, reg counter[3:0] is an array of 4 registers, integer is 32-bit signed.Final Answer:
reg [3:0] counter; -> Option BQuick Check:
4-bit reg = reg [3:0] name [OK]
- Using wire instead of reg for storage
- Declaring array instead of vector
- Using integer for fixed bit width
Given this Verilog code snippet for a 3-bit down counter starting at 5, what is the value of count after 3 clock cycles?
reg [2:0] count = 3'd5;
always @(posedge clk) begin
if (count > 0)
count <= count - 1;
endSolution
Step 1: Trace the count value each clock
Start at 5, after 1st clock: 4, 2nd clock: 3, 3rd clock: 2.Step 2: Confirm counting stops only at zero
Since count > 0 condition is true, it decrements each cycle until zero.Final Answer:
2 -> Option DQuick Check:
5 - 3 = 2 after 3 clocks [OK]
- Not decrementing count on each clock
- Stopping count too early
- Confusing initial value with current
Identify the error in this down counter code and select the fix:
reg [3:0] count = 4'd10;
always @(posedge clk or posedge reset) begin
if (reset)
count <= 4'd0;
else if (count >= 0)
count <= count - 1;
endSolution
Step 1: Analyze the condition for decrement
Conditioncount >= 0is always true for unsigned, causing underflow.Step 2: Correct condition to prevent underflow
Usecount > 0to stop decrement at zero and avoid wrap-around.Final Answer:
Changecount >= 0tocount > 0-> Option CQuick Check:
Prevent underflow by checking count > 0 [OK]
- Using >= 0 causes counter to wrap
- Ignoring reset sensitivity
- Incrementing instead of decrementing
You want to design a 4-bit down counter that stops at zero and asserts an output done signal when zero is reached. Which Verilog code snippet correctly implements this behavior?
?Solution
Step 1: Check initialization and reset behavior
Count starts at 10, done is 0, reset sets count and done correctly.Step 2: Verify counting and done signal logic
Count decrements only if > 0, done set to 1 when count reaches zero, stopping count.Step 3: Compare with other options
reg [3:0] count = 4'd10; reg done = 0; always @(posedge clk) begin if (count >= 0) begin count <= count - 1; done <= (count == 0); end end allows underflow. Other options either start count at 0 or use >= 0 causing wrap-around.Final Answer:
A -> Option AQuick Check:
Stop at zero and assert done = 1 [OK]
- Allowing count to underflow below zero
- Incorrect done signal timing
- Wrong initial count value
Ready to prove it?
Pass the test and this pattern moves unknown
