2012年11月4日増補 Intel 4004

Intel 4004の回路図を読む

5. インデクスレジスタとアドレスレジスタ

omiokone


4004ファミリの4002 RAMは電卓の浮動小数点数用に特化したもので、通常の汎用RAMを持たない。そのため実質作業RAMとして使える4bit×2×8=64bitのインデクスレジスタを備えている(回路図1枚目右半分)。
下図でQ1~Q3が1bitのレジスタセルで、8×8のマトリクスを形成している。Wは8bitワード書き込み選択線、Rは読み出し選択線。読み出しはまづM2サイクルでQ4を閉じQ5のゲートをLレベルにプリチャージしておく。次のX1でOPAの上位3bitで選択されたRによりQ3が閉じて記憶内容がQ5に転送される。ここまでは命令の種類によらない。その後各命令の必要に応じQ6を経由し4bit単位で内部バスに送られる。書き込みはQ5にバス値を取り込み次のA1サイクルにQ1経由で行う。書き込みは8bit一括だが、Q7が閉じなかったビットはX1で読み出した自分自身の値が入るので4bit単位にできる。これらのしくみで本来16本ずつ必要な書き込み/読み出し選択線を8本ずつで済ませている。

index register

レジスタマトリクスの下には書き込み/読み出し信号を生成するための3 to 8デコーダがある。このデコーダの入力部分もダイナミックレジスタとして機能し、M2サイクルで取り込んだOPAの上位3bitを命令実行中保持していることに注意。デコーダにはFIN・X12信号が接続されている。FIN命令は特別で0番目の8bitレジスタの値をアドレスとしてROMを読み出す。そのため強制的にデコーダに0番目を選択させる回路になっている。

インデクスレジスタは定期的に自分の値を読み出して再書き込みするリフレッシュを行う。具体的にはA2でプリチャージ、A3でQ5へ読み出し、M1で書き込みである。再書き込みは8bitずつ8回に分けて行うため、3bitのリフレッシュカウンタを使う(回路図1枚目右下)。下図がカウンタ1bitの回路で、いま中央のフリップフロップのQ1=ON、Q2=OFFの状態"0"でA入力にLが加わると状態がQ3 Q4に転送されQ3=OFF、Q4=ONとなる。さらにB入力Lで、フリップフロップが反転し状態"1"となる。つまりA→Bの順でLになると状態が反転する。このフリップフロップの出力A' B'を上の桁の入力にすると、"1"→"0"の遷移で上の桁が反転するリプルカウンタとなる。

refresh counter


12bit×4のアドレスレジスタはPC(プログラムカウンタ)とサブルーチンのリターンアドレスの格納に使われる。2bitのEAC(Effective Address Counter)は4組のレジスタのどれをPCとして使うかを示す。下図(a)ではEAC=0でレジスタ0がPC。0100番地でサブルーチンジャンプ JMS 0200が実行されるとEACが+1されレジスタ1にジャンプ先のアドレスが格納される(b)。このときレジスタ0はJMSの次の命令を指していることに注意(JMSは2バイト命令)。これ以降はレジスタ1をPCとして実行が進む。0210番地でリターン命令BBLが実行されるとEACは-1され、レジスタ0をPCとして先ほどのJMSの次から実行される(c)。このようにJMSでEACがアップ、BBLでEACがダウンされるスタックで、3段までのサブルーチンコールができる。

address stack

回路図1枚目左半分のアドレスレジスタはインデクスレジスタと同様の回路。EACは本来アップダウンカウンタが必要だが、2bitなのでBBL命令では-1するかわりに3回+1することでアップカウンタで済ませている。嶋氏の著書(注)に「アップダウンカウンタの簡単な作り方をファジンに教えたり」とあるのはこの部分のことであろう。
(注)嶋正利「マイクロコンピュータの誕生」p75 岩波書店 1987

PCは前の命令サイクルのX3で12bitまとめて読み出される。A1~A3サイクルで4bitずつバスに送出された時に、左にあるインクリメンタで値を+1してバッファ(インデクスレジスタのQ5に相当)に書き戻される。この部分は同期カウンタと同じで、下位ビットが全て1の時そのビットが反転する回路になっている。PCはM1で更新される。リフレッシュはX1で読み出し、X2で書き込み。ただしジャンプ命令などではバッファの値を書き換えるため、通常の読み書きをINH信号で抑制する。

INH = (JUN+JMS)・DC + (JCN+ISZ)・CN・DC + (JIN+FIN)・SC
(CNはジャンプ条件成立)

<4 | Intel 4004 | 6>