Stateflow® временные логические операторы (такие как after
, before
, или every
) являются логическими операторами, которые работают с счетчиками повторений событий Stateflow. Временные логические операторы могут появляться только в условиях на переходах, которые происходят из состояний, и в состояниях активности. Хотя временная логика не вводит новые события в модель Stateflow, полезно думать об изменении значения временного логического условия как о событии. Можно использовать временные логические операторы во многих случаях, когда требуется счетчик. Распространенным вариантом использования было бы использование временной логики для реализации счетчика тайм-аута.
Для получения дополнительной информации смотрите Управление выполнением диаграммы с использованием временной логики (Stateflow).
В графике, показанной на следующем рисунке, используется временная логика в проекте для debouncer. Вместо мгновенного переключения между состояниями включения и выключения, график использует два промежуточных состояния и временную логику, чтобы игнорировать переходные процессы. Переход фиксируется на основе тайм-аута.
По умолчанию состояния в Chart Stateflow упорядочены по алфавиту. Упорядоченное расположение состояний в HDL-коде может изменяться, если в HDL-коде включена генерация выходного порта активного состояния. Чтобы включить эту настройку, откройте свойства Chart и установите флажок Create output port for monitoring. Смотрите также Упрощение диаграмм Stateflow путем включения активных Выходов состояния (Stateflow).
Когда вы генерируете VHDL® код, недавно добавленное состояние выбирается как OTHERS
состояние в HDL-коде. В следующем фрагменте кода показан VHDL-код, сгенерированный этим Chart.
Chart_1_output : PROCESS (is_Chart, u, temporalCounter_i1, y_reg) VARIABLE temporalCounter_i1_temp : unsigned(7 DOWNTO 0); BEGIN temporalCounter_i1_temp := temporalCounter_i1; is_Chart_next <= is_Chart; y_reg_next <= y_reg; IF temporalCounter_i1 < 7 THEN temporalCounter_i1_temp := temporalCounter_i1 + 1; END IF; CASE is_Chart IS WHEN IN_tran1 => IF u = 1.0 THEN is_Chart_next <= IN_on; y_reg_next <= 1.0; ELSIF temporalCounter_i1_temp >= 3 THEN is_Chart_next <= IN_off; y_reg_next <= 0.0; END IF; WHEN IN_tran2 => IF temporalCounter_i1_temp >= 5 THEN is_Chart_next <= IN_on; y_reg_next <= 1.0; ELSIF u = 0.0 THEN is_Chart_next <= IN_off; y_reg_next <= 0.0; END IF; WHEN IN_off => IF u = 1.0 THEN is_Chart_next <= IN_tran2; temporalCounter_i1_temp := to_unsigned(0, 8); END IF; WHEN OTHERS => IF u = 0.0 THEN is_Chart_next <= IN_tran1; temporalCounter_i1_temp := to_unsigned(0, 8); END IF; END CASE; temporalCounter_i1_next <= temporalCounter_i1_temp; END PROCESS Chart_1_output;
Графическая функция является функцией, заданной графически блок-схемой. Графические функции находятся на графике вместе со схемами, которые их вызывают. Как MATLAB® функции и функции C, графические функции могут принимать аргументы и возвращать результаты. Графические функции могут вызываться в переходном и состоянии.
Следующий рисунок показывает графическую функцию, которая реализует счетчик 64 на 64.
В следующем фрагменте кода показан VHDL-код, сгенерированный для этой графической функции.
x64_counter_sf : PROCESS (x, y, outx_reg, outy_reg) -- local variables VARIABLE x_temp : unsigned(7 DOWNTO 0); VARIABLE y_temp : unsigned(7 DOWNTO 0); BEGIN outx_reg_next <= outx_reg; outy_reg_next <= outy_reg; x_temp := x; y_temp := y; x_temp := tmw_to_unsigned(tmw_to_unsigned(tmw_to_unsigned(x_temp, 9), 10) + tmw_to_unsigned(to_unsigned(1, 9), 10), 8); IF x_temp < to_unsigned(64, 8) THEN NULL; ELSE x_temp := to_unsigned(0, 8); y_temp := tmw_to_unsigned(tmw_to_unsigned(tmw_to_unsigned(y_temp, 9), 10) + tmw_to_unsigned(to_unsigned(1, 9), 10), 8); IF y_temp < to_unsigned(64, 8) THEN NULL; ELSE y_temp := to_unsigned(0, 8); END IF; END IF; outx_reg_next <= x_temp; outy_reg_next <= y_temp; x_next <= x_temp; y_next <= y_temp; END PROCESS x64_counter_sf;
Диаграммы Stateflow поддерживают как иерархию (состояния, содержащие другие состояния), так и параллелизм (несколько состояний, которые могут быть активны одновременно).
В семантике Stateflow параллелизм не является синонимом параллелизма. Параллельные состояния могут быть активны одновременно, но они выполняются последовательно согласно их порядку выполнения. (Порядок выполнения отображается в правом верхнем углу параллельного состояния).
Для получения подробной информации об иерархии и параллелизме смотрите Иерархию объектов Stateflow (Stateflow) и Порядок выполнения для параллельных состояний (Stateflow).
Для генерации HDL-кода весь график преобразуется в один выходной процесс расчета. В рамках выходного процесса расчета:
Выполнение параллельных состояний протекает последовательно.
Вложенные иерархические состояния сопоставлены с вложенными CASE
операторы в сгенерированном HDL-коде.
Графики, состоящие из чистых блок-схем (то есть графиков без состояний), полезны при захвате if-then-else
конструкции, используемые в процедурных языках, таких как C.
В качестве примера рассмотрим следующую логику, выраженную в C-подобном псевдокоде.
if(U1==1) { if(U2==1) { Y = 1; }else{ Y = 2; } }else{ if(U2<2) { Y = 3; }else{ Y = 4; } }
Следующий рисунок показывает блок-схему, которая реализует if-then-else
логика.
Следующий сгенерированный фрагмент кода VHDL показывает вложенные операторы IF-ELSE, полученные из блок-схемы.
Chart : PROCESS (Y1_reg, Y2_reg, U1, U2) -- local variables BEGIN Y1_reg_next <= Y1_reg; Y2_reg_next <= Y2_reg; IF unsigned(U1) = to_unsigned(1, 8) THEN IF unsigned(U2) = to_unsigned(1, 8) THEN Y1_reg_next <= to_unsigned(1, 8); ELSE Y1_reg_next <= to_unsigned(2, 8); END IF; ELSIF unsigned(U2) < to_unsigned(2, 8) THEN Y1_reg_next <= to_unsigned(3, 8); ELSE Y1_reg_next <= to_unsigned(4, 8); END IF; Y2_reg_next <= tmw_to_unsigned(tmw_to_unsigned(tmw_to_unsigned(unsigned(U1), 9),10) + tmw_to_unsigned(tmw_to_unsigned(unsigned(U2), 9), 10), 8); END PROCESS Chart;
HDL Coder™ поддерживает генерацию HDL-кода для:
Таблица истинности функционирует в рамках диаграммы Stateflow
Truth Table (Stateflow) блоки в Simulink® модели
В этом разделе рассматривается функция Таблицы истинности на графике и VHDL- кода, сгенерированный для диаграммы.
Таблицы истинности хорошо подходят для реализации компактной комбинаторной логики. Типичным приложением для таблиц истинности является реализация нелинейного квантования или пороговой логики. Примите во внимание следующую логику:
Y = 1 when 0 <= U <= 10 Y = 2 when 10 < U <= 17 Y = 3 when 17 < U <= 45 Y = 4 when 45 < U <= 52 Y = 5 when 52 < U
График без статуса с одним вызовом функции Truth Table может представлять эту логику кратко.
Следующий рисунок показывает quantizer
график, содержащая Truth Table.
Следующий рисунок показывает пороговую логику, отображаемую в редакторе таблиц истинности.
В следующем фрагменте кода показан VHDL-код, сгенерированный для quantizer
график.
quantizer : PROCESS (Y_reg, U) -- local variables VARIABLE aVarTruthTableCondition_1 : std_logic; VARIABLE aVarTruthTableCondition_2 : std_logic; VARIABLE aVarTruthTableCondition_3 : std_logic; VARIABLE aVarTruthTableCondition_4 : std_logic; BEGIN Y_reg_next <= Y_reg; -- Condition #1 aVarTruthTableCondition_1 := tmw_to_stdlogic(unsigned(U) <= to_unsigned(10, 8)); -- Condition #2 aVarTruthTableCondition_2 := tmw_to_stdlogic(unsigned(U) <= to_unsigned(17, 8)); -- Condition #3 aVarTruthTableCondition_3 := tmw_to_stdlogic(unsigned(U) <= to_unsigned(45, 8)); -- Condition #4 aVarTruthTableCondition_4 := tmw_to_stdlogic(unsigned(U) <= to_unsigned(52, 8)); IF tmw_to_boolean(aVarTruthTableCondition_1) THEN -- D1 -- Action 1 Y_reg_next <= to_unsigned(1, 8); ELSIF tmw_to_boolean(aVarTruthTableCondition_2) THEN -- D2 -- Action 2 Y_reg_next <= to_unsigned(2, 8); ELSIF tmw_to_boolean(aVarTruthTableCondition_3) THEN -- D3 -- Action 3 Y_reg_next <= to_unsigned(3, 8); ELSIF tmw_to_boolean(aVarTruthTableCondition_4) THEN -- D4 -- Action 4 Y_reg_next <= to_unsigned(4, 8); ELSE -- Default -- Action 5 Y_reg_next <= to_unsigned(5, 8); END IF; END PROCESS quantizer;
Примечание
При генерации кода для блока Truth Table (Stateflow) в модели Simulink HDL Coder записывает отдельный файл сущности/архитектуры для кода Truth Table. Файл имеет имя Truth_Table.vhd
(для VHDL) или Truth_Table.v
(для Verilog®).
Sequence Viewer (Stateflow) | State Transition Table (Stateflow) | Truth Table (Stateflow)