Синхронное поведение подсистемы с блоком управления состоянием

Что такое блок управления состоянием?

Когда у вас есть блоки с состоянием, и вы имеете включать или сбрасывать порты внутри подсистемы, используйте Synchronous режим блока State Control для:

  • Обеспечьте эффективное включение и сброс поведения симуляции на оборудовании.

  • Сгенерируйте более чистый HDL-код и используйте меньше ресурсов на оборудовании.

Можно добавить блок State Control в Simulink® модель на любом уровне иерархии модели. Как вы устанавливаете State Control блок, влияет на поведение симуляции других блоков внутри подсистемы, которые имеют состояние.

  • Для поведения симуляции синхронного оборудования установите State control равным Synchronous.

  • Для поведения симуляции Simulink по умолчанию задайте State control Classic.

Режимы блока управления состоянием

ФункциональностьСинхронный режимКлассический режим
State Control блокаНастройка блоков по умолчанию при добавлении блока из библиотеки блоков HDL-подсистем. Поведение симуляции аналогично поведению подсистемы, которая не использует блок State Control.
Поведение симуляции Simulink
  • Инициализируйте метод: Инициализирует состояния.

  • Метод обновления: Обновляет состояния.

  • Метод выхода: Вычисляет выходные значения.

Метод обновления обновляет только состояния. Метод выхода вычисляет выходные значения на каждом временном шаге.

Для примера, когда вы активировали подсистемы, значение выхода изменяется, когда сигнал включения низок, когда он обрабатывает новые значения входа. Значение выхода соответствует выходу от Classic режим, когда сигнал включения становится высоким.

Метод обновления обновляет состояния и вычисляет выходные значения.

Для примера, когда вы активировали подсистемы, значение выхода остается стабильным, когда сигнал включения низок и изменяется только, когда сигнал включения становится высоким.

Поведение HDL- симуляцииБолее эффективный на оборудовании.Менее эффективный на оборудовании.
Поведение генерации HDL-кода

Сгенерированный HDL-код является более чистым и использует меньше ресурсов на оборудовании.

Например, когда вы включили подсистемы, HDL- Coder™ не генерирует реестры обхода для каждого обновления состояния и использует меньше аппаратных ресурсов.

Сгенерированный HDL-код не настолько чистый и использует больше аппаратных ресурсов.

Например, когда вы включили подсистемы, HDL Coder генерирует реестры обхода для каждого обновления состояния и использует больше ресурсов.

Дополнительные сведения о том, когда можно использовать блок State Control, см. в разделе Управление состояниями.

Синхронный значок для подсистем при помощи синхронного режима

Чтобы увидеть, использует ли подсистема в вашей модели Simulink синхронную семантику:

  • Символ S отображается в подсистеме, чтобы указать синхронное поведение.

  • Если дважды кликнуть подсистему SynchronousStateControl, в редакторе Simulink появится значок S, указывающий, что блоки внутри подсистемы используют синхронную аппаратную семантику.

Подсистемы SynchronousStateControl и ClassicStateControl используют блок Delay с внешним сбросом и портом включения в Synchronous и Classic режимы соответственно.

Сгенерируйте HDL-код с блоком управления состоянием

В следующей таблице показано сравнение HDL-кода, сгенерированного из блока Delay для Classic и Synchronous режимы блока State Control.

ФункциональностьСинхронный режимКлассический режим
Генерация HDL-кода. Примененные настройки:
  • Language: Verilog

  • Reset type: Synchronous


