An FSM (Finite State Machine) with output logic helps control devices by changing states and producing outputs based on inputs and current state.
FSM with output logic in Verilog
module fsm_with_output(
input clk,
input reset,
input in_signal,
output reg out_signal
);
typedef enum logic [1:0] {
S0 = 2'b00,
S1 = 2'b01,
S2 = 2'b10
} state_t;
state_t current_state, next_state;
// State transition logic
always_ff @(posedge clk or posedge reset) begin
if (reset)
current_state <= S0;
else
current_state <= next_state;
end
// Next state logic
always_comb begin
case (current_state)
S0: next_state = in_signal ? S1 : S0;
S1: next_state = in_signal ? S2 : S0;
S2: next_state = S0;
default: next_state = S0;
endcase
end
// Output logic
always_comb begin
case (current_state)
S0: out_signal = 0;
S1: out_signal = 1;
S2: out_signal = 1;
default: out_signal = 0;
endcase
end
endmoduleThe FSM has three parts: state register, next state logic, and output logic.
Output logic can be Moore style (depends only on state) or Mealy style (depends on state and input). This example uses Moore style.
typedef enum logic [1:0] {S0 = 2'b00, S1 = 2'b01} state_t; state_t current_state, next_state;
always_ff @(posedge clk or posedge reset) begin if (reset) current_state <= S0; else current_state <= next_state; end
always_comb begin
case (current_state)
S0: next_state = in_signal ? S1 : S0;
S1: next_state = S0;
default: next_state = S0;
endcase
endalways_comb begin
case (current_state)
S0: out_signal = 0;
S1: out_signal = 1;
default: out_signal = 0;
endcase
endThis example shows a simple FSM with three states and output logic. The testbench simulates input signals and prints the output at each clock cycle.
module fsm_with_output(
input clk,
input reset,
input in_signal,
output reg out_signal
);
typedef enum logic [1:0] {
S0 = 2'b00,
S1 = 2'b01,
S2 = 2'b10
} state_t;
state_t current_state, next_state;
always_ff @(posedge clk or posedge reset) begin
if (reset)
current_state <= S0;
else
current_state <= next_state;
end
always_comb begin
case (current_state)
S0: next_state = in_signal ? S1 : S0;
S1: next_state = in_signal ? S2 : S0;
S2: next_state = S0;
default: next_state = S0;
endcase
end
always_comb begin
case (current_state)
S0: out_signal = 0;
S1: out_signal = 1;
S2: out_signal = 1;
default: out_signal = 0;
endcase
end
endmodule
// Testbench to simulate the FSM
module testbench();
logic clk = 0;
logic reset;
logic in_signal;
logic out_signal;
fsm_with_output fsm(.clk(clk), .reset(reset), .in_signal(in_signal), .out_signal(out_signal));
always #5 clk = ~clk; // Clock toggles every 5 time units
initial begin
$display("Time Reset In_signal Out_signal");
reset = 1; in_signal = 0;
#10 reset = 0;
#10 in_signal = 1; // Move from S0 to S1
#10 in_signal = 1; // Move from S1 to S2
#10 in_signal = 0; // Move from S2 to S0
#10 in_signal = 1; // Move from S0 to S1
#10 in_signal = 0; // Move from S1 to S0
#20 $finish;
end
always @(posedge clk) begin
$display("%0t %b %b %b", $time, reset, in_signal, out_signal);
end
endmoduleUse always_ff for sequential logic (state updates) and always_comb for combinational logic (next state and output).
Resetting the FSM ensures it starts in a known state.
Output logic can be changed to Mealy style by including inputs in the output logic block.
An FSM with output logic controls outputs based on states.
Use separate blocks for state update, next state logic, and output logic.
Moore outputs depend only on the current state, making timing simpler.
Practice
Solution
Step 1: Understand FSM output types
In FSMs, Moore outputs depend only on the current state, while Mealy outputs depend on state and input.Step 2: Identify output logic role
The output logic in a Moore machine produces outputs based solely on the current state stored in the state register.Final Answer:
Output logic in a Moore machine -> Option DQuick Check:
Moore output = state only [OK]
- Confusing next state logic with output logic
- Thinking outputs depend on inputs in Moore FSM
- Mixing state register role with output logic
state with 2 bits?Solution
Step 1: Recall Verilog register declaration
Registers are declared withregkeyword followed by bit width in brackets, e.g.,reg [1:0]for 2 bits.Step 2: Check each option
reg [1:0] state; correctly declares a 2-bit register namedstate. wire [2:0] state; useswireand wrong width. reg state[1:0]; uses incorrect syntax for bit width. state reg [1:0]; has wrong keyword order.Final Answer:
reg [1:0] state; -> Option AQuick Check:
reg [1:0] state; is correct syntax [OK]
- Using wire instead of reg for state registers
- Incorrect bit width syntax like reg name[1:0]
- Wrong keyword order like state reg
always @(state) begin
case(state)
2'b00: out = 1'b0;
2'b01: out = 1'b1;
2'b10: out = 1'b0;
default: out = 1'b0;
endcase
endWhat is the output
out when state is 2'b01?Solution
Step 1: Check case for state 2'b01
The case statement setsout = 1'b1whenstateis2'b01.Step 2: Confirm output value
Since the state matches 2'b01, outputoutis assigned 1'b1.Final Answer:
1'b1 -> Option CQuick Check:
State 01 -> out = 1 [OK]
- Confusing output with state value
- Assuming default applies instead of matching case
- Misreading bit values as decimal
always @(posedge clk) begin
case(state)
2'b00: out = 1'b0;
2'b01: out = 1'b1;
default: out = 1'b0;
endcase
endWhat is the main problem?
Solution
Step 1: Understand output logic timing
Moore FSM output logic is usually combinational and depends only on state, so it should be in an always block sensitive to state changes, not clock edges.Step 2: Analyze given code
The code usesalways @(posedge clk), making output synchronous, which is incorrect for pure output logic in Moore FSM.Final Answer:
Output logic should be in a combinational always block, not clocked -> Option AQuick Check:
Output logic = combinational, not clocked [OK]
- Using clocked always block for output logic
- Ignoring sensitivity list correctness
- Confusing output and state update blocks
out = 1 only when the current state is 2'b10 and input in is high. Which Verilog code snippet correctly implements this output logic?Solution
Step 1: Understand Mealy output logic
Mealy outputs depend on both current state and inputs, so sensitivity list must include bothstateandin.Step 2: Check each option
always @(state or in) begin\n if (state == 2'b10 && in)\n out = 1'b1;\n else\n out = 1'b0;\nend correctly usesalways @(state or in)and setsoutbased on both conditions. always @(state) begin\n if (state == 2'b10)\n out = 1'b1;\n else\n out = 1'b0;\nend ignores inputin. always @(posedge clk) begin\n if (state == 2'b10 && in)\n out <= 1'b1;\n else\n out <= 1'b0;\nend uses clocked block which is not typical for Mealy output logic. always @(in) begin\n if (in)\n out = 1'b1;\n else\n out = 1'b0;\nend ignores state.Final Answer:
always @(state or in) begin if (state == 2'b10 && in) out = 1'b1; else out = 1'b0; end -> Option BQuick Check:
Mealy output depends on state and input [OK]
- Leaving input out of sensitivity list
- Using clocked always block for Mealy output
- Ignoring state condition in output logic
Ready to prove it?
Pass the test and this pattern moves unknown
