ある不具合を経験した筆者。筆者が“デジタル回路設計のルール”を破っていたことが原因だった。では、そのルールとは?
この話は、筆者がそれまでに経験したことのなかった新たな業務に携わることになったときのことである。その業務とは、電圧とクロック、温度を設定/モニターするための回路基板を、いくつかのICとA-D/D-Aコンバータを使用して設計することだった。
回路の核となるコントローラには、FPGAを使うことにした。このFPGAは、USBチップを介してパソコンに接続することにした。設計作業は順調に進み、すぐにFPGAとのデータの読み出し/書き込みが行えるようになるものと思われた。ところが、完成した回路基板は、電源を入れると数秒後にハングアップしてしまった。どこに問題があるのか調べてみた結果、FPGAがUSBチップからの信号に対して正常に応答していないことがわかった。
この設計では、マスターであるFPGAとスレーブであるUSBチップの間を8本の並列データラインと4本の制御信号ラインで接続していた。USBチップは受信フラグにより、FPGAが取り込むべきデータの準備が完了したことをFPGAに通知する。また、送信イネーブル信号を送出することで、USBチップのFIFO(First In, First Out)に十分な容量があり、FPGAからデータを書き込むことが可能であることを通知する仕組みであった。
システムがハングアップするときの各ノードの信号波形をオシロスコープで調べた結果、USBチップは受信フラグを立てて、データの取り込みが可能であることをFPGAに通知していた。しかし、FPGAはそのデータを取り込んでいなかった。筆者はデジタル回路設計者としての経験が浅かったので、Verilog HDLで記述したコードをチェックしても問題点を見つけられなかった。また、シミュレーションでも何の問題も発生しなかった。
そこで、FPGAはプログラマブルであるという特徴を生かし、内部のさまざまなノードを、空いているI/O端子に引き出してオシロスコープでチェックすることにした。さまざまなノードを調べた結果、大半の機能は正常に動作していた。しかし、USBとのインターフェースを調べてみたところ、この部分のコントローラが備える4ビットのステートマシンが正しく動作していないことが判明した。ハングアップが起きる際には、ステートマシンがテーブルに記述のない未定義の状態に陥っていることが明らかになったのだ。
解決への糸口はつかめたが、筆者には真の原因が何であるか、見当がつかなかった。そこで、経験豊かな同僚技術者に相談したところ、1つの手掛かりが得られた。問題だと考えられたのは、コントローラのステートマシンがUSBチップからの受信フラグに対応して動作していることだった。
FPGAの回路上では、ステートマシンが10種類の状態を持つことになっていた。そのため、現在の状態を示すのに、4個のフリップフロップを要していた。各フリップフロップには、それぞれが遷移すべきタイミングを決定するための組み合わせ論理が1対1で対応づけられており、しかも各フリップフロップが受信フラグをチェックするようになっていた。それぞれの組み合わせ論理回路の処理速度には差があることから、受信フラグの遷移タイミングの判定に差が生じていたのだ。実際の現象としては、3個のフリップフロップはフラグを正しく認識していたが、これらに比べて処理速度の遅いもう1つのフリップフロップは誤った値を認識していた。その結果、ステートマシンは不適切な動作を示していたのである。
相談にのってくれた技術者のお陰で、筆者はデジタル回路設計の約束ごとを破っていたことを知った。つまり、フリップフロップとの同期のことを考慮せずに、外部信号を直接、内部クロックとして使用していたことが問題だったのである。この件は、筆者にとって、その後も非常に役に立つ貴重な経験となった。
Copyright © ITmedia, Inc. All Rights Reserved.