Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

Mealy および Moore 有限ステート マシンでの HDL 生成

Stateflow® チャートは、3 つのタイプのステート マシンのモデル化をサポートしています。

  • Classic (既定の設定)

  • Mealy

  • Moore

HDL コードの生成には、Mealy タイプまたは Moore タイプのステート マシンを使用します。Mealy および Moore ステート マシンは、次の点で異なっています。

  • Mealy ステート マシンの出力は、現在のステートと入力の関数。

  • Moore ステート マシンの出力は、現在のステートのみの関数。

Mealy または Moore チャートを Classic チャートの代替として使用する主な利点は、次のとおりです。

  • Moore チャートは、Classic チャートよりも効率的なコードを生成できる。

  • コンパイル時に、Mealy および Moore チャートは正式な定義とセマンティクス ルールに一致しているか検証され、違反は報告される。

チャートの HDL コード生成ガイドラインの詳細については、Chart (Stateflow) ブロックを参照してください。

Mealy チャートと Moore チャートをモデル化する方法を示す例は、hdlcoder_fsm_mealy_moore モデルを開きます。

Moore 有限ステート マシン用の HDL コードの生成

Moore ステート マシンをモデル化するチャートの HDL コードを生成する場合は、次の条件が適用されます。

  • チャートが、Chart (Stateflow) ブロックで説明されているコード生成の一般的な要件を満たしていなければなりません。

  • アクションが発生するのはステートのみでなければなりません。これらはラベル付けされていないアクションでなければなりません。

    出力計算は入力ではなくステートのみに依存するため、Moore アクションは、ステートと関連付けられなければなりません。タイム ステップ t のアクティブ ステートの構成によって出力が決まります。チャートが時間 t に起動したときにステート S がアクティブな場合、ステート S は時間 t+1 までアクティブなままかどうかに関係なく、出力に関与します。

  • Simulink® 関数を再帰的に呼び出さないでください。

    この制限によって、出力が入力に依存するために HDL コード ジェネレーターでの検証が困難になるのを防ぎます。

  • [チャート起動ごとに出力を初期化] パラメーターを無効にすると、生成される HDL コードにステート マシンの出力値のための追加のレジスタが含まれます。

次の図は、MATLAB® をアクション言語として使用する Moore ステート マシンの Stateflow チャートを示しています。

Mealy 有限ステート マシン用の HDL の生成

Mealy ステート マシンをモデル化するチャートの HDL コードを生成する場合は、次の条件が適用されます。

  • チャートが、Chart (Stateflow) ブロックで説明されているコード生成の一般的な要件を満たしていなければなりません。

  • アクションが内部遷移と外部遷移のみに関連付けられていなければなりません。

  • [チャート起動ごとに出力を初期化] パラメーターを無効にすると、生成される HDL コードにステート マシンの出力値のための追加のレジスタが含まれます。

Mealy のアクションは遷移に関連付けられます。Mealy マシンでは、入力値の変更により出力計算が駆動されます。この出力の入力への依存は、Mealy マシンと Moore マシンの正式な定義を区別する基本的な要素となっています。アクションが遷移の結果発生するという要件は、Mealy セマンティクスを適用するうえで、必須というよりは、ある程度様式的といえます。どのマシン タイプでも遷移の条件は基本的に入力条件であるため、どちらのタイプでも出力計算は最終的に入力条件に従うことになります。

次の図は、MATLAB をアクション言語として使用する Mealy ステート マシンをモデル化するチャートの例を示しています。

次のコードは、Mealy チャート用に生成された Verilog® コードです。

  always @(posedge clk or posedge reset)
    begin : Mealy_Chart_1_process
      if (reset == 1'b1) begin
        is_Mealy_Chart <= is_Mealy_Chart_IN_S0;
      end
      else begin
        if (enb) begin
          is_Mealy_Chart <= is_Mealy_Chart_next;
        end
      end
    end

  always @(is_Mealy_Chart, u) begin
    is_Mealy_Chart_next = is_Mealy_Chart;
    y_1 = 2'b00;
    case ( is_Mealy_Chart)
      is_Mealy_Chart_IN_S0 :
        begin
          if (u == 8'sb00000001) begin
            y_1 = 2'b00;
            is_Mealy_Chart_next = is_Mealy_Chart_IN_S1;
          end
        end
      is_Mealy_Chart_IN_S1 :
        begin
          if (u == 8'sb00000001) begin
            y_1 = 2'b01;
            is_Mealy_Chart_next = is_Mealy_Chart_IN_S2;
          end
        end
      is_Mealy_Chart_IN_S2 :
        begin
          if (u == 8'sb00000001) begin
            y_1 = 2'b10;
            is_Mealy_Chart_next = is_Mealy_Chart_IN_S3;
          end
        end
      default :
        begin
          if (u == 8'sb00000001) begin
            y_1 = 2'b11;
            is_Mealy_Chart_next = is_Mealy_Chart_IN_S0;
          end
        end
    endcase
  end

  assign y = y_1;

チャート起動ごとに出力を初期化

Mealy チャートと Moore チャートには、出力信号がステートまたは遷移によって駆動されない場合に出力信号を初期値に戻すためのオプションがあります。この動作は、[チャート起動ごとに出力を初期化] パラメーターをオンにすると有効になります。このパラメーターをオフにすると、生成される HDL コードにステート マシンの出力値を格納するための追加のレジスタが含まれます。

次の図は、2 つのステートと 1 つの出力をもつシンプルな Moore チャートを示しています。出力はステート A1 に設定され、出力の初期値は 4 です。

[チャート起動ごとに出力を初期化] パラメーターをオンにすると、ステート マシンのステートが A である場合を除き、出力値が 4 に戻ります。ステート A では出力が 1 に設定されます。[チャート起動ごとに出力を初期化] パラメーターをオフにした場合は、マシンがステート A を通過した後も出力値は 1 のままになり、4 に戻りません。

次の図は、この Moore チャートに対して生成される Verilog コードについて、[チャート起動ごとに出力を初期化] をオンにした場合のコードとオフにした場合のコードをそれぞれ示しています。

次の表に、これらの 2 つの Moore マシンを Xilinx® Vivado® Virtex 7 デバイス用に合成した場合のリソースの使用を示します。[チャート起動ごとに出力を初期化] をオフにすると、生成される HDL コードに出力のステートのための追加のレジスタが含まれます。

リソース[チャート起動ごとに出力を初期化] をオンにした場合[チャート起動ごとに出力を初期化] をオフにした場合
LUT1820
レジスタ13
DSP00
ブロック RAM00

参考

(Stateflow)

関連するトピック