bitGateLab Digital · 学ぶ
日本語
シミュレータを開く

学ぶ › トピック 11

ムーア型とミーリ型のステートマシン:設計の全手順

読了時間:約 7 分 · bitGateLab チーム

有限状態機械(FSM、ステートマシン)とは、処理がいまどの段階にあるかを「覚えている」順序回路です。信号機、暗証番号式の錠、エレベータの制御装置、シリアル通信の受信回路は、どれもステートマシンです。この記事では、古典的な二つのモデルであるムーア型とミーリ型を取り上げ、101 という系列の検出器を題材に、言葉による仕様からフリップフロップの式まで、設計の全手順をたどります。

ステートマシンの構成要素

同期式の FSM は、どれも三つのブロックからなります。

二つのモデルの違いは、最後のブロックにあります。

ミーリ型は、たいてい状態数が少なくて済み、入力が届いたのと同じサイクルで応答しますが、入力が変化すれば出力もいつでも変化しうるという性質があります。ムーア型は応答が 1 サイクル遅れますが、出力はクロックエッジの直後にしか変化しないので、よりきれいな信号になります。

課題:101 系列検出器

直列入力 X が、クロックに同期して 1 サイクルに 1 ビットずつ届きます。出力 Z は、最後に受け取った三つのビットが 1、0、1 になるたびに 1 にならなければなりません。重なり(オーバーラップ)を許します。つまり 10101 という列では検出が二回起こります。最初の系列の最後の 1 が、次の系列の先頭を兼ねるからです。

最初のステップは、マシンが何を覚えておくべきかを決めることです。各状態は「系列のどこまで進んだか」を表します。

状態遷移図と状態表(ムーア型)

各状態と X の各値について、こう考えます。この新しいビットを加えたとき、101 の先頭部分と一致する最も長い接尾辞(末尾の部分列)はどれか。その接尾辞が次の状態を決めます。

S0/0 S1/0 S2/0 S3/1 1 0 1 0 1 0 0 1
重なりを許すムーア型の 101 検出器。矢印の上の数字は X の値で、出力は各状態の中に書いてあります。
現在の状態X = 0X = 1Z
S0S0S10
S1S2S10
S2S0S30
S3S2S11

間違えやすい二つの遷移に注目してください。S1 でもう一つ 1 が届いた場合、列の末尾は 11 になり、最後の 1 は引き続き系列の先頭として使えるので、マシンは S1 にとどまります。S3 で 0 が届いた場合、列の末尾は 1010 になり、その接尾辞 10 が 101 の先頭部分と一致するので、S0 ではなく S2 に進みます。これが重なりの検出を可能にしています。

状態割り当てと式

状態が 4 個なら、D フリップフロップ 2 個(Q1 Q0)で足ります。最も素直な割り当ては 2 進の割り当てで、S0 = 00、S1 = 01、S2 = 10、S3 = 11 とします。D フリップフロップでは D = Q+ なので、励起表は自明です。

Q1Q0XQ1+ = D1Q0+ = D0
00000
00101
01010
01101
10000
10111
11010
11101

簡単化:

  • D0 が 1 になるのは、ちょうど X = 1 の行なので、D0 = X です。これは理にかなっています。この割り当てでは、Q0 = 1 は「最後のビットが 1 だった」ことを意味するからです。
  • D1 = Σm(2, 5, 6) です(変数の順は Q1 Q0 X)。最小項 2(010)と 6(110)は隣接していて、Q0·X になります。5(101)には 1 の隣接セルがないので単独で残り、Q1·Q0·X です。D1 = Q0·X + Q1·Q0·X。
  • ムーア型の出力は状態だけで決まります。Z = Q1·Q0。

回路は、D フリップフロップ 2 個、Z 用の 2 入力 AND 一つ、そして D1 用に 2 入力 AND 一つ、3 入力 AND 一つ、2 入力 OR 一つ(加えて Q0 と X のインバータ)で構成されます。

テスト系列による検証

入力 X = 1 0 1 0 1 1 0 1 を、S0 から始めて与えます。各エッジの後の状態は次のとおりです。

エッジ12345678
X10101101
状態S1S2S3S2S3S1S2S3
Z00101001

検出は三回あります。ビット 1〜3、ビット 3〜5(重なり)、ビット 6〜8 です。エッジ 4 を式で確かめましょう。状態 S3 = 11、X = 0 のとき、D1 = 1·1 + 1·0·0 = 1、D0 = 0 で、次の状態は 10 = S2 です。一致します。

ミーリ型による実現

ミーリ型では出力を遷移に書くので、状態 S3 は不要になります。検出は「S2 にいるときに 1 が届いた時点」で起こります。三つの状態 A(何もなし)、B(最後のビットが 1)、C(最後の二つのビットが 1、0)を使うと、次のようになります。

状態X = 0X = 1
AA / 0B / 0
BC / 0B / 0
CA / 0B / 1

フリップフロップはやはり 2 個必要ですが、出力 Z = 1 は最後の 1 が届いたのと同じサイクルで現れ、ムーア型より 1 サイクル早くなります。

よくある間違い

シミュレータで試してみよう

式さえ求まれば、検出器を組むのに数分しかかかりません。タイミング図で、遷移を一つずつ確認できます。

  1. 同じクロックにつないだ D フリップフロップを二つ置き、出力に Q1、Q0 と名前を付けます。
  2. 入力 X を D0 に直接つなぎます。
  3. インバータ二つ、AND 二つ、OR 一つで D1 = Q0·X + Q1·Q0·X を組み、D1 につなぎます。
  4. Q1 と Q0 の AND を、Z 用の表示 LED につなぎます。
  5. 系列 1 0 1 0 1 1 0 1 に従って各エッジの前に X を切り替え、エッジ 3、5、8 の後に Z が点灯することをタイミング図で確かめます。

練習問題

  1. 重なりを許す場合、1010101 という列の中で、マシンは 101 を何回検出しますか。
    解答

    三回です。ビット 1〜3、3〜5、5〜7 で検出します。

  2. 重なりを許さない場合(検出のたびに最初からやり直す)について、101 検出器のムーア型の状態表を作り直してください。
    解答

    変わるのは S3 の行だけです。X = 0 なら S0 に、X = 1 なら S1 に進みます。ほかの行はそのままです。

  3. ミーリ型で A = 00、B = 01、C = 10 と割り当てたとき、Z を求めてください。
    解答

    Z = 1 になるのは、状態 C で X = 1 のときだけです。Z = Q1·Q0·X。コード 11 が決して現れないならドントケア(X)として扱えるので、Z = Q1·X になります。

  4. 状態が 9 個のステートマシンには、フリップフロップが最低いくつ必要ですか。
    解答

    4 個です。23 = 8 では足りず、24 = 16 なら足りるからです。

状態レジスタを構成するフリップフロップを復習するには、ラッチとフリップフロップを参照してください。