Main Content

State Control ブロックを使用する同期サブシステムの動作

State Control ブロックとは

状態をもち、サブシステム内にイネーブル端子またはリセット端子をもつブロックがある場合、State Control ブロックの [同期] モードを使用して次を行います。

  • ハードウェア上の効率的なイネーブルおよびリセットのシミュレーション動作を提供します。

  • より明確な HDL コードを生成し、ハードウェア上のリソース使用を減らします。

State Control ブロックは、モデルの階層構造における任意のレベルで Simulink® モデルに追加できます。State Control ブロックの設定方法は、状態をもつサブシステム内の他のブロックのシミュレーション動作に影響します。

  • 同期ハードウェア シミュレーション動作の場合、[状態制御][同期] に設定します。

  • 既定の Simulink シミュレーション動作の場合、[状態制御][クラシック] に設定します。

State Control ブロックのモード

機能同期モードクラシック モード

State Control ブロック設定

HDL Subsystems ブロック ライブラリからブロックを追加する場合の既定のブロック設定。

シミュレーション動作は State Control ブロックを使用しないサブシステムと同じです。

Simulink シミュレーション動作

  • Initialize メソッド: 状態を初期化します。

  • Update メソッド: 状態を更新します。

  • Output メソッド: 出力値を計算します。

update メソッドは状態を更新するだけです。output メソッドはタイム ステップごとに出力値を計算します。

たとえば、Enabled Subsystem がある場合、イネーブル信号が低位のときは新しい入力値が処理されるため、出力値は変化します。イネーブル信号が高位の場合、出力値は [クラシック] モードの出力と一致します。

update メソッドは状態を更新し、出力値を計算します。

たとえば、Enabled Subsystem がある場合、出力値はイネーブル信号が低位のときは安定し、イネーブル信号が高位になるときにのみ変化します。

HDL シミュレーション動作

ハードウェア上でより効率的。

ハードウェア上でより非効率的。

HDL コード生成の動作

生成される HDL コードはよりクリーンであり、ハードウェア上のリソース使用が少ない。

たとえば、Enabled Subsystem がある場合、HDL Coder™ は状態更新のたびにバイパス レジスタを生成せず、ハードウェア リソースの使用が少なくなります。

生成される HDL コードはクリーンではなく、より多くのハードウェア リソースを使用する。

たとえば、Enabled Subsystem がある場合、HDL Coder は状態更新のたびにバイパス レジスタを生成し、より多くのハードウェア リソースを使用します。

State Control ブロックの使用条件の詳細については、State Controlを参照してください。

同期モードを使用したサブシステムの同期バッジ

Simulink モデル内のサブシステムが同期セマンティクスを使用しているかどうか確認するには、次を行います。

  • 同期動作を示す記号 S はサブシステムに表示されます。

  • SynchronousStateControl サブシステムをダブルクリックすると、バッジ S が Simulink エディターに表示され、サブシステム内のブロックが同期ハードウェア セマンティクスを使用していることが示されます。

SynchronousStateControl サブシステムと ClassicStateControl サブシステムはそれぞれ [同期] モードと [クラシック] モードで外部リセットとイネーブル端子をもつ Delay ブロックを使用します。

State Control ブロックを使用した HDL コードの生成

次の表に、State Control ブロックの [クラシック] モードと [同期] モードにおいて Delay ブロックから生成された HDL コードの比較を示します。

機能同期モードクラシック モード

HDL コード生成。適用した設定:

  • 言語: Verilog

  • リセット タイプ: 同期


`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 がバイパス レジスタを生成しないためハードウェア リソースの使用量が減ります。

  • update メソッドは状態を更新するだけです。


`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 がバイパス レジスタを生成するためより多くのハードウェア リソースが必要です。

  • update メソッドは状態を更新し、出力値を計算します。

参考