Traffic light controller FSM in Verilog - Time & Space Complexity
We want to understand how the time it takes for a traffic light controller FSM to run changes as the system grows.
Specifically, we ask: how does the number of steps grow when the input or states increase?
Analyze the time complexity of the following Verilog FSM code.
module traffic_light_controller(
input clk, reset,
output reg [1:0] light_state
);
parameter RED=2'd0, GREEN=2'd1, YELLOW=2'd2;
reg [1:0] state, next_state;
always @(posedge clk or posedge reset) begin
if (reset) state <= RED;
else state <= next_state;
end
always @* begin
case(state)
RED: next_state = GREEN;
GREEN: next_state = YELLOW;
YELLOW: next_state = RED;
default: next_state = RED;
endcase
end
always @* begin
light_state = state;
end
endmodule
This code cycles through traffic light states: RED, GREEN, YELLOW, then back to RED.
The FSM updates its state on every clock cycle.
- Primary operation: State transition on each clock tick.
- How many times: Once per clock cycle, indefinitely.
The FSM runs one state update per clock cycle regardless of input size.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 state updates |
| 100 | 100 state updates |
| 1000 | 1000 state updates |
Pattern observation: The number of operations grows linearly with time, but each update is constant work.
Time Complexity: O(1)
This means each state update takes the same fixed time, no matter how many states or inputs there are.
[X] Wrong: "The FSM takes longer as more states are added because it checks all states each time."
[OK] Correct: The FSM only moves from one state to the next directly, so each update is a simple step, not a full search.
Understanding FSM time complexity helps you explain how hardware designs handle timing predictably and efficiently.
"What if the FSM had to check multiple inputs before deciding the next state? How would the time complexity change?"
Practice
Solution
Step 1: Understand FSM role in traffic lights
A traffic light controller FSM manages the sequence of lights (red, yellow, green) safely and in timed order.Step 2: Compare options to FSM purpose
Only To change traffic lights in a safe and timed sequence describes changing lights in a safe and timed sequence, which is the FSM's job.Final Answer:
To change traffic lights in a safe and timed sequence -> Option CQuick Check:
FSM controls light sequence = A [OK]
- Confusing FSM with sensor or speed control
- Thinking FSM counts cars
- Assuming FSM controls vehicle speed
Solution
Step 1: Identify correct state variable type
FSM states are stored in registers (reg) because they hold values across clock cycles.Step 2: Check bit width for multiple states
Traffic light FSM usually needs multiple bits (e.g., 2 bits) to represent states, so reg [1:0] is correct.Final Answer:
reg [1:0] state; // 2-bit state variable -> Option DQuick Check:
State needs reg and multiple bits = A [OK]
- Using wire instead of reg for state
- Using single bit for multiple states
- Using integer without clocked assignment
always @(posedge clk) begin
case(state)
2'b00: state <= 2'b01;
2'b01: state <= 2'b10;
2'b10: state <= 2'b00;
default: state <= 2'b00;
endcase
endWhat will be the sequence of states after 4 clock cycles starting from 2'b00?
Solution
Step 1: Trace state transitions step-by-step
Start at 00, next is 01, then 10, then back to 00 on each clock.Step 2: List states for 4 cycles
Cycle 1: 00, Cycle 2: 01, Cycle 3: 10, Cycle 4: 00.Final Answer:
00, 01, 10, 00 -> Option AQuick Check:
Follow case transitions = B [OK]
- Mixing up state assignments order
- Forgetting default case resets state
- Assuming states skip steps
always @(posedge clk) begin
if (reset) state <= 2'b00;
else
case(state)
2'b00: state = 2'b01;
2'b01: state = 2'b10;
2'b10: state = 2'b00;
endcase
endSolution
Step 1: Check assignment types in clocked always block
Inside always @(posedge clk), non-blocking assignment (<=) must be used to avoid race conditions.Step 2: Identify incorrect use of blocking assignment
The code uses '=' (blocking) inside sequential logic, which is incorrect.Final Answer:
Using blocking assignment (=) inside sequential always block -> Option AQuick Check:
Use non-blocking (<=) in clocked blocks = C [OK]
- Using = instead of <= in sequential logic
- Ignoring missing default case (less critical)
- Confusing synchronous and asynchronous reset
Solution
Step 1: Understand safe traffic light sequence
Normal sequence is Green -> Yellow -> Red, then pedestrian walk should come after Red for safety.Step 2: Check options for correct order
Green (00) -> Yellow (01) -> Red (10) -> Pedestrian Walk (11) -> Green (00) correctly places Pedestrian Walk after Red, then cycles back to Green.Final Answer:
Green (00) -> Yellow (01) -> Red (10) -> Pedestrian Walk (11) -> Green (00) -> Option BQuick Check:
Pedestrian after Red before Green = D [OK]
- Placing pedestrian walk before Yellow or Green
- Skipping pedestrian state in sequence
- Looping pedestrian state incorrectly
Ready to prove it?
Pass the test and this pattern moves unknown
