Model a State Machine for HDL and High-Level Synthesis Code Generation
The following design pattern shows MATLAB® examples of Mealy and Moore state machines which are suitable for HDL and High-Level Synthesis (HLS) code generation.
The MATLAB code in these models demonstrates best practices for writing MATLAB models for HDL and HLS code generation.
With a
switchblock, use theotherwisestatement to ensure that the model accounts for all conditions. If the model does not cover all conditions, the generated HDL code can contain errors.To designate the states in a state machine, use variables with numerical values.
MATLAB Code for the Mealy State Machine
In a Mealy state machine, the output depends on the state and the input. In a Moore state machine, the output depends only on the state.
The following MATLAB code defines the mlhdlc_fsm_mealy function.
A persistent variable represents the current state. A switch block
uses the current state and input to determine the output and new state.
In each case in the switch block,
an if-else statement calculates the new state
and output.
MATLAB Code
%#codegen function Z = mlhdlc_fsm_mealy(A) % Mealy State Machine % y = f(x,u) : % all actions are condition actions and % outputs are function of state and input % define states S1 = 0; S2 = 1; S3 = 2; S4 = 3; persistent current_state; if isempty(current_state) current_state = S1; end % switch to new state based on the value state register switch (current_state) case S1, % value of output 'Z' depends both on state and inputs if (A) Z = true; current_state = S1; else Z = false; current_state = S2; end case S2, if (A) Z = false; current_state = S3; else Z = true; current_state = S2; end case S3, if (A) Z = false; current_state = S4; else Z = true; current_state = S1; end case S4, if (A) Z = true; current_state = S1; else Z = false; current_state = S3; end otherwise, Z = false; end
MATLAB Test Bench
for i = 1:100 if mod(i,2) == 0 val = mlhdlc_fsm_mealy(true); else val = mlhdlc_fsm_mealy(false); end end
MATLAB Code for the Moore State Machine
The following MATLAB code defines the mlhdlc_fsm_moore function.
A persistent variable represents the current state, and a switch block
uses the current state to determine the output and new state. In each case in
the switch block, an if-else statement
calculates the new state and output. The value of the state is represented
by numerical variables.
MATLAB Code
%#codegen function Z = mlhdlc_fsm_moore(A) % Moore State Machine % y = f(x) : % all actions are state actions and % outputs are pure functions of state only % define states S1 = 0; S2 = 1; S3 = 2; S4 = 3; % using persistent keyword to model state registers in hardware persistent curr_state; if isempty(curr_state) curr_state = S1; end % switch to new state based on the value state register switch (curr_state) case S1, % value of output 'Z' depends only on state and not on inputs Z = true; % decide next state value based on inputs if (~A) curr_state = S1; else curr_state = S2; end case S2, Z = false; if (~A) curr_state = S1; else curr_state = S3; end case S3, Z = false; if (~A) curr_state = S2; else curr_state = S4; end case S4, Z = true; if (~A) curr_state = S3; else curr_state = S1; end otherwise, Z = false; end
MATLAB Test Bench
for i = 1:100 if mod(i,2) == 0 val = mlhdlc_fsm_moore(true); else val = mlhdlc_fsm_moore(false); end end