Three-process FSM coding style in VHDL - Time & Space Complexity
When we write a three-process FSM in VHDL, we want to know how the time it takes to run changes as the input size grows.
We ask: How does the number of steps grow when the FSM handles more inputs or states?
Analyze the time complexity of the following code snippet.
process(clk, reset)
begin
if reset = '1' then
state <= IDLE;
elsif rising_edge(clk) then
state <= next_state;
end if;
end process;
process(state, input_signal)
begin
case state is
when IDLE =>
if input_signal = '1' then
next_state <= WORK;
else
next_state <= IDLE;
end if;
when WORK =>
next_state <= DONE;
when others =>
next_state <= IDLE;
end case;
end process;
process(state)
begin
case state is
when IDLE => output_signal <= '0';
when WORK => output_signal <= '1';
when DONE => output_signal <= '0';
when others => output_signal <= '0';
end case;
end process;
This code shows a three-process FSM: one for state update, one for next state logic, and one for output logic.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The state update happens every clock cycle.
- How many times: Once per clock tick, no loops inside processes.
Each clock cycle, the FSM updates state and output based on current inputs and state.
| 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 the number of clock cycles or inputs processed.
Time Complexity: O(n)
This means the FSM takes time proportional to how many inputs or clock cycles it processes.
[X] Wrong: "The FSM runs slower if it has more states because it loops over all states each cycle."
[OK] Correct: The FSM only updates one state per cycle; it does not loop over all states each time.
Understanding how FSMs scale with input size helps you design efficient hardware and explain your design choices clearly.
"What if we added a loop inside the next state process to check multiple inputs each cycle? How would the time complexity change?"
Practice
Solution
Step 1: Understand the role of each process
The three-process FSM style divides the FSM into state register, next state logic, and output logic processes.Step 2: Identify which process stores the current state
The state register process updates and stores the current state on clock edges.Final Answer:
The state register process -> Option BQuick Check:
State storage = state register process [OK]
- Confusing next state logic with state storage
- Thinking output logic stores the state
- Assuming clock generation is part of FSM
Solution
Step 1: Recall what next state logic depends on
The next state logic calculates the next state based on the current state and inputs.Step 2: Determine the sensitivity list
It must react to changes in current_state and inputs, so these go in the sensitivity list.Final Answer:
current_state, inputs -> Option DQuick Check:
Next state logic sensitivity = current_state, inputs [OK]
- Including clk in next state logic sensitivity list
- Using outputs in sensitivity list
- Leaving sensitivity list empty
output_signal when current_state is S1 and input_signal is '1'?
process(current_state, input_signal)
begin
case current_state is
when S0 => output_signal <= '0';
when S1 =>
if input_signal = '1' then
output_signal <= '1';
else
output_signal <= '0';
end if;
when others => output_signal <= '0';
end case;
end process;Solution
Step 1: Analyze the output logic for state S1
When current_state is S1, output_signal is '1' if input_signal is '1', else '0'.Step 2: Apply given inputs
current_state = S1 and input_signal = '1' means output_signal <= '1'.Final Answer:
'1' -> Option CQuick Check:
Output for S1 with input '1' = '1' [OK]
- Ignoring input condition inside S1
- Assuming output is always '0' in S1
- Confusing output logic with next state logic
process(clk, reset)
begin
if reset = '1' then
current_state <= S0;
elsif rising_edge(clk) then
next_state <= current_state;
end if;
end process;Solution
Step 1: Understand state register role
The state register updates current_state with next_state on clock edge.Step 2: Check assignment inside clock edge
The code assigns next_state <= current_state, which is reversed and wrong.Final Answer:
Using next_state instead of current_state on clock edge -> Option AQuick Check:
State register updates current_state, not next_state [OK]
- Assigning next_state inside state register process
- Placing reset inside clock edge condition
- Confusing current_state and next_state signals
Solution
Step 1: Recall three-process FSM roles
The three processes are: state register (store current state), next state logic (compute next state), output logic (generate outputs).Step 2: Match roles to options
Process 1: Store current state; Process 2: Compute next state from current state and inputs; Process 3: Generate outputs based on current state correctly assigns these roles in order.Final Answer:
Process 1: Store current state; Process 2: Compute next state from current state and inputs; Process 3: Generate outputs based on current state -> Option AQuick Check:
Three-process FSM roles = B [OK]
- Mixing output generation with state storage
- Assigning reset to a separate process
- Combining multiple roles in one process
Ready to prove it?
Pass the test and this pattern moves unknown
