ええっ⁈ 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つの注意点があります。

    1. 負論理 である。つまりLD端子を0にすると出力動作を行う。
    2. bit7とbit6の両方が1の場合は、出力ポートもしくはPCへの出力を行う。それ以外の時(bit7とbit6の少なくとも片方が0の時)はアキュムレータAもしくはBへの出力を行う
    3. 条件ジャンプ命令の時は、キャリーフラグが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と同じです。