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

4004のブロックダイヤを次の図に示す。この図はIntelのデータシートやWebで集めた資料などに掲載された図を元に筆者の理解を加えて作成したものである。実は、この図は、4004の設計を追いかけていく過程で何度も修正を繰り返し、この形に落ち着いたものである。

  • 4004のブロックダイヤグラム

    4004のブロックダイヤグラム

4004は4ビットマイクロプロセサであり、太線で示した内部データバスは4ビット幅であり、演算や命令ROMやデータRAMとのデータのやり取りなども4ビットを単位として行うプロセサである。

プログラムで操作できるレジスタとしては、演算結果を格納するACC(アキュムレータ)と16個のレジスタがある。これらのレジスタは全て4ビット幅である。また、実行する命令のアドレスをさすPC(プログラムカウンタ)とサブルーチンコールの場合にPCをプッシュする計4段のスタックを持つ。スタックを構成するレジスタは12ビット長である。

基本的な命令は8ビット長となっており、ROMから読み出した8ビットの命令を4ビットずつ、OPRレジスタとOPAレジスタに格納している。また、後述のように分岐先のアドレスなどを含む命令では16ビットの命令も存在する。

4004の処理サイクル

  • Intel 4004の基本命令サイクル

    Intel 4004の基本命令サイクル

この図に示すように、基本的にはA1~A3サイクルで命令アドレスをROMに送り、M1、M2サイクルでROMから読み出された命令を受け取り、X1~X3サイクルで実行を行う。

MCS-4システム

4004 CPUから外部への接続は4ビットの双方向バスと、ROMやRAMを選択するCM-ROM、CM-RAM0-3信号があるだけであり、このインタフェースに合わせて専用のROM、RAMチップが作られた。

4001 ROMチップは書き換え可能ではなく製造時のマスクで固定の値を書き込むROMであり、256×8ビットのROMアレイの他にCPUから送られてきたアドレスを保持するレジスタと、4ビットのI/Oポートを持っている。このI/Oポートも製造時のマスクでそれぞれのポートを入力にするか出力にするかを選択するというものである。

4004 CPUには最大16個の4001 ROMチップを接続することが出来る。4001 ROMはデータと同時にチップアドレスをマスクでチップに焼きこむようになっており、16個の4001チップは同じ12ビットのアドレスデータを受け取るが、最上位4ビットとこのチップアドレスが一致したチップだけが応答してデータを返すようになっている。

4002 RAMチップは320ビットのRAMの他にROMと同様のアドレスレジスタと4ビットの出力ポートを持っている。また、この320ビットのRAMは4字の状態文字(Status Character)と16字のMM文字(Main Memory Character)を単位とし、これを4組収容している。このMM文字と状態文字であるが、元々、電卓への適用を考えていたので、MM文字に仮数、状態文字に指数部を格納することを意図した設計であった。なお、このRAMはダイナミックRAMであり、リフレッシュ回路を内蔵している。

4004 CPUにはこの4002 RAMチップを最大16個接続することができるが、4002 RAMのチップ選択は4001 ROMとは異なっている。4002 RAMチップは4チップを1グループとして、これを最大4グループ接続できるようになっている。そして、グループの選択はCPUからのCM-RAM0-3信号で行う。また、グループ内の4個のRAMチップのアドレスは、まず、4002-1と4002-2という2種のチップがあり、これに加えてP0ピンを電源に接続するかグランドに接続するかにより、4002-1はグランドの場合はチップ番号0、電源の場合はチップ番号1となり、4002-2はグランドの場合はチップ番号2、電源の場合はチップ番号3になる。選択用に2ピンが使えれば-1、-2と2種のチップを製造しなくても良いのであるが、RAM/ROMもCPUと同じ16ピンパッケージに納められており、ピン数が少なく1ピンしか選択に使えないのでこのような構成になっている。

アクセスするRAMの番地を指定する命令は、8ビットのアドレスをX2サイクルとX3サイクルを使ってRAMに送るのであるが、X2サイクルに送る4ビットの内の上位2ビットでRAMチップを選択する。そして残りの下位2ビットでチップ内の4組の一つを選択し、X3サイクルに送る4ビットで16字のMM文字の一つを選択する。そして、このアドレスは4002 RAMチップに記憶され、その後、実際にRAMのMM文字を読み書きする命令を発行するというやり方をとっている。また、後述のように、状態文字をアクセスする命令はMM文字をアクセスする命令とは別に存在する。

MCS-4のチップセットには4003というI/Oポートの拡張チップがある。このチップは10ビットのシフトレジスタで、キーボードなどの多点の入力がある場合にはROM、RAMのI/Oポートでは不足するので、4003に多点の入力を接続し、それをシフトしながらシリアルにROMチップの入力ポートに入力するという方法で、時分割でポートを10倍に拡張できるようになっている。また、多点の出力を必要とする場合も上記の逆に接続し、時分割で出力ポート数を10倍に増やすことが出来るようになっている。

4004のデータシートには明確な最大クロック周波数の規定はないが、クロックパルスの幅などの規定から計算すると最小クロック周期は1.35μsで、逆数を取ると約740KHzとなる。命令の処理は基本的に8サイクルであり、1.35×8=10.8μsが1命令の処理時間として記載されている。つまり、IPC(Instruction Per Second)は92.6K命令/sで、最近のプロセサは2.4GHzクロックで1サイクル当たり1.4命令を処理すると考えるとIPCは3.36G命令/sであり、実に36,000分の1というのどかな実行速度で、最近のプロセサをスーパーカーとして時速360Kmとすると、この4004は時速10mでカタツムリより遅いスピードである。また、最近のプロセサは32ビットデータ、あるいは64ビットデータを演算できるが、4004は4ビットずつの演算であり32ビットの演算には少なくとも8命令を必要とすることを考えると、性能比は更に1桁程度開くことになる。