有限ステートマシン設計:コンセプトから実装まで
これまで、出力が現在の入力のみに依存する組み合わせロジックに焦点を当ててきました。多くの実世界アプリケーションでは、回路が過去の入力を記憶し、それに応じて出力を調整する必要があります。このような回路を順序回路と呼びます。
この記事では、実用的な例を用いて順序回路設計のエンドツーエンドプロセスを説明します:ユーザーがボタンを押すたびに、単一クロックサイクルのHIGHパルスを生成するデジタルクイズゲーム。
ステップ1 – 要件定義
望ましい振る舞いを平易な言葉で記述から始めます:
"ボタンが押されたとき、1クロックサイクルのHIGHパルスを出力し、ボタンが離されて再度押されるまでそれ以上の押下を無視する副回路が必要です。"
ステップ2 – 状態遷移図の作成
状態遷移図はマシンの動作を視覚化します。各円は状態を表し、矢印は各クロックサイクルでの入力による遷移を示します。以下の図はムーア型有限ステートマシンで、出力は現在状態のみに依存します。

状態説明:
- スタンバイ — 初期待機状態。
- パルス活性化 — HIGH出力を生成。
- 待機ループ — ボタンが離されるまでLOW出力を保持。
矢印は遷移をトリガーする入力値でラベル付けされます。例えば、スタンバイ状態から入力「1」でパルス活性化へ、「0」ならスタンバイに留まります。
ステップ3 – 状態の2進エンコード
各状態に2進コードを割り当て、初期状態を0から開始。以下のエンコードは3状態に十分な2ビットを使用します。

ステップ4 – 状態遷移表の構築
状態遷移表は、現在状態と入力のすべての組み合わせ、次の状態、出力を列挙。列は現在状態ビット、入力ビット、次状態ビット、出力ビットに対応。この例の表は以下。

重要ポイント:
- 各行は状態と入力のすべての2進組み合わせをカバー。
- 存在しない状態に対応する行はドントケア(X)でマーク。
- 出力列は入力に依存しないムーア出力を反映。
ステップ5a – Dフリップフロップ実装の準備
マシン実装には通常フリップフロップを使用。Dフリップフロップの場合、次の状態に到達するために必要な入力は単純に次状態値そのもの。状態遷移表に各D入力の列を拡張します。

ステップ5b – JKフリップフロップ実装の準備
JKフリップフロップ選択時、フリップフロップごとに2列(JとK)を追加。それらの値はJK励磁表から導出:

例:0から1へ遷移するにはJ=1, K=X(ドントケア)。

ステップ6 – カルノー図によるブール関数導出
カルノー図を用いて各フリップフロップ入力と出力の式を簡略化。以下のマップはDとJK実装の両方でプロセスを示します。
Dフリップフロップ入力:

JKフリップフロップ入力:


出力関数:


ステップ7 – 物理回路の構築
ブール方程式が得られたら、フリップフロップとロジックゲートで回路を組み立てます。すべてのフリップフロップにクロックを接続することを忘れずに。完成したDフリップフロップ設計は以下:

JKフリップフロップ版は以下:

組み立て後、ボタンがどれだけ長く押されていても、各押下ごとにクリーンな1クロックサイクルHIGHパルスを生成します。
重要なポイント
- 順序ロジックは過去の入力を記憶し、動的振る舞いを可能にする。
- 有限ステートマシンはそのような振る舞いをモデル化する厳密なフレームワークを提供。
- フリップフロップがFSMをハードウェア実装し、状態遷移を物理出力に変換。
- 体系的設計フロー—要件、図、エンコード、表、論理合成、組み立て—が信頼性の高い回路を保証。
産業技術