有限ステートマシン - 2020.2 日本語

Vivado Design Suite ユーザー ガイド: System Generator を使用したモデル ベースの DSP デザイン (UG897)

Document ID
UG897
Release Date
2020-11-18
Version
2020.2 日本語

この例では、MCode ブロックと内部ステート変数を使用して有限ステート マシンを作成する方法を示します。次の図に示すステート マシンでは、入力データの 1011 というパターンが検出されます。

図 1. 有限ステート マシンの図

MCode ブロックで使用される M 関数には、現在の入力のステートに基づいて次のステートを算出する遷移関数が含まれています。例 3 とは異なり、この例の M 関数では持続型ステート変数を定義して、MCode ブロックに有限ステート マシンのステートを保存します。次の M コードは、detect1011_w_state.m に含まれる M 関数 detect1011_w_state を定義します。

function matched = detect1011_w_state(din)
% This is the detect1011 function with states for detecting a
% pattern of 1011.

  seen_none = 0; % initial state, if input is 1, switch to seen_1
  seen_1 = 1;    % first 1 has been seen, if input is 0, switch
                 % seen_10
  seen_10 = 2;   % 10 has been detected, if input is 1, switch to
                 % seen_1011
  seen_101 = 3;  % now 101 is detected, is input is 1, 1011 is
                 % detected and the FSM switches to seen_1

  % the state is a 2-bit register
  persistent state, state = xl_state(seen_none, {xlUnsigned, 2, 0});

  % the default value of matched is false
  matched = false;

  switch state
    case seen_none
      if din==1
        state = seen_1;
      else
        state = seen_none;
      end
    case seen_1 % seen first 1
      if din==1
        state = seen_1;
      else
        state = seen_10;
      end
    case seen_10 % seen 10
      if din==1
        state = seen_101;
      else
      % no part of sequence seen, go to seen_none
      state = seen_none;
      end
    case seen_101
      if din==1
        state = seen_1;
        matched = true;
      else
        state = seen_10;
        matched = false;
      end
  end

次の図に、M 関数 detect1101_w_state を使用する MCode ブロックを含むステート マシン サブシステムを示します。

図 2. MCode ブロックを含むサブシステム (コンパイル後)