📖 Scenario: You are designing a simple digital system using Verilog. To make your design reliable and easy to maintain, you will use a common design pattern called the Finite State Machine (FSM). This pattern helps organize your code clearly and prevents errors.
🎯 Goal: Build a simple FSM in Verilog that controls a traffic light system. You will create the data setup, configuration, core logic using the FSM pattern, and finally output the current state. This project shows how design patterns help make your code reliable and predictable.
📋 What You'll Learn
Create a Verilog module named traffic_light_fsm with input clk and output light
Define states using parameter constants for RED, GREEN, and YELLOW
Use a register state to hold the current state
Implement the FSM logic inside an always @(posedge clk) block
Print the current state as a string using $display in a testbench
💡 Why This Matters
🌍 Real World
Traffic light controllers, vending machines, and communication protocols use FSM design patterns to work reliably.
💼 Career
Understanding FSMs and design patterns is essential for hardware engineers and FPGA developers to build robust digital systems.
Progress0 / 4 steps
1
DATA SETUP: Define the traffic light states
Create a Verilog module called traffic_light_fsm with input clk and output light. Inside the module, define three parameter constants named RED, GREEN, and YELLOW with values 2'b00, 2'b01, and 2'b10 respectively.
Verilog
Hint
Use parameter to define fixed state values inside the module.
2
CONFIGURATION: Add a register to hold the current state
Inside the traffic_light_fsm module, declare a reg variable named state to hold the current state of the FSM. Initialize it to RED.
Verilog
Hint
Use reg [1:0] state = RED; to hold the current state and start at RED.
3
CORE LOGIC: Implement FSM state transitions on clock edge
Add an always @(posedge clk) block inside the traffic_light_fsm module. Inside it, write a case statement on state to change states in this order: RED to GREEN, GREEN to YELLOW, and YELLOW back to RED. Also update light to the current state.
Verilog
Hint
Use a case statement inside always @(posedge clk) to cycle states and update light.
4
OUTPUT: Create a testbench to display the current state
Write a testbench module named testbench that instantiates traffic_light_fsm. Generate a clock signal clk that toggles every 5 time units. Use a for loop to run 6 clock cycles and inside the loop, use $display to print the current light state as a string: "RED", "GREEN", or "YELLOW".
Verilog
Hint
Toggle clk every 5 time units. Use a for loop with @(posedge clk) to wait for clock edges. Use $display with a case on light to print state names.
Practice
(1/5)
1. Why do design patterns help ensure reliability in Verilog hardware designs?
easy
A. They allow the hardware to change its design during runtime.
B. They provide tested solutions that reduce errors and improve clarity.
C. They automatically fix syntax errors in the code.
D. They make the code run faster on all hardware.
Solution
Step 1: Understand the role of design patterns
Design patterns are proven ways to solve common problems, helping avoid mistakes.
Step 2: Connect design patterns to reliability
Using these patterns makes designs clearer and easier to debug, reducing errors.
Final Answer:
They provide tested solutions that reduce errors and improve clarity. -> Option B
Hint: Use dot and parentheses for module ports [OK]
Common Mistakes:
Using equal signs instead of dot notation
Using braces or angle brackets incorrectly
Omitting parentheses around port connections
3. Given the following Verilog code using a handshake design pattern, what is the output of ready after the first clock cycle?
module handshake(input clk, input req, output reg ready);
reg state = 0;
always @(posedge clk) begin
if (req) state <= 1;
else state <= 0;
ready <= state;
end
endmodule
medium
A. 0
B. 1
C. Unknown (X)
D. It causes a syntax error
Solution
Step 1: Analyze state update on clock edge
On posedge clk, if req is high, state becomes 1; else 0. Initially state=0.
Step 2: Determine ready assignment timing
ready is assigned the old state value (before update) because assignments happen sequentially.
Final Answer:
0 -> Option A
Quick Check:
ready = previous state = 0 [OK]
Hint: Registers update after assignments in always block [OK]
Common Mistakes:
Assuming ready updates immediately with new state
Confusing blocking and non-blocking assignments
Thinking code has syntax errors
4. Identify the error in this Verilog code snippet that tries to implement a reliable reset pattern:
module reset_pattern(input clk, input rst, output reg done);
always @(posedge clk or posedge rst) begin
if (rst = 1) done <= 0;
else done <= 1;
end
endmodule
medium
A. Incorrect sensitivity list for reset
B. Missing semicolon after done <= 0
C. Output 'done' should not be reg type
D. Using '=' instead of '==' in the if condition
Solution
Step 1: Check conditional statement syntax
In Verilog, '==' is used for comparison, '=' is for assignment.
Step 2: Identify the error in if condition
The code uses 'if (rst = 1)', which assigns instead of compares, causing error.
Final Answer:
Using '=' instead of '==' in the if condition -> Option D
Quick Check:
Comparison needs '==' not '=' [OK]
Hint: Use '==' for comparisons, '=' for assignments [OK]
Common Mistakes:
Confusing assignment and comparison operators
Ignoring sensitivity list correctness
Thinking reg type is wrong for output
5. How does using a state machine design pattern improve reliability in a complex Verilog control module?
hard
A. It automatically increases the clock speed for faster operation.
B. It removes the need for reset signals in the design.
C. It organizes control flow clearly, reducing unexpected states and simplifying debugging.
D. It allows the module to self-correct hardware faults during operation.
Solution
Step 1: Understand state machine role in control flow
State machines define clear states and transitions, avoiding ambiguous behavior.
Step 2: Connect clarity to reliability
Clear control flow reduces bugs and makes debugging easier, improving reliability.
Final Answer:
It organizes control flow clearly, reducing unexpected states and simplifying debugging. -> Option C
Quick Check:
State machines = clear, reliable control flow [OK]
Hint: State machines = clear steps, fewer bugs [OK]
Common Mistakes:
Thinking state machines speed up clocks
Believing they remove reset needs
Assuming they fix hardware faults automatically
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.