ミーリ型とムーア型のステートマシンの違い:出力・タイミング・状態数・HDLの書き方を比較

ステートマシン(状態機械)は、今の状態を覚えるレジスタ、次の状態を決める組み合わせ回路、出力を決める組み合わせ回路からなります。ミーリ型とムーア型の違いは、出力が何で決まるかです。ミーリ型では、出力が今の状態と今の入力の両方で決まり、入力の変化が同じサイクルのうちに出力に表れます。ムーア型では、出力が今の状態だけで決まり、入力の変化はクロックで状態が変わってから出力に表れるので、反応が1サイクル遅れます。ミーリ型は状態が少なく反応が速いこと、ムーア型は出力が安定してタイミングを予測しやすいことが特徴です。

項目ミーリ型ムーア型
出力を決めるもの今の状態と今の入力今の状態だけ
状態遷移図での出力の書き方遷移の矢印に「入力/出力」の形で書く状態の丸の中に、状態名と一緒に書く
入力への反応入力が変わると、クロックを待たずに同じサイクルのうちに出力が変わる次のクロックで状態が変わってから出力が変わる。ミーリ型より1サイクル遅れる
状態の数(「101」を重なりありで検出する例)3状態(何も一致していない、1まで一致、10まで一致)4状態(出力1を表す「101を検出」の状態が別に必要)
状態の数(一般)同じ働きなら、ムーア型と同じか少ないミーリ型の状態を、入ってくる遷移の出力ごとに分ける必要があり、多くなりやすい
グリッチと雑音入力のグリッチや雑音が、組み合わせ回路を通ってそのまま出力に表れる入力の雑音は出力に伝わらない。出力を状態レジスタのビットから直接取り出すように符号化すれば、出力のグリッチもなくせる
タイミングの経路入力から出力まで組み合わせ回路がつながり、前後の回路を含めた経路が長くなる。ミーリ型どうしをつなぐと組み合わせループができることがある出力はクロックのエッジの後の状態だけで決まるので、経路がレジスタで区切られ、タイミングを解析しやすい
HDLでの書き方出力を決める組み合わせ回路のブロックで、状態に加えて入力も参照する出力の式は状態だけを参照する(case文で状態ごとに出力を決めるなど)。出力をレジスタから出すことも多い
向いている用途入力に1サイクルも遅れずに応答したい制御、状態の数を減らしたいとききれいな出力が必要な制御信号(別のクロックの回路やチップの外へ出す信号など)、タイミングを予測しやすくしたいとき

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

ミーリ型
入力に同じサイクルで応答したいときや、状態の数を少なくしたいときに向いています。入力は先にクロックに同期化しておき、出力は同じクロックのフリップフロップで受けるなど、一時的なグリッチが問題にならない使い方にします。出力をフリップフロップで受け直すとグリッチは消えますが、タイミングはムーア型と同じく1サイクル遅れます。
ムーア型
出力の安定性とタイミングの予測しやすさを重視するときに向いています。入力の雑音が出力に伝わらないので、重要な制御信号や外部へ出す信号に使いやすくなります。反応が1サイクル遅れる点と、状態が増えやすい点を考えて選びます。実際の設計では、出力ごとにミーリ型とムーア型を使い分けたり、組み合わせたりします。

よくある質問

「1サイクル遅れる」とは、具体的にどういうことですか?

「101」を検出する回路で考えると、ミーリ型は「10まで一致」の状態で入力が1になったサイクルのうちに出力を1にします。ムーア型は、その1をクロックのエッジで取り込んで「101を検出」の状態に移ってから出力が1になるので、出力が1になるのは次のサイクルです。どちらも同じ入力列を同じように検出しますが、ムーア型の出力はミーリ型より1サイクル後ろにずれます。

ミーリ型とムーア型は互いに変換できますか?

できます。ミーリ型の状態を、そこへ入る遷移の出力ごとに分けてムーア型の状態にすれば、同じ入出力の関係が得られますが、状態が増えることがあり、出力は1サイクル遅れて表れます。逆に、ムーア型の各状態の出力を、その状態へ入る遷移の出力として書き直せばミーリ型になり、出力は1サイクル早く表れます。このとき状態をまとめられる場合もあります。

HDLの記述で、ミーリ型かムーア型かはどこで決まりますか?

出力を決める式で決まります。状態レジスタを更新するブロックと、次の状態や出力を決める組み合わせ回路のブロックに分けて書いたとき、出力の式に入力が含まれていればミーリ型、状態だけで決まっていればムーア型です。組み合わせ回路のブロックでは、すべての条件で出力に値を代入して、意図しないラッチを作らないようにします。

