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

4ビット内部バスと各種レジスタ

ブロックダイヤグラムに示すように、4004は背骨にあたる4ビット内部バスに各機能ユニットが接続された構造になっている。そして、内部バス制御表に示したように各ユニットからバスにデータを送り出し(SRC)たり、バスからデータを受け取ったり(DST)して処理を行っている。まず、この4004の中心となる4ビット内部バスとそれに繋がる各種レジスタを設計してみよう。

次に示す図は4ビット内部バスに、外部との接続を行うデータバスバッファとTemp、OPR、OPAのようなレジスタの接続した構成の回路図である。アキュムレータACCの接続もほぼ同様であるが、ACCレジスタはバス以外にTempレジスタからの直接の入力があるので、D入力にマルチプレクサを必要とする点が若干異なっている。

  • 外部接続データバスバッファ

    外部接続データバスバッファ、レジスタの4ビット内部バス接続

FFはクロックが入ると必ずD入力からデータを取り込んで保持する回路であるが、論理設計をする場合、特定の条件だけでデータを取り込み、その他の場合には、以前の情報をそのまま保持したいという場合が多く存在する。このため、図の左上の灰色の箱に描いたように、エネーブル付きのFFを定義する。エネーブル付きのFFはD入力にマルチプレクサを持ち、 EN信号が"0"の場合はループバックのQを選択し、EN信号が"1"の場合にはD入力を選択して、クロックの立ち上がりでFFに保持する。この追体験設計では、オリジナルの4004とは異なり1相のクロックを用いるので、エネーブル付きのFFのクロックは常にΦ2であるので記載を省略する。

レジスタは、このエネーブル付きFFと出力をバスに接続するトライステートバッファ 4組で構成されており、FFのエネーブルによりバスの情報を取り込むので、これがDST制御信号であり、バスをドライブするトライステートバッファのエネーブルがSRC制御信号で駆動される。

外部ピンと接続するデータバスバッファは図の上側に描かれているように、両方向のトライステートバッファのペアで出来ている。外部ピンをドライブする側のトライステートバッファは論理回路図では同じ大きさで描かれているが、大きな負荷容量をドライブする必要があるので、物理的には大きなトランジスタが用いられている。

データバスバッファがデータを受け取るのは外部ピンに出力するためであり、DST制御信号は外部ピンをドライブするトライステートバッファのエネーブルを行う。また、SRC制御信号は、外部ピンからの信号を 4ビット内部バスに載せるトライステートバッファのエネーブルを行う。

連載第43回に掲載したバスの制御表を機能ユニット毎に整理すると、以下のようになる。ここでの記法は、:の左側にどのサイクルのDST信号、あるいはSRC信号かを示し、右側にその信号を"1"にする命令を書いている。

(1)データバスバッファ

  • 1stByte、2ndByte A1~A3 DST:全命令
  • 1stByte、2ndByte M1、M2 SRC:全命令
  • 1stByte X1 DST:全命令
  • 1stByte X2 SRC:IO read命令
  • 1stByte X2 DST:SRC、IO write命令
  • 1stByte X3 DST:SRC命令

(2)Tempレジスタ

  • 1stByte X2 DST:JCN、JUN、JMS、INC、ISZ、ADD、SUB、LD、XCH、LDM、I/O read命令
  • 2ndByte X1 SRC:JUN、JMS命令

(3)OPRレジスタ

  • 1stByte、2ndByte M1 DST:全命令
  • 2ndByte X3 SRC:全命令

(4)OPAレジスタ

  • 1stByte、2ndByte M2 DST:全命令
  • 1stByte X1 SRC:全命令
  • 1stByte X2 SRC:JCN、JUN、JMS、BBL、LDM命令
  • 2ndByte X2 SRC:全命令

(5)ACCレジスタ

  • 1stByte X2 DST:BBL命令
  • 1stByte X3 DST:ADD、SUB、LD、LDM、IO、ACC命令

(6)インデックスレジスタ

  • 1stByte X2 SRC:INC、ISZ、ADD、SUB、LD、XCH命令
  • 1stByte X3 DST:INC、ISZ、XCH命令

(7)Evenペアレジスタ

  • 1stByte X2 SRC:SRC、JIN命令
  • 2ndByte X2 DST:FIM、FIN命令

(8)Oddペアレジスタ

  • 1stByte X3 SRC:SRC、JIN命令
  • 2ndByte X3 DST:FIM、FIN命令

(9)PClow

  • 1stByte A1 SRC:全命令
  • 2ndByte A1 SRC:FIN命令以外の全命令
  • 1stByte X2 DST:JIN命令
  • 2ndByte X2 DST:JUN、JMS命令、条件成立の場合のJCN、ISZ命令

(10)PCmid

  • 1stByte A2 SRC:全命令
  • 2ndByte A2 SRC:FIN命令以外の全命令
  • 1stByte X3 DST:JIN命令
  • 2ndByte X3 DST:JUN、JMS命令、条件成立の場合のJCN、ISZ命令

(11)PChigh

  • 1stByte、2ndBye A3 SRC:全命令
  • 2ndByte X1 DST:JUN、JMS命令

(12)RS

  • 1stByte X1 DST:全命令

4ビット内部バスの制御は、以上の場合分けに従って、各ユニットのSRCとDST信号を作れば良い。

なお、バス制御表のところで述べたように、インデックスレジスタを選択するためのRSレジスタへの書き込みが必要となるのはインデックスレジスタを使う命令だけである。しかし、インデックスレジスタを使わない命令では、どのインデックスレジスタが選択されていても問題ないので、制御信号の生成を簡単にするため、このように常にRSレジスタに書き込みを行う設計となっている。

また、(7)、(8)にEvenレジスタペア、Oddペアレジスタという項がある。これはレジスタペアを扱うFIM、SRC、FIN、JIN命令では、レジスタ指定の最下位に相当するビットが命令種別の拡張に使われているので、 (7)の場合はRSレジスタの最下位ビットを強制的に"0"にし、(8)の場合はRSレジスタの最下位ビットを強制的に"1"にしてインデックスレジスタをアクセスすることを意味している。

バスの制御信号は、次の図に示すように、命令の種別、命令の第一バイトの処理か第二バイトの処理か、そしてA1からX3のどのサイクルであるかの情報を生成し、それらを組み合わせてデータバスバッファやレジスタのSRC、DST信号を生成する。

  • 4ビット内部バス制御信号発生回路(一部分)

    4ビット内部バス制御信号発生回路(一部分)。デコーダとデータバスバッファのデータ受け取り(DST)信号の生成部分の回路を示す