この世のCPUを食べ尽くすのだ! 第3章 第3節 第1項

~あんたCPUなんか創ってどうするのよ?! Vol.3~

2018/10/8
技術書典5 け39

第3章 第3節 第1項 「ヒゲ」対策

TD4の場合、タイミング設計は非常に簡単でした。レジスタやプログラムカウンタ、さらにはOUTポートなどに使用しているICが全て同期式の74HC161だったからです。
同期式ICの場合、信号のタイミングはすべてクロックに合わせればよく、74HC161の場合はクロックが0から1になる直前だけ全ての信号が正しければ正常動作します。そのためタイミングについてはほとんど考慮する必要がありません。

ところがRAMは非同期式のICです。そもそもクロック入力端子がありませんので、タイミングの制御はCS端子とWE端子だけで行う必要があります。さらにデータやアドレスの入出力タイミングも厳密に決められているため、素人が設計を行うにはハードルが高いのです 。

例えば命令デコーダーは複数のICを組み合わせて作られています。そのため命令をフェッチしてからデコードを完了するまでの間に、一時的に誤った信号が出力される可能性があります。これは複雑な回路ではどうしても発生してしまう現象で、誤った信号が非常に短時間、パルス状に出力されます。ハードウエアの専門家はこれを「ヒゲ」と呼んで恐れています。

もしIN命令を実行中にWE端子にヒゲが発生した場合、RAMは非同期式であるため、短いヒゲのパルスに反応してしまいます。その結果、本来の読み出し動作のかわりに書き込み動作を行ってしまい、「いつの間にかRAMの内容が破壊されている」と言う、きわめてデバッグしにくいトラブルが発生します。

 

そこで筆者は、非同期式のICを同期式に近い感覚で扱えるように、ひとつの決め事をしました。それは「クロックが1の間は何もしない」という事です。

CPUの内部ではクロックが1になった瞬間にプログラムカウンタをインクリメントし、新しいアドレスをROMに伝え、新しい命令を読み出し、デコードし、命令に沿った制御信号を作り出します。つまりクロックが1になった直後は様々な作業を行っているので、CPUから出力される制御信号は信用できません。

信号が確定するまでにどれくらいの時間が必要なのかは、全てのICの遅延時間と、信号の伝達時間を計算する必要がありますが、例えば74HC161のインクリメントには26ns、ROMからの命令の読み出しには70ns程度かかりますので、全体で200ns程度と見ておけば良さそうです。

つまりクロックが1になってから少なくとも200nsの間は、何もしないようにする必要があります。そこで筆者は単純に、クロックが1の間は何もしない事にしました。クロック周波数を1kHzに決めましたから、クロックが1の期間は500,000ns続きます。命令デコードを完了するには十分すぎる時間を確保できます。

クロックが0になると実際のRAMへのアクセスや、I/Oポートへのアクセス、さらには演算の実行などの処理を行います。そしてクロックが0から1へ変わった瞬間に命令の実行を完了し、結果を確定します。