あんたCPUなんか創ってどうするのよ?! Vol.1 第4章 第4節

~TD4とかいうCPUがあまりにも残念だったので拡張してみた~

2016/8/14
コミックマーケット C90 3日目 西g16b

第4章 第4節 命令実行の延期

読み込んだ命令が可変長命令だった場合、命令の実行は命令全体を読み込んだ後となります。そのため命令の1バイト目を読み込んだ時点では何もしないようにします。

具体的にはTD4EX2では可変長命令はジャンプ命令(条件ジャンプ命令含む)だけなので、命令の1バイト目ではプログラムカウンタへの書き込みを抑制するようにしてあります。そして命令の2バイト目を読み込んだタイミングで改めてジャンプ命令を実行し、プログラムカウンタへの書き込みを行います。

図3 12ビット化されたジャンプ命令
図3 12ビット化されたジャンプ命令

この延期はフリップフロップによって行います。

TD4ではキャリーフラグ(C)の状態を保持するために、元々74HC74というフリップフロップ用ICを使っています。ところが74HC74にはフリップフロップが2回路含まれているのに、TD4ではキャリーフラグ以外には使っていません。つまりフリップフロップが1回路余っている訳です。TD4EX2ではこの余ったフリップフロップを命令実行の延期に使います。

図4をご覧ください。

中央の延期用フリップフロップは通常セットされた状態になっています。フリップフロップのQ出力は命令ラッチのLatch Enable端子に接続されているため、フリップフロップがセットされた状態の時はLatch EnableはH状態のままとなり、ROMから読みだされた命令は命令デコーダーへとスルーされることになります。

そしてジャンプ命令または条件ジャンプ命令を読み込むと、フリップフロップが0となり、Q出力がLになって命令がラッチに保持されます。この状態は1クロックの間続いた後、セットされた状態に戻ります。

図4 命令実行の延期
図4 命令実行の延期

という訳でTD4EX2の回路は図4になっているのですが、実はちょっとした問題があります。

それはタイミングです。Latch Enable信号がLになるタイミングに問題があり、ジャンプ命令もしくは条件ジャンプ命令を正確に保持できるとは限らないのです。

実際には74HC74よりもROMの方が遅いので問題は起きていないのですが、温度が変わったり、電源電圧が変動したりした場合にどうかは分かりません。

次のVol.2までには改良したい部分です。