論理回路デザイン
ArchiTek home page
ステートマシンについて

ステートマシンの構造化

状態遷移の設計

設計例(AHBブリッジ)

記述例(AHBブリッジ)

ステートマシンのリソースシェアリング

回路デザイン > テクニック > ステートマシン    次のページ(ゲーテッドクロック)    このページのTOP ▲

[1]
規格で解釈をあいまいにしているところがあります。例えばエラーが生じた場合の対処などです。

面倒なのでリセットする、復帰のため別のシーケンスを挿入する、保留してソフトウェアに任すなど様々です。

実は、システム設計にも関わる可能性があるので、規格で決まったシーケンスほど面倒なものはないとうことも言えます。
[2]
連結の理論はありますが、回路設計で何がよいと言うのは調べ切れていません。

連結する場合の状態数の上限は32程度が目途でしょうか。経験的に言うと、お互いの状態が絡み合えば状態数の2乗で複雑さが増します。その理屈から言うと、図の右側の状態の方が簡単なのです(72 > 22+32+42)。

なお、JPEGやMPEGなどのヘッダー解析のステートマシンは100ステートでも問題ありません。相互に遷移することが少ないこともありますし、規約なのである程度安心できますから(一応疑いますが)。

ちなみに、100ステートでも合成すると回路や論理段数は意外にも小さくなるものです。
[3]
小規模なステートマシンはローカルな場所にマッピングされるので、論理段数が多目になっていても結構抑えられると考えています。

実際、タイミングの厳しいステートマシンを設計したことはありますが、One hotでの改善は微々たるものでした。先ずは、状態の値を綺麗に整えてから試しています。
[4]
単なる一例です。何かをベースにして考えるとスムーズに考えがまとまります。この場合は出力信号ですが、入力信号を中心に、または何かで定義した状態を中心にすることも問題ありません。

前者は極端な例ですが、プロセッサのプログラムカウンタが当てはまります。

また後者は、DDR制御のDDRのメモリ状態の例に見ることができます。
[5]
ここで言う非同期とは、クロックの周波数の違いではありません。状態が独立していて、お互いに関係なく動作している関係を意味します。ソフトウェア制御の非同期と同じです。
[6]
安全策を取れば取るほど、潜在するバグを見逃してしまう可能性があります。不測の状態はアサーションするようにして確認し(display文を埋め込むもので十分)、万全を期しましょう。
[7]
詳細は端折りますが、AHBの特殊性から統合すると制御の考え方が簡単になります。実際はマスターとスレーブは分離したものとして扱うことが多いのでご注意を。

また、AHBはRequest制御とData制御が同期したプロトコルのため、既に入力信号によって連結済と考えてよいです。これでは性能がでないので、ここで使うバスのようにAXIが定義されたと感じています。
[8]
ここで略しているHBURST信号を見れば、規定のバースト長はわかります。しかし、AHBの規約ではアクセス途中のアボートを許しています。バースト長はこのアボートをチェックしなければわかりません。アボートはHTRANS="SEQ"であるはずのものが、"IDLE", "NONSEQ"になった場合に分かります。
[9]
賢明な方であれば、欠点に気づかれるかもしれません。実は、HTRANS="BUSY"の後に"IDLE"や"NONSEQ"が来てアクセスを中断すると、strb信号と一緒にflush信号が出ません。"BUSY"の時点でflush信号をアサートしたいのですが、"BUSY"ではアクセスを中断したか判断できません。

正しく実装するとなると、HREADYをStallさせダミーのstrb + flush信号をアサートする状態を加えるなど、かなり複雑になります。

AHBのマスターでアクセス中断の直前でHTRANS="BUSY"にすることはないと思うのですが...
[10]
One hotではありませんが、ビットそれぞれに直交性があればFF間の論理段数や回路規模の軽減が図れます。

ただし状態を参照する場合、特定ビットを頼って論理を組むと、後で状態を増やしたり改変したりした時に整合性がとれなくなります。なるべく、状態名を使って記述した方がいいでしょう(合成ツールが自然に回路圧縮してくれます)。
[11]
条件漏れが生じにくい記述方式だと思っているのです。しかしRTLチェッカーによっては、case()のデフォルトがない!とのメッセージが出て戸惑われるかもしれません。心配なら、丁寧にcase()文にデフォルトもしくはフル条件を記載します。
[12]
ダイレクトマップ型かセットアソシエイト型であれば、アドレスで一意に状態を決めることができ、ここで言うマルチプレクサは必要ありません。