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

次に、インデックスレジスタに使用する16個の4ビットレジスタからなるレジスタファイルを設計してみよう。このレジスタファイルには、それぞれ4個のラッチからなる16個のレジスタと、それらの一つを選択して書き込みを行ったり、読み出しを行ったりする機能が必要である。

次の図では、ペアとなるレジスタ0とレジスタ1のビット3の部分だけを詳しく書き、その他の部分は、以下同様であるので、省略して箱だけを書いている。

  • 16個のラッチからなるレジスタファイル

    16個のラッチからなるレジスタファイル

レジスタファイルはビット数が多いので、トランジスタ数を節約し、チップ上の面積を小さくするため、FFでは無くラッチを用いる設計が一般的であるので、この設計でも記憶素子はラッチとした。そして、読み出しは、この設計では、トライステートゲートを用いてバスに接続している。読み出しを行うレジスタのトライステートゲートだけがエネーブルされてバスに信号を送り、その他のレジスタの出力はHigh-Z状態とすることにより、一つのレジスタを選択する。

どのレジスタを選択するかは図の左側のデコーダ(DEC0、1~DEC14、15)で決定する。デコーダの回路は、第40回のタイミング発生回路のところで説明したデコードとほぼ同じであり、レジスタ番号を保持するRSレジスタのQ、*Q信号の適当な極性のものをANDすることにより16個の4入力AND回路のうちの一つだけの出力が"1"となる。これにより選択されたレジスタに対して、書き込みを行うWE(Write Enable)が2入力AND回路を通してラッチのG入力に供給され、選択されたレジスタだけにBUS上のデータが書き込まれる。また、RE(Read Enable)信号が対応する2入力ANDゲートを通してトライステートゲートをエネーブルし、選択されたレジスタの内容をバスに出力する。

以上がレジスタファイルの本体であるが、レジスタファイルとして機能するためには、選択するレジスタ番号を供給するRSレジスタやRE、WE信号を生成する回路が必要である。このレジスタ番号を作る回路を次の図に示す。

  • レジスタファイルのレジスタ番号生成回路

    レジスタファイルのレジスタ番号生成回路

この図の4個のエネーブル付きFFが選択するレジスタの番号を記憶するRSレジスタを構成しており、RSレジスタへの書き込みはバス制御表において、デスティネーションがRSレジスタになっている場合であり、DST-RS信号をエネーブル端子に接続すれば良い。

通常は、単にこの4ビットの信号をレジスタファイルのデコーダに接続すれば良い。しかし、FIM、SRC、FIN、JINの4命令では3ビットでレジスタペアを指定しているので、偶数、奇数レジスタの指定を制御回路で作り出してやる必要がある。単独にレジスタを使う場合はDST-Reg、あるいは、SRC-Reg信号が"1"となり、RSレジスタのFFの出力値をそのままRS0に出力するが、レジスタペアとして使用する場合は、DST-RegOddとSRC-RegOddという奇数側のレジスタを使用する条件をORして、RS0を強制的に"1"としている。この論理回路には、偶数側のレジスタを使用する条件は明には組み込まれていないが、この場合はDST-RegとSRC-Reg、DST-RegOddとSRC-RegOddのいずれも"1"になっていないので、自動的にRS0は"0"になりEven側のレジスタが選択される。

レジスタファイルのRE、WEを生成する回路図を次に示す。

  • レジスタファイルのRE、WE信号生成回路

    レジスタファイルのRE、WE信号生成回路

レジスタファイルからの読み出しは、4ビット内部バスのソースがレジスタとなっている場合であり、SRC-Reg、SRC-RegOdd、SRC-RegEven信号をORして、RE信号として使用すれば良い。

一方、レジスタファイルへの書き込みは、そのサイクルにALUで演算を行い、その結果をバスを経由してレジスタに送り、書き込みを行うようなケースがあり、書き込むべきデータはサイクルの終わり頃のタイミングで到着するのが普通である。従って、WE信号は、DST(デスティネーション)がレジスタファイルとなっていることを示すORされたDST-Reg信号とΦ2クロックを反転した信号のANDを取って生成する。4004の実行サイクルの図に示したように、Φ2クロックは各サイクルの終わりに立ち上がりを持つ負方向のパルスであり、これを反転することにより、各ラッチへのG入力はサイクルの終了前に"1"となりサイクル終了時点で"0"になるので、サイクル終了時点における入力データを保持するという動作を行うことが出来る。

なお、このレジスタファイルの回路図では、各レジスタがトライステートゲートを介して直接4ビット内部バスに接続されるように描かれているが、このようにすると16個のトライステートバッファの寄生容量がバスに接続され、バスの動作が遅くなるという問題がある。これを解決するには、レジスタファイルのBUS0~3を直接4ビット内部バスに接続するのではなく、外部ピンをドライブするデータバスバッファのような双方向のトライステートバッファ介して、4ビット内部バスに接続するという構成とすれば良い。そして、ORされたDST-Reg信号と、ORされたSRC-Reg信号でこのバスとレジスタファイルの間のトライステートバッファのエネーブルを制御することにより、レジスタファイルとプロセサ全体の4ビット内部バスのBit-0~3の間で必要なタイミングでデータを中継することができ、かつ、バスに接続される寄生容量を減らすことが出来る。