本連載はHisa Ando氏による連載「コンピュータアーキテクチャ」の初掲載(2005年9月20日掲載)から第72回(2007年3月31日掲載)までの原稿を再掲載したものとなります。第73回以降、最新のものにつきましては、コチラにて、ご確認ください。

FFを用いて設計したPCとスタックを次の図に示す。但し、これは4bit分であり、PClow、PCmid、PChighと、この回路を3個使ってPCとスタックを構成する。

次の図において、一番上の行の4個のFFがPC、その下の行が順にスタック1、スタック2、スタック3となっており、スタックをプッシュすると、全ての行のFFは下の行にデータを転送する。そして、ポップの場合は、この逆で全ての行のFFは上の行にデータを転送するという構造により、スタックを実現している。

  • 4bit分のPCとスタック

    4bit分のPCとスタック

BUS0~3は4bit内部バスへの接続であり、PClow、PCmid、PChighともにBUS0はバスのBit-0、BUS1はバスのBit-1というように接続する。一方、PC0~3はインクリメンタへの出力であり、I-out0~3はインクリメンタの出力に接続する。そして、PClowのPC3~0とI-out3~0はインクリメンタの最下位4bit、PCmidは中位4bit、PChighは最上位4bitに接続する。

またPC FFのQ出力はトライステートバッファを通して4bit内部バスに接続されており、このエネーブル信号は、PCがバスへの送り出し元となるSRC-PC信号に接続する。言わずもがなであるが、最下位の4bit分の制御信号はSRC-PClow信号、中位はSRC-PCmid信号、最上位はSRC-PChigh信号である。

一番上のマルチプレクサを制御するPCF信号はPC FFへの入力の選択を行っており、"00"の場合にはマルチプレクサは右端のPCのQ出力の信号を選択するので、Φ2クロックが入っても同じ値が書き込まれ、結果として以前の状態を保持する。PCFが"01"の場合は右から2番目の信号を選択する。この信号はSTK1のQ出力であり、Φ2クロックが入るとスタックのPopとなる。

PCFが"10"の場合はBUSが選択され、Φ2クロックが入るとバス上の情報がPCへ書き込まれる。また、PCFが"11"になるとI-outが選択され、インクリメンタの出力がPCに書き込まれ、結果としてPCが+1されることになる。

そして、STK1~3の各マルチプレクサを制御するSTKF制御信号が"00"の場合は、PCと同様に自分自身のQ出力が選択され、Φ2クロックが入っても以前の状態を保持する。STKF制御信号が"10"の状態でΦ2クロックが入ると、STK1はSTK2のQ出力、STK2はSTK3のQ出力が書き込まれ、結果としてスタックのPopを行い、STKF制御信号が"10"になると、STK1はPCのQ出力、STK2はSTK1のQ出力、STK3はSTK2のQ出力を書き込み、結果としてPushを行う。

なお、この図ではSTK3のマルチプレクサのPopに対応する入力は"0"に接続しているので、Popを行うとSTK3にはゼロが入るという設計であるが、本物の4004では何が入るようになっているのかは不明である。

ここまで作れば、残るのはPCFとSTKF信号を作り出す回路だけであるが、この回路は、次に示す簡単な回路で実現できる。

  • PC、スタックの制御信号発生回路

    PC、スタックの制御信号発生回路

PCF1(上位ビット)はPCのインクリメントの場合と、バスからPCに内容を書き込む場合に"1"になれば良いので、PCをインクリメントするという信号とPCがバスのデスティネーションになるという信号のORを作れば良い。前に掲載した命令の動作を整理した表に示したように、PCはA3サイクルに+1されるが、FIN命令の後半の8サイクルのケースだけが例外である。従って、これらの条件を2個の2入力NANDとインバータで生成しPC-Inc信号を作り、それとDST-PChigh信号をORすることによりPCF1high信号を作っている。また、PCF1mid、PCF1low信号も同様にDST-PCmid信号、DST-PClow信号とPC-Inc信号をORすることにより生成している。

そしてPCF0(下位ビット)が"1"になるのはインクリメントのケースとPopのケースであるので、これらの信号のORで生成する。一方、STKFはPopとPushをそのまま使えば良いようにマルチプレクサの割り当てを行っているので、単純にこれらの信号を配線して使えばよい。PCF1信号はバスの信号の受け取りに関係するので、4ビット単位であり、high、mid、lowで異なる信号が必要になるが、PCF1とSTKF0、1信号はインクリメントやプッシュ、ポップのように12ビットを纏めて操作する場合に使われる信号であるので、high、mid、lowに共通に使用することができる。