C0FFEEの日記: チップのノイズ対策事例(GRAPE-2)
ノイズ対策は重要だよねといっても、なかなか興味を引くような事例は活字になっていない。
なぜなら、経験を積んだ組み込み技術者と彼らが関わるプロジェクトにおいては、
それを対策した事例など、何ら誇らしげに書き記す事柄ではなく基本の事だから。
しかし、集英社新書の「スーパーコンピューターを20万円で創る/伊藤智義」にはそれが載っている。
貴重な事例だと思うので引用メモしておく。
最初はGRAPE-1の時のエピソードに、チップと配線を減らした理由の説明で出てきます。
ハンダ付けの手間とか、コスト抑制よりもノイズ対策を優先したとは書いていません。
専門家の指導を受けずに設計を行った伊藤の回路図には、専門家から見ると不思議な構成が
いくつか見受けられた。伊藤は詳細設計に入る前に読んだ本で、「基板というものには電気的
なノイズ(雑音)がつきもので、これを抑えなければ正確に動作しない」ことを学び、
そのためには「チップの数、さらにはチップ間の配線数は少なければ少ないほどよい」ことを知った。(P.103)
次に、GRAPE-2のエピソードで出てきますが、苦しめられた型番は恐らくTIのSN74ACT8847でしょうか。
使用するICチップも早々に選定した。六十四ビットのICにはテキサスインスツルメンツ社の
SN74ACT8847という二百八ピンのチップを、三十二ビットのICにはアナログデバイス社の
ADSP3201及び3202という百四十四ピンのチップを使うことを決めた。(P.166)
そして効果的な対策(電圧を4.5ボルトよりちょっと上に下げた)を見つけたエピソード。
「どうも数時間稼動し続けると、データが破綻するね」
開発者は、ここで一瞬めまいを覚えたりする。
しかしすぐに気を取り直して、次の段階のデバッグに取りかかる。「ノイズ対策」である。
ふつう、コンピュータは1か0で動作している。二進法である。GRAPE-2の場合、
電圧が五ボルトならば1で、ゼロボルトならば0を表していた。ところが、何かの原因で
電圧値が安定せずに、本来0であるべき信号が1に、あるいは1であるべき信号が0に
変わってしまうことがある。その原因は取り除かなければならない。
ノイズ除去の方法はいろいろあった。バイパスコンデンサーという電子部品があって、
それを基板上にムラなく配置するとよいとか、電源線を太くするとよいなど、
見聞きしたことを、伊藤は次から次へと試みた。その結果、誤動作は劇的に減っていった。
しかし、ノイズを完全に除去することはできなかった。GRAPE-2は、数時間は正常に
動作したが、一日動作させ続けると、データが破綻した。
年度がかわって四月になった。
ノイズの原因をつき詰めていくと、二個使用している六十四ビットのチップがどうも怪しいと
いうことがわかってきた。二百八ピンもある、当時としては巨大なチップだった。
このチップの特長はデータの取り込み方にあった。ふつうのチップは、クロックが
「0から1に上がるとき」か「1から0に下がるとき」のどちらかで動作する。
しかし、このチップは両方を使っていた。すなわち、クロックが「0から1に上がるとき」
に三十二ビットのデータを取り込んで、「1から0に下がるとき」にも三十二ビットのデータを
取り込んでいた。この二セットのデータをチップの内部で合わせて六十四ビットにしていたのである。
したがって、この巨大チップは、ふつうのチップよりも応答速度がずっと速い必要があり、
実際そういう仕様になっていた。応答速度が速いと、例えば信号がゼロボルト(0)から
五ボルト(1)に変化するとき、勢いあまって五ボルトを超えやすくなる。こういう現象を
「オーバーシュート」という。逆に五ボルト(1)からゼロボルト(0)に変化する時には
ゼロボルト以下にまでなってしまう。これは「アンダーシュート」と呼ばれる。オーバーシュート
やアンダーシュートが起これば、それは当然、ノイズのもとになる。
伊藤はノイズ対策をこのチップに集中した。
動作クロックも遅くしてみた。しかし、いくら遅くしてもノイズは消えなかった。ノイズはふつう、
クロックのスピードに強く依存する。遅いときは正常に動作するが、速くすると誤動作を起こす。
どの解説書にも書いてあることだった。それが通用しない。
伊藤は途方に暮れた。
クロックの速度に関係なく誤動作を引き起こすということは、クロックが0から1へ、
または1から0へ切り替わった瞬間の、そのチップの応答速度が速すぎることを意味している。
原因がそこにあることは間違いないという思いは、確信に変わっていた。
「反応が良すぎるのが原因なら……反応を鈍らせればよい……でも、どうやって……?」
途方に暮れながらも、考え続けた。
そして、一つの可能性を思いつく。
「振り幅を変えたら、どうだろう……?」
伊藤はGRAPE-2に接続している電源のスイッチを入れた。
この電源の電圧は可変になっていた。GRAPE-2で計算をさせながら、定格の五ボルトから
徐々に電圧を下げていった。
四.五ボルトになったとき、突然、データの表示がめちゃくちゃになった。
「四.五ボルトまでか……よし」と、うなずいた。
伊藤は、オーバーシュートやアンダーシュートを減らすためには、もとになっている
電圧の振り幅を小さくすればうまくいくのではないかと考えた。ゴムやバネと同じように、
振り幅を小さくすれば振動の勢いも弱まる。したがって、オーバーシュートやアンダーシュート
も小さくなるのではないか。そこで、供給している電圧を下げてみることにしたのである。
しかし、ICには定格というものがあって、それ以外では動作の保証はされない。
GRAPE-2で使用していたICの定格電圧はすべて五ボルトであった。
伊藤は微調整を繰り返して、四.五ボルトよりちょっと上の電圧値で止めた。
ディスプレイをのぞき込むと、正確なデータを返してきている。
「よし……」
伊藤は祈るような気持ちで帰路についた。
翌日、登校してきた伊藤は、ドキドキしながらディスプレイをのぞき込んだ。
データは正確な値を表示し続けていた。「よし!」と、大きく息を吐いた。
そこに牧野が入ってきた。
伊藤は興奮を抑え切れずに、牧野に告げた。
「GRAPE-2からノイズが消えましたよ!」(P.176)