Диаграммы Stateflow ® поддерживают моделирование трех типов конечных автоматов:
Классический (по умолчанию)
Мучнистый
Мур
Для генерации кода HDL используйте машины типа Mealy или Moore. Конечные автоматы Мили и Мура различаются следующими способами:
Выходы конечного автомата Меали являются функцией текущего состояния и входов.
Выходы конечного автомата Мура являются функцией только текущего состояния.
Основными преимуществами использования карт Мили или Мура в качестве альтернативы классическим чартам являются:
Диаграммы Мура генерируют более эффективный код, чем классические диаграммы.
Во время компиляции диаграммы Мили и Мура проверяются на соответствие их формальным определениям и семантическим правилам, и сообщается о нарушениях.
Дополнительные сведения о руководстве по созданию кодов HDL для диаграмм см. в разделе Диаграмма (State flow).
Откройте окно hdlcoder_fsm_mealy_moore модель для примера, показывающего, как моделировать диаграммы Мили и Мура.
При создании кода HDL для диаграммы, моделирующей конечный автомат Мура:
Диаграмма должна соответствовать общим требованиям к созданию кода, как описано в разделе Диаграмма (Stateflow).
Действия должны выполняться только в состояниях. Эти действия должны быть не помечены.
Действия Мура должны быть связаны с состояниями, поскольку выходные вычисления должны зависеть только от состояний, а не от входных. Конфигурация активных состояний на шаге времени t определяет вывод. Если состояние S активен, когда диаграмма просыпается в момент времени t, он вносит вклад в вывод независимо от того, остается ли он активным во времени t+1.
Не вызывайте функции Simulink ®.
Это предотвращает зависимость выхода от входных данных способами, которые трудно проверить генератору кода HDL.
Если отключить параметр «Инициализировать выходы при каждом пробуждении диаграммы», генерируемый код HDL включает дополнительные регистры выходных значений конечного автомата.
На следующем рисунке показана диаграмма Stateflow конечного автомата Мура, использующего MATLAB ® в качестве языка действий .

При создании кода HDL для диаграммы, моделирующей конечный автомат Mealy:
Диаграмма должна соответствовать общим требованиям к созданию кода, как описано в разделе Диаграмма (Stateflow).
Действия должны быть связаны только с внутренними и внешними переходами.
Если отключить параметр «Инициализировать выходы при каждом пробуждении диаграммы», генерируемый код HDL включает дополнительные регистры выходных значений конечного автомата.
Действия Mealy связаны с переходами. Ожидается, что в машинах Mealy вычисления выходных данных будут управляться изменением входных данных. Фактически зависимость выхода от ввода является фундаментальным отличительным фактором между формальными определениями машин Меали и Мура. Требование о том, чтобы действия давались на переходы, является в некоторой степени стилистическим, а не обязательным для применения семантики Mealy. Однако естественно, что выходные вычисления следуют за входными условиями на входе, потому что переходные условия являются в первую очередь входными условиями в любом типе машины.
На следующем рисунке показан пример диаграммы, моделирующей конечный автомат Mealy с использованием MATLAB в качестве языка действий.

Код Verilog ®, созданный для диаграммы Mealy:
always @(posedge clk or posedge reset)
begin : Mealy_Chart_1_process
if (reset == 1'b1) begin
is_Mealy_Chart <= is_Mealy_Chart_IN_S0;
end
else begin
if (enb) begin
is_Mealy_Chart <= is_Mealy_Chart_next;
end
end
end
always @(is_Mealy_Chart, u) begin
is_Mealy_Chart_next = is_Mealy_Chart;
y_1 = 2'b00;
case ( is_Mealy_Chart)
is_Mealy_Chart_IN_S0 :
begin
if (u == 8'sb00000001) begin
y_1 = 2'b00;
is_Mealy_Chart_next = is_Mealy_Chart_IN_S1;
end
end
is_Mealy_Chart_IN_S1 :
begin
if (u == 8'sb00000001) begin
y_1 = 2'b01;
is_Mealy_Chart_next = is_Mealy_Chart_IN_S2;
end
end
is_Mealy_Chart_IN_S2 :
begin
if (u == 8'sb00000001) begin
y_1 = 2'b10;
is_Mealy_Chart_next = is_Mealy_Chart_IN_S3;
end
end
default :
begin
if (u == 8'sb00000001) begin
y_1 = 2'b11;
is_Mealy_Chart_next = is_Mealy_Chart_IN_S0;
end
end
endcase
end
assign y = y_1;
Обе диаграммы Мили и Мура имеют возможность вернуть выходные сигналы к их начальным значениям, когда они иначе не управляются состоянием или переходом. Выберите «Инициализировать выходные данные при каждом пробуждении диаграммы», чтобы включить это поведение. Если эта опция не выбрана, генерируемый код HDL включает дополнительные регистры для хранения выходных значений конечного автомата.
На рисунке показана простая диаграмма Мура с двумя состояниями и одним выводом. Выходной сигнал имеет значение 1 в состоянии A, и его начальное значение 4.

При выборе параметра «Инициализировать выходные данные при каждом пробуждении диаграммы» значение выходного значения возвращается к 4 за исключением случаев, когда конечный автомат находится в состоянии A. Государство A устанавливает выходные данные на 1. При отключении параметра «Инициализировать выходные данные при каждом пробуждении диаграммы» выходное значение не возвращается к 4.
На этом рисунке показан код Verilog, созданный для этой диаграммы Мура, с параметром «Инициализировать выходы при каждом пробуждении диаграммы» и без него.

В таблице показано использование ресурсов этих двух машин Мура, синтезированных для устройства Xilinx ® Vivado ® Virtex 7. При отключении параметра «Инициализация выходов при каждом пробуждении диаграммы» созданный код HDL включает дополнительные регистры для состояния вывода.
| Ресурс | ||
|---|---|---|
| LUTs | 18 | 20 |
| Регистры | 1 | 3 |
| DSPs | 0 | 0 |
| Блок ОЗУ | 0 | 0 |
Диаграмма (поток состояний)