Когда у вас есть блоки с состоянием, и вы имеете включать или сбрасывать порты внутри подсистемы, используйте Synchronous режим блока State Control для:
Обеспечьте эффективное включение и сброс поведения симуляции на оборудовании.
Сгенерируйте более чистый HDL-код и используйте меньше ресурсов на оборудовании.
Можно добавить блок State Control в Simulink® модель на любом уровне иерархии модели. Как вы устанавливаете State Control блок, влияет на поведение симуляции других блоков внутри подсистемы, которые имеют состояние.
Для поведения симуляции синхронного оборудования установите State control равным Synchronous.
Для поведения симуляции Simulink по умолчанию задайте State control Classic.
| Функциональность | Синхронный режим | Классический режим |
|---|---|---|
| State Control блока | Настройка блоков по умолчанию при добавлении блока из библиотеки блоков HDL-подсистем. | Поведение симуляции аналогично поведению подсистемы, которая не использует блок State Control. |
Поведение симуляции Simulink
| Метод обновления обновляет только состояния. Метод выхода вычисляет выходные значения на каждом временном шаге. Для примера, когда вы активировали подсистемы, значение выхода изменяется, когда сигнал включения низок, когда он обрабатывает новые значения входа. Значение выхода соответствует выходу от | Метод обновления обновляет состояния и вычисляет выходные значения. Для примера, когда вы активировали подсистемы, значение выхода остается стабильным, когда сигнал включения низок и изменяется только, когда сигнал включения становится высоким. |
| Поведение HDL- симуляции | Более эффективный на оборудовании. | Менее эффективный на оборудовании. |
| Поведение генерации HDL-кода | Сгенерированный HDL-код является более чистым и использует меньше ресурсов на оборудовании. Например, когда вы включили подсистемы, HDL- Coder™ не генерирует реестры обхода для каждого обновления состояния и использует меньше аппаратных ресурсов. | Сгенерированный HDL-код не настолько чистый и использует больше аппаратных ресурсов. Например, когда вы включили подсистемы, HDL Coder генерирует реестры обхода для каждого обновления состояния и использует больше ресурсов. |
Дополнительные сведения о том, когда можно использовать блок State Control, см. в разделе Управление состояниями.
Чтобы увидеть, использует ли подсистема в вашей модели Simulink синхронную семантику:
Символ S отображается в подсистеме, чтобы указать синхронное поведение.

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

Подсистемы SynchronousStateControl и ClassicStateControl используют блок Delay с внешним сбросом и портом включения в Synchronous и Classic режимы соответственно.
В следующей таблице показано сравнение HDL-кода, сгенерированного из блока Delay для Classic и Synchronous режимы блока State Control.
| Функциональность | Синхронный режим | Классический режим |
|---|---|---|
Генерация HDL-кода. Примененные настройки:
|
`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
|
`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
|
Обратитесь к вышеприведенной модели Simulink, которая показывает блок Delay, который использует Classic и Synchronous режимы блока State Control. Следующая схема показывает ModelSim® симуляция для блока Delay.

Когда ResetIn сигнал высок, сигналы DataClassic и DataSynchronous выдают один и тот же выход.
Когда и ResetIn, и EnableIn сигналы низки, DataSynchronous сигнал удерживает свое значение и изменяется только, когда EnableIn сигнал становится высоким на следующем активном ребре синхроимпульса. DataClassic значений сигналов измениться, когда сигнал EnableIn низок, когда он обрабатывает новые значения входа. DataClassic значений сигналов совпадать с DataSynchronous значений сигналов, когда EnableIn становится высоким.
Для получения информации о том, как сгенерировать HDL-код и симулировать ваш проект в ModelSim, смотрите Генерация HDL-кода из модели Simulink.