ええっ⁈ CPU創ったの⁈ すっごーい! 第2章 第4節
~あんたCPUなんか創ってどうするのよ?! Vol.2~
2017/8/11
コミックマーケット C92 1日目 東7そ11b
第2章 第4節 論理設計①
では、表10に基づいて論理設計に進みます。
対象はセレクタ①と②、出力先であるアキュムレータAとB、出力ポート、PCの合計6ヶ所です。信号線の数はセレクタ①だけが2本(ST端子とSELECT端子)、その他は1本ずつです。
入力信号の数は命令コードの4本(ROMから供給されるbit4~bit7)とキャリーの合計5本です。
それぞれの信号線を論理式で表してみましょう。
- セレクタ①
これは例外処理が無いので一番簡単です。ST端子とSELECT端子を命令コードのbit7とbit6に割り当てるだけです。
ST端子 = bit7
SELECT端子 = bit6 - セレクタ②
セレクタ②のSELECT端子は例外処理があるので複雑です。通常は命令コードのbit5に割り当てておけば良いのですが、条件ジャンプ命令(1101)の時だけ強制的に1にする必要があります。
とは言え律儀に命令コードの全部のビットを調べて1101であることを確認する必要はありません。ジャンプ命令(1111)の時にもSELECT端子を1にしますから、bit5は0でも1でも構いません。
という訳で、命令コードのbit7、bit6、bit4が全部1の時にSELECT端子を強制的に1にします。
SELECT端子 = bit5 OR (bit7 AND bit6 AND bit4)
- 出力先
出力先のアキュムレータAとB、出力ポート、PCに関しては、以下の3つの注意点があります。
- 負論理 である。つまりLD端子を0にすると出力動作を行う。
- bit7とbit6の両方が1の場合は、出力ポートもしくはPCへの出力を行う。それ以外の時(bit7とbit6の少なくとも片方が0の時)はアキュムレータAもしくはBへの出力を行う
- 条件ジャンプ命令の時は、キャリーフラグが1の場合はPCへの書き込みを行わない
まずはアキュムレータAとB、および出力ポートの論理式を考えます。
アキュムレータAのLD端子 = bit4 OR (bit7 AND bit6)
アキュムレータBのLD端子 = (NOT bit4) OR (bit7 AND bit6)
出力ポートのLD端子 = bit4 OR NOT (bit7 AND bit6)特に難しくないと思います。bit7とbit6の論理積(AND)が共通していますので、この部分は1つにまとめてしまえばよいでしょう。
- PC
最後はPCへの出力です。複雑なので、まずは条件ジャンプ命令を考慮せずに考えてみましょう。
PCのLD端子 = NOT (bit7 AND bit6 AND bit4)
これだけだと非常に簡単です。しかも (bit7 AND bit6 AND bit4) の部分はセレクタ②の時に同じ論理演算をしていますから、それを流用すれば全く問題ありません。
では、どうやって条件ジャンプ命令を実現すれば良いでしょうか?
ここはやはり先人の知恵を借りましょう。
TD4ではbit7とbit6が1の時にジャンプ命令もしくは条件ジャンプ命令を実行します。両者の区別はbit4で行っています。bit4が1ならばジャンプ命令、0ならば条件ジャンプ命令と判断します。そしてキャリーが無いことを示すQ信号と命令コードのbit4の論理和(OR)を行うことで、ジャンプ命令と条件ジャンプ命令を統合しています。
TD4のPCのLD端子 = NOT (bit7 AND bit6 AND (Q OR bit4))
この手法をTD4EX1でも使いましょう。
TD4EX1ではbit7、bit6、bit4の3つが1の時にジャンプ命令もしくは条件ジャンプ命令を実行します。両社の区別はbit5で行い、bit5が1ならばジャンプ命令、0ならば条件ジャンプ命令と判断します。
この状況はTD4とそっくりですから同じ手法を使えます。
TD4EX1のPCのLD端子 = NOT(bit7 AND bit6 AND bit4 AND (Q OR bit5))
複雑に見えますが、やっている事はTD4と同じです。