ステートマシンの構想

ステートマシンの構想

 ステートマシンは順序回路の一種で、制御論理回路とも呼ばれています。開発現場では「この回路はステートマシンで組んで」というように、順序回路だとか制御論理回路という言葉はまず出てきません。

 ステートマシンの事をシーケンサという場合もあります。

 最近のFPGAは規模が大きくなってきたので、ステートマシンを多用するようになてきました。これはロジックを多量に消費するステートマシンがFPGAの中に入れることができるようになってきた。というのもありますが、HDLの言語を使うようになった。というのが大きな理由です。

 VHDLでもVerilogでも言語でステートマシンを組むことができます。回路図でステートマシンを組む人は居ないと言ってもいいぐらい大変です。また、VHDLやVerilogを使えるようになる前には、状態遷移表で設計していた事もありました。回路図よりはマシですが、デバッグしにくくて大変な苦労をして仕上げていたものです。

 ステートマシンの解説で良く出てくるのは状態遷移図です。Aをやって、BをやってCをやってAに戻る。というような順序を図示した物になります。状態遷移図を完璧に仕上げることができれば、ステートマシンは完成したも同然です。正直いって、このようなことは非常に稀です。

 開発の現場では状態遷移図を軽く設計し、言語でステートマシンを作成して、何度もデバッグして動作を確認し、最後に状態遷移図を修正する。という順序が普通に行られます。

 ステートマシンを実際に設計するにあたり、なぜか多いのがストップウォッチの例です。スタートと停止のボタンがあるのでわかりやすいのでしょう。なるべくなら出力される信号が想像つく方が良いと思いますので、今回はSPIを設計してみます。SPIの信号はこちらで解説していますので、参照してください。今回はわざと泥臭く設計してみます。

 ステートマシンを言語で記述するにあたり、カウンタ回路やシフトレジスタ回路のように決まった書き方があるわけではありません。もともと、ステートマシンはカウンタと順序回路の組み合わせで成り立っているからです。

 以前にもデータシートを見たのでMCP3002を扱います。FPGAとの接続は以下の通りです。

 MicroChip社のMCP3002データシートからアクセスのタイミングを抜粋いたします。クロックは5V動作時で最大3.2MHzです。2.7V動作時で1.2MHzです。今時5VのIO電圧を扱えるFPGAも少なくなっていますので、3.3VをIO電圧として、クロックは1.2MHz(Max)で設計してみます。

MicroChip社のMCP3002データシートより抜粋

 ソースコードをみるとわかりますが、かなり野暮ったい設計になっています。もっとビットの数を数えて同じ動作を繰り返すように作れる。と感じると思います。

 これはステートマシンの例として作ったので、わかりやすくするために、1ビットすづを細かく制御した。という説明になるのですが、私の経験から、ステートマシンはなるべく単純に作る方がメンテナンスしやすいし、変な現象に悩まなくて済みます。

 変な現象というのは、コンパイラによって、設計した通りにシーケンサが動作しない。という事が稀にあります。これは、だいたいコンパイラにステートマシンの最適化オプション等のスイッチがあって、それを操作することで回避できますが、それでもどうしてもおかしな動作をすることがあります。

 そのような時にはステートマシンを単純にすることで回避できます。ステートマシンはロジック的に複雑な回路です。それゆえ、コンパイラで論理圧縮などが発生すると、設計した意図とは違う動きをする。と思われます。このような症状が発生した場合、設計者はFPGAメーカーに問い合わせたりして悩むのですが、メーカーから明確な回答を得られることは無いでしょう。

  状態遷移図を上に示しました。同じような動作が30回も続いているので、この30回をループにして作りなくなると思います。この例はあまり良くないかも知れませんが、先に書いたようにステートマシンはロジックが複雑になる傾向にあるので、なるべく単純に作るのがコツです。