`timescale 1 ns / 1 ns

module SynchronousStateControl
          (
           clk,
           reset,
           enb,
           DataIn,
           EnableIn,
           ResetIn,
           DataOut
          );


  input   clk;
  input   reset;
  input   enb;
  input   signed [7:0] DataIn;  // int8
  input   EnableIn;
  input   ResetIn;
  output  signed [7:0] DataOut;  // int8


  reg signed [7:0] Delay_Synchronous_reg [0:1];  // sfix8 [2]
  wire signed [7:0] Delay_Synchronous_reg_next [0:1];  // sfix8 [2]
  wire signed [7:0] Delay_Synchronous_out1;  // int8


  always @(posedge clk)
    begin : Delay_Synchronous_process
      if (reset == 1'b1 || ResetIn == 1'b1) begin
        Delay_Synchronous_reg[0] <= 8'sb00000000;
        Delay_Synchronous_reg[1] <= 8'sb00000000;
      end
      else begin
        if (enb && EnableIn) begin
          Delay_Synchronous_reg[0] <= Delay_Synchronous_reg_next[0];
          Delay_Synchronous_reg[1] <= Delay_Synchronous_reg_next[1];
        end
      end
    end

  assign Delay_Synchronous_out1 = Delay_Synchronous_reg[1];
  assign Delay_Synchronous_reg_next[0] = DataIn;
  assign Delay_Synchronous_reg_next[1] = Delay_Synchronous_reg[0];



  assign DataOut = Delay_Synchronous_out1;

endmodule  // SynchronousStateControl




  • Сгенерированный HDL-код чище и требует меньше аппаратных ресурсов, так как HDL Coder не генерирует реестры обхода.

  • Метод обновления обновляет только состояния.


`timescale 1 ns / 1 ns

module ClassicStateControl
          (
           clk,
           reset,
           enb,
           DataIn,
           EnableIn,
           ResetIn,
           DataOut
          );


  input   clk;
  input   reset;
  input   enb;
  input   signed [7:0] DataIn;  // int8
  input   EnableIn;
  input   ResetIn;
  output  signed [7:0] DataOut;  // int8


  reg signed [7:0] Delay_Synchronous_bypass;  // sfix8
  reg signed [7:0] Delay_Synchronous_reg [0:1];  // sfix8 [2]
  wire signed [7:0] Delay_Synchronous_bypass_next;  // sfix8
  wire signed [7:0] Delay_Synchronous_reg_next [0:1];  // sfix8 [2]
  wire signed [7:0] Delay_Synchronous_delay_out;  // sfix8
  wire signed [7:0] Delay_Synchronous_out1;  // int8


  always @(posedge clk)
    begin : Delay_Synchronous_process
      if (reset == 1'b1 || ResetIn == 1'b1) begin
        Delay_Synchronous_bypass <= 8'sb00000000;
        Delay_Synchronous_reg[0] <= 8'sb00000000;
        Delay_Synchronous_reg[1] <= 8'sb00000000;
      end
      else begin
        if (enb && EnableIn) begin
          Delay_Synchronous_bypass <= Delay_Synchronous_bypass_next;
          Delay_Synchronous_reg[0] <= Delay_Synchronous_reg_next[0];
          Delay_Synchronous_reg[1] <= Delay_Synchronous_reg_next[1];
        end
      end
    end

  assign Delay_Synchronous_delay_out = (ResetIn == 1'b1 ? 8'sb00000000 :
              Delay_Synchronous_reg[1]);
  assign Delay_Synchronous_out1 = (EnableIn == 1'b1 ? Delay_Synchronous_delay_out :
              Delay_Synchronous_bypass);
  assign Delay_Synchronous_bypass_next = Delay_Synchronous_delay_out;
  assign Delay_Synchronous_reg_next[0] = DataIn;
  assign Delay_Synchronous_reg_next[1] = Delay_Synchronous_reg[0];



  assign DataOut = Delay_Synchronous_out1;

endmodule  // ClassicStateControl


  • Сгенерированный HDL-код менее чистый и требует больших аппаратных ресурсов, так как HDL Coder генерирует реестры обхода.

  • Метод обновления обновляет состояния и вычисляет выходные значения.

Включите и сбросьте Оборудование Симуляции поведение

Обратитесь к вышеприведенной модели Simulink, которая показывает блок Delay, который использует Classic и Synchronous режимы блока State Control. Следующая схема показывает ModelSim® симуляция для блока Delay.

  • Когда ResetIn сигнал высок, сигналы DataClassic и DataSynchronous выдают один и тот же выход.

  • Когда и ResetIn, и EnableIn сигналы низки, DataSynchronous сигнал удерживает свое значение и изменяется только, когда EnableIn сигнал становится высоким на следующем активном ребре синхроимпульса. DataClassic значений сигналов измениться, когда сигнал EnableIn низок, когда он обрабатывает новые значения входа. DataClassic значений сигналов совпадать с DataSynchronous значений сигналов, когда EnableIn становится высоким.

Для получения информации о том, как сгенерировать HDL-код и симулировать ваш проект в ModelSim, смотрите Генерация HDL-кода из модели Simulink.

См. также