ムーア型なら、出力にグリッチは出ませんか?

入力の変化や雑音は出力に伝わりませんが、状態から出力を作る組み合わせ回路があると、状態が変わる瞬間に複数のビットが同時に変わって、グリッチが出ることがあります。出力を状態レジスタのビットからそのまま取り出す符号化にするか、出力をフリップフロップで受け直せば、グリッチのない出力にできます。

理解度チェック

ミーリ型の状態機械の特徴として正しいものはどれか。

  1. A出力が今の状態だけで決まり、入力が変わっても次のクロックまで出力は変わらない
  2. B出力が今の状態と入力の両方で決まるので、入力の変化が同じサイクルのうちに出力に表れる
  3. C状態を持たない組み合わせ回路である
答えと解説を見る

正解:B. 出力が今の状態と入力の両方で決まるので、入力の変化が同じサイクルのうちに出力に表れる

ミーリ型では、出力の論理が今の状態に加えて入力も見るので、入力が変わればクロックを待たずに出力が変わり、1サイクル早く反応できます。状態の数が少なくて済むこともあります。一方で、入力から出力まで組み合わせ回路の経路がつながるので、入力の雑音が出力に表れたり、タイミングの経路が長くなったりします。出力をフリップフロップで受け直して使うこともあります。

出力が現在の状態だけで決まる順序回路(ステートマシン)の型はどれか。

  1. Aミーリ型
  2. Bムーア型
  3. Cハーバード型
答えと解説を見る

正解:B. ムーア型

ムーア型では出力が現在の状態だけで決まり、ミーリ型では状態と入力の両方で決まります。ムーア型は出力がクロックのエッジの後にしか変わらず、入力の変化やグリッチが出力に直接伝わらないので安定し、タイミングも予測しやすい反面、入力への反応が1クロック遅れ、状態数が増えがちです。ミーリ型は状態数を減らせて入力に即座に反応できますが、入力の変化が出力に直接伝わります。実際の設計では両者を組み合わせて使います。

HDLで書く状態機械(ステートマシン)の基本的な構成として正しいものはどれか。

  1. A状態を覚えるメモリだけで、論理回路は使わない
  2. B出力を決める回路だけで、状態は覚えない
  3. C今の状態を覚えるレジスタ、次の状態を決める組み合わせ回路、出力を決める組み合わせ回路
答えと解説を見る

正解:C. 今の状態を覚えるレジスタ、次の状態を決める組み合わせ回路、出力を決める組み合わせ回路

状態機械は、今の状態をフリップフロップのレジスタに覚えておき、今の状態と入力から次の状態を組み合わせ回路で決め、クロックのエッジで状態を更新します。出力は今の状態(と入力)から組み合わせ回路で決めます。通信の手順の制御や、自動販売機、信号機の制御など、手順に従って動く回路の多くは状態機械として書かれます。

  1. 状態機械の状態の符号化で、ワンホット符号化の特徴として正しいものはどれか。
  2. 3つの状態を持つ状態機械で、状態を覚えるのに必要なフリップフロップの数の組み合わせとして正しいものはどれか(バイナリ符号化/ワンホット符号化)。
  3. 順序回路の説明として正しいものはどれか。

ハードウェア記述言語と検証の練習問題へ

関連する用語の解説

ミーリ型
出力が今の状態と入力の両方で決まる状態機械。入力の変化が同じサイクルで出力に表れるが、入力の雑音も出力に伝わりやすい。出力が状態だけで決まるのはムーア型。
順序回路
フリップフロップなどで状態を記憶し、出力が入力と過去の状態の両方で決まる論理回路。カウンタやレジスタなど。
組み合わせ回路
出力がそのときの入力だけで決まる論理回路。加算器やマルチプレクサ、デコーダなど。
フリップフロップ
1ビットの情報を保持する順序回路の基本素子。D型はクロックのエッジで入力を取り込む。
グリッチ
信号の経路ごとの遅延の差などによって、出力に一瞬だけ現れる不要なパルス。組み合わせ回路ではハザードとも呼び、DAコンバータではコードの切り替わりで生じる。
ワンホット符号化
状態機械の状態ごとに1つのフリップフロップを割り当て、常に1つだけを1にする符号化。論理が簡単で速くなりやすく、FPGAでよく使われる。
組み合わせループ
フリップフロップを通らずに組み合わせ回路の出力が自分の入力に戻る構造。発振したり値が定まらなかったりし、タイミングの解析もできないので避ける。
意図しないラッチ
組み合わせ回路のつもりの記述で、ある条件のときに出力への代入がないために、値を保つラッチが論理合成で作られてしまうこと。

関連する比較