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

4004プロセサは連載の32回に掲載した基本命令サイクルの図に示すように、A1-3、M1-2、X1-3の合計8サイクルで一つの命令を処理する。論理設計の足慣らしとして、この8サイクルのタイミングを発生する回路を作ってみよう。NANDゲートやフリップフロップ回路は分かったけれど、これを使って論理機能をどうやって作るのかを理解したいという読者向けで、8進のカウンタとデコーダという簡単な回路なので、そんなものを作るのは朝飯前という読者は読み飛ばして戴きたい。

ここでは電圧はLow/Highの2状態を取り、Lowが論理"0"、Highが論理"1"を表わすとする。また、NAND回路は入力の論理値のANDの否定を出力する回路である。フリップフロップ(FFと略記する)は、クロックCKが"0"→"1"に変化するタイミングでD入力の論理値を記憶してQ出力に出力し、それ以外のタイミングではFFの出力は変化せず以前の状態を保持する。

タイミング発生回路は、Sync入力がLowになるとその次のサイクルはA1になり、全体を8サイクルで繰り返す必要がある。8サイクルの周期であるので、各サイクルを区別するには、最低3ビット(2の3乗=8)の状態が必要である。このため、3個のFFを用いる回路を設計したものが次の図である。

  • 8状態のタイミング発生回路

    8状態のタイミング発生回路

4004のタイミング発生回路はΦ1、Φ2とSyncという入力を持つが、Φ1、Φ2は2相のPMOSダイナミック回路であることから必要になったものであり、FFを使った1相クロックのタイミング発生の観点からはΦ2をクロックCKとして良い。

正確には、4004はSync入力を受け取るのではなく、X3サイクルの信号からSyncを発生し、他のチップに送り出す。一方、4001 ROM、4002 RAMは、同期のために4004からのSyncを受け取っている。従って、上記の回路は4001、4002用のタイミング発生回路である。

一方、4004 CPUにはReset信号があり、この信号をSync入力に入れ、Resetが解除された次のサイクルからA1 サイクルが始まるようにすれば良い。

MCS4システムのタイミング図では、Sync入力が"0"の状態でクロックCKが入るとA1状態となる必要がある。上記の回路においては、全部のFFがリセットされてQ出力が"0"となった状態を最初のA1サイクルとしている。

従って、Sync入力が"0"の状態でクロックが入ると全部のFFが"0"状態となり、Syncが"1"の場合は、FF1、FF2、FF3の順に上位ビットとすると、最下位のFF1はクロックがL→Hと変化(クロックが入ると呼ぶ)するに従って状態を反転し、次に上位のビットであるFF2はFF1が"1"の状態でクロックが入ると状態を反転する。また、最上位のFF3はFF2、FF1の両方が"1"の状態でクロックが入ると状態を反転する。そして、各FFは、これ以外の条件では、クロックが入っても以前の値をそのまま保持するという回路を作れば良い。

上図のNA1、2、3、6、7のNAND回路にはSyncが入力されており、Sync=0になるとこれらの回路の出力は"1"となる。これにより、インバータやNA4、NA8の出力は"0"となりFF1、2、3の入力が"0"となるので、クロックであるΦ2が入るとFF1、2、3は全て"0"となる。

Sync=1の状態では、NA1の他方の入力はFF1の*Qであり、クロックが入るたびにFF1の状態は反転する。FF2のD入力は、FF1の状態(Q出力)が"0" (*Qが"1")の場合は、NA2、NA4を経由してFF2自身のQ出力と同じ状態がD入力に入るので、クロックが入っても以前と同じ状態を保つ。一方、FF1の状態が"1"の場合は、NA3、NA4を経由してFF2自身の*Qが入力されるので、クロックが入ると状態が反転する。同様にFF3は、FF1とFF2がともに"1"の場合にはNA7、NA8経由でFF3自身の*QがD入力にフィードバックされるので、クロックが入力されると状態を反転するが、それ以外の場合にはNA6、NA8経由でQがフィードバックされるので、以前の状態を保つ。

これで8状態の遷移を行う回路が構成できたので、残りはFF1~3の3ビットの状態からA1~3などの8つのタイミング出力へのデコードである。A1はFF1~3の全部が"0"の状態であるので、FF1~3の*Qが全て"1"の状態をNAND回路で検出し、これをインバータで否定する(結果としてANDとなる)ことにより作ることが出来る。また、A1はFF1~3が"1"、"0"、"0"の状態であるので、FF1はQ、FF2、3は*QのANDを取ることにより作ることが出来る。残りの状態についても同様に、各状態の2進数表示が"1"の場合はQ、"0"の場合は*Q側の信号をANDすれば良い。これを行うのが図のFF群より右側の回路である。