ステートマシンの考え方
📋 このページの内容
条件分岐やループはソフトウェアだけの話ではありません。論理回路でも実現できます。それがステートマシンです。後のユニットでHDLを使って記述しますが、その容易さは感動的です。
「ステートマシン(状態遷移機械)」って必殺技みたいな名前だね🐾
これを使えば、自動販売機や信号機みたいな『順番に動く賢いシステム』が作れるようになるんだ!
1. ステートマシンとは
ステートマシン(状態機械)とは、いくつかの状態(ステート)を持ち、条件によって次の状態に遷移する回路です。
状態遷移図の読み方
状態遷移図は「どの状態にいるとき、どの条件で、どの状態に移るか」を表した図です。
| 現在の状態 | 条件 | 次の状態 |
|---|---|---|
| A | 条件1 を満たす | B へ遷移 |
| A | 条件1 を満たさない | A のまま(自己ループ) |
| B | 条件2 を満たす | C へ遷移 |
| B | 条件2 を満たさない | B のまま |
| C | 条件3 を満たす | A へ遷移 |
| C | 条件3 を満たさない | C のまま |
2. 回路構成
ステートマシンは以下の2つのブロックで構成されます。
| ブロック | 役割 | 回路の種類 |
|---|---|---|
| 状態保持 | 「現在の状態」を記憶する | D-FF(フリップフロップ) |
| 次状態生成 | 現在の状態 + 外部入力 → 「次の状態」を計算 | 組み合わせ回路 |
動作の流れ
- 組み合わせ回路が「現在の状態」と「外部入力」から「次の状態」を計算する
- CLK の立ち上がりで「次の状態」を D-FF に取り込み「現在の状態」になる
- 「次の状態」が「現在の状態」と同じ場合は自己ループ(状態を保持)
3. 実例:CDトレイ制御
CDプレイヤーのトレイ開閉動作をステートマシンで表現します。
状態の定義(4つのステート)
| 状態名 | 状態コード | モータ動作 | 説明 |
|---|---|---|---|
| CLOSED | 00 | OFF | トレイが完全に閉じた状態 |
| OPENING | 01 | ON(開く方向) | トレイが開いている途中 |
| OPEN | 10 | OFF | トレイが完全に開いた状態 |
| CLOSING | 11 | ON(閉じる方向) | トレイが閉じている途中 |
状態遷移テーブル
| 現在の状態 | 遷移条件 | 次の状態 | モータ |
|---|---|---|---|
| CLOSED | ボタンが押された | OPENING へ | OFF → ON(開く) |
| CLOSED | ボタン未押下 | CLOSED のまま | OFF 継続 |
| OPENING | トレイが完全に開いた | OPEN へ | ON → OFF |
| OPENING | まだ開いていない | OPENING のまま | ON 継続 |
| OPEN | ボタンが押された | CLOSING へ | OFF → ON(閉じる) |
| OPEN | ボタン未押下 | OPEN のまま | OFF 継続 |
| CLOSING | トレイが完全に閉じた | CLOSED へ | ON → OFF |
| CLOSING | まだ閉じていない | CLOSING のまま | ON 継続 |
4. ステートマシン vs カウンタ
🔵 カウンタ
- 遷移条件:クロックのみ
- 状態変化:単調増加 / 単調減少
- 状態値(カウント値)そのものに意味がある
- ステートマシンの特殊ケースと見なせる
🟣 ステートマシン
- 遷移条件:任意の外部信号
- 状態変化:任意の状態へ遷移可能
- 状態値そのものに意味はない(符号化は設計者が決める)
- カウンタより複雑な制御が可能
5. 状態設計の手順
ステートマシンを設計するときは、いきなりVerilogのコードを書き始めるよりも、まず「何を状態として記憶する必要があるか」を整理すると迷いにくくなります。状態は、過去の入力や動作の履歴を回路の中に残しておくための名前です。
| 手順 | 考えること | CDトレイ制御での例 |
|---|---|---|
| 1 | 外から入ってくる信号を決める | ボタン、開端センサ、閉端センサ |
| 2 | 回路が覚えておく状態を列挙する | CLOSED、OPENING、OPEN、CLOSING |
| 3 | 各状態で出力をどうするか決める | モータを止める、開く方向に回す、閉じる方向に回す |
| 4 | どの条件で次の状態へ移るか決める | ボタン押下、完全に開いた、完全に閉じた |
| 5 | 想定外の状態に入ったときの戻り先を決める | 安全側として CLOSED へ戻す、またはモータを止める |
6. つまずきやすいポイント
ステートマシンは便利ですが、状態が増えるほど見落としも増えます。設計図の段階で次の点を確認しておくと、Verilogで書いた後のデバッグがかなり楽になります。
- 状態を増やしすぎて、どの状態からどこへ戻るのか分からなくなる。
- 入力がないときの遷移を書き忘れ、意図しない状態保持やラッチのような動きに見える。
- リセット後にどの状態から始めるかを決めていない。
- 存在しない状態コードに入った場合の復帰先を用意していない。
このページでは概念を中心に見ましたが、実際にVerilogでステートマシンを書くときは、状態レジスタ、次状態計算、出力計算を分けて考えるのが基本です。具体的な書き方は、後の 応用実験3: ステートマシンを回路で書く で詳しく扱います。
お疲れさま!これでLシリーズ(基礎ノート)はすべて完了だよ🐾
次からは、いよいよお待ちかねの「Verilog-HDLの書き方(文法ノート)」に突入するよ!一緒にコードを書いていこう!
📌 まとめ
- ステートマシンはいくつかの状態を持ち、条件によって次の状態に遷移する回路
- D-FF(状態保持)と組み合わせ回路(次状態生成)で構成される
- CLK の立ち上がりで「次の状態」が「現在の状態」になる
- 状態遷移図で状態・遷移条件・遷移先を視覚的に表現する
- CDトレイ制御では CLOSED → OPENING → OPEN → CLOSING → CLOSED の4状態で動作する
- カウンタはクロックのみを遷移条件とするステートマシンの特殊ケース
- ステートマシンはカウンタと異なり任意の外部信号を遷移条件にできる
- ステートの符号化方法(バイナリ・グレイコード・ワンホットなど)は設計者が決める
🐾 もふねこの現場FAQ
Q. 自動販売機のステートマシンを作りました。シミュレーションは完璧なのに、実機で動かしていると完全にフリーズします…
A. case文の中に「未知の世界からの脱出ルート(default)」を書き忘れている可能性が高いよ🐾
ハードウェアの実機環境では、ノイズなどの影響で設計者が意図していない「ありえない状態」に突然飛ばされる事故が普通に起こるんだ。
その時に default への指定がないと、回路が行き先を見失って二度と復帰できない「デッドロック(完全フリーズ)」に陥ってしまうんだ。入門書には載っていない実務の恐怖だから、絶対に忘れないでね!
