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 がアクティブな場合、このステートは時間 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 チャートのどちらにも、ステートまたは遷移によって駆動される otherwise に出力信号が存在しない場合に出力信号を初期値に戻すためのオプションがあります。この動作は、[チャート起動ごとに出力を初期化] を選択すると有効になります。このオプションを選択しない場合、生成される HDL コードにステート マシンの出力値を格納するための追加のレジスタが含まれます。

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

[チャート起動ごとに出力を初期化] を選択すると、ステート マシンのステートが A である場合を除き、出力値が 4 に戻ります。ステート A では出力が 1 に設定されます。[チャート起動ごとに出力を初期化] を無効にした場合は、出力値は 4 に戻りません。

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

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

リソース
LUT1820
レジスタ13
DSP00
ブロック RAM00

参考

(Stateflow)

関連するトピック