Model a State Machine for HDL and High-Level Synthesis Code Generation - MATLAB & Simulink (original) (raw)
Main Content
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
switch
block, use theotherwise
statement 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