FSM設計

via EDN japan


有限ステートマシン設計には何に注意すればよいのか。

FSM設計の問題点

他の状態に遷移できなくなる。
⇒リセット信号で初期状態に戻れるようにしてください…。

分岐条件にカウンタなどの複雑な条件を混ぜている場合、起こる可能性が高い。ある程度、遷移を繰り返した際に突如デットロックに陥る。検証で確認するのが困難。
⇒分岐条件は簡潔に。

冗長なロジック。
⇒誤動作の原因となりえるので消してください。

状態のエンコード処理の誤り等により、状態レジスタが"Hi"or"Low"に固定されてしまう。
エンコード表をしっかり確認。冗長な状態、冗長なレジスタが無い事を確認。

  • 非同期入力

深刻。非同期入力の対策を適切に行わないと、想定外な遷移等の様々な問題を引き起こす。
⇒非同期入力を入れない。ハンドシェイクを行う。

状態のエンコーディング方法

状態レジスタエンコードの仕方によって回路特性は大きく変わります。ワンホット、グレイエンコーディングを行う場合は、後々の保守や拡張の為に明示的にしておいた方が良いでしょう。設計思想で使い分ける必要があると思うけど、特に理由が無ければワンホットが良いかなぁ。(もしくはワンホットでハミング距離が2の物を作るとか)

全ての状態において状態レジスタの1bitしか"Hi"にならない。回路規模は大きくなるものの、組み合わせ回路の段数が少なくなるので、タイミング的に有利になる。ただし、状態を表現するのに必要なレジスタは多くなる。

あらゆる遷移において、遷移元と遷移先の状態の状態レジスタの値が1bitだけ異なる。遷移の際に変化するレジスタが1つだけなので低消費電力設計向け。状態が多くなった時、後からの仕様変更の際に適切なエンコードを探すのが困難になる可能性がある。

何も考えずに設計すると、大抵この形になる。少ないレジスタをフルに使用して状態を表現する。

遷移方式

  • ミーリ(Mealey)型

一つの状態の中に条件分岐を持ち、複数の出力を切り替える。ロジック段数の増加によりタイミング・パスの問題が大きくなる。

  • ムーア(Moore)型

一つの状態の中に条件分岐を持たない。ただし、状態数が増える。ムーア型の方を推奨。


複雑で大きなFSMはタイミングエラーや性能劣化に繋がるだけでなく、検証の複雑化も招きます。少ない状態、かつ簡潔な遷移を考えて。素敵な設計ライフを!
#そもそも論理合成ツールでFSMを最適化してもらえば良いじゃん。なんて声もありますが…。理解はしておきたいですね。