Проект шаблонов с использованием расширенных функций графика

Временная логика

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®).

См. также

(Stateflow) | (Stateflow) | (Stateflow)

Похожие примеры

Подробнее о