読者です 読者をやめる 読者になる 読者になる

幼女でもできる自作CPUチップ (13) レジスタ・プログラムカウンタのLSI向けレイアウト

前回の記事

ourfool.hatenablog.com

では、CPUチップの製造に向けて、命令デコーダとデータセレクタのレイアウトをおこなった。

 今回は、残された回路ブロックである、レジスタとプログラムカウンタのレイアウトについて書いていく。

 最初におさらいしておくと、外部メモリやクロック回路、命令デコーダも含めたCPU全体のブロック図と、演算コア内部のブロック図とは、それぞれ以下のようになっていたのであった。

f:id:ourfool:20170227001555j:plain

 

f:id:ourfool:20170303192320j:plain

  前回までに、ALU、命令デコーダ、データセレクタのレイアウトを終えたため、残ったのは、レジスタA, Bとプログラムカウンタ、出力ポートとなる。このうち、レジスタA, Bと出力ポートは、回路としては同一のものである。したがって、レジスタとプログラムカウンタのレイアウトを完了すれば、一通りの要素ブロックレイアウトが完了することとなる。

 これまで書いてきたALU、命令デコーダ、データセレクタが全て組み合わせ回路—現在の入力信号に応じて出力信号が一意に定まる—だったのに対して、今回書いていくレジスタやプログラムカウンタは順序回路—クロック信号の立ち上がりに応じてデータを変化させる、つまり過去のデータを保持することができる—である。クロックが出てくるといよいよディジタル回路という感じがしてよさを感じる*1

 まず、レジスタについて書く。レジスタはDフリップフロップと2入力のマルチプレクサから構成されている。

f:id:ourfool:20170303222713j:plain

 Dフリップフロップはクロックの立ち上がりでDの値を取り込み、Qへ出力する機能を持っている。次にクロックがもう一度立ち上がるまでは、その値を保持し続ける*2。ここでは、マルチプレクサの出力がDと繋がっている。仮にLoadの値が0だと、Dフリップフロップの出力Qは入力Dへと短絡され、クロックが何度立ち上がってもDとQは同じ値を保持し続けることになる。一方、Loadが1になると、Dフリップフロップには外部から来たDataが入力される。これによって、Dフリップの入出力はDataへと変更される。

 以上に示したように、この回路が、Loadが0→同じ値を保持し続ける、Loadが1→Dataを取り込む、という機能を持った記憶回路として働くことがわかる。これを5つ並列にすると、5bitレジスタの完成である。

f:id:ourfool:20170303234655j:plain

  次に、プログラムカウンタについて書く。カウンタの機能はクロックの立ち上がり毎に2進数の00000から11111まで出力値を変えていくというものである。基本的な構成はレジスタと似ているが、ちょっと面倒な回路なので細かな説明は省略する。ネット上の記事だとこちら

qiita.com

が詳しいしわかりやすいので、是非ご参照いただきたい。
 そんなこんなで、プログラムカウンタのレイアウトについては、以下のようになった。

f:id:ourfool:20170303235736j:plain

 

  さて、レイアウト後に、それぞれについて前回の記事同様SPICEファイルを生成し、その挙動を検証した。

 以下はレジスタについてのシミュレーション結果である。rst(リセット信号)がHIGHのときにクロックの立ち上がりに応じてout0(出力信号)がLOWへリセットされ、load(読み込み信号)がHIGHのときにはクロックの立ち上がりに応じてin0(入力信号)をout0へ反映し、LOWのときには以前の値を保持し続けていることがわかる。

f:id:ourfool:20170303235905j:plain

 次に、プログラムカウンタのシミュレーション結果を同様に示す。クロック信号の立ち上がりに応じて、rst(リセット信号)がHIGHのときリセット、以降は出力信号の各bit (out4, out3, out2, out1, out0)が、(0, 0, 0, 0, 0)から(1, 1, 1, 1, 1)まで、つまり10進数で示すと0から31まで、クロックに応じて順々に増えていっていることがわかるはずである。LOWとかHIGHとか0とか1とか混在して無茶苦茶な説明だが、とにかく動作は合ってるので感じ取っていただきたい。

f:id:ourfool:20170304000239j:plain

 さて、そんなわけで、全ブロックのレイアウトを終えた。命令デコーダ以外を適当に並べたレイアウトが以下のツイートの添付画像である。

 今回までで、CPUチップに搭載する各ブロックのレイアウトを全て終えることができた。あとは、これらの入出力を適当に配線でつなぐだけである。こんな楽勝な作業はない、ほぼ優勝確—なんてことはあるわけがなく、地獄を見た。がそれについては次の記事で書くこととする。

*1:現在のディジタル回路のほとんどはクロック信号を元にした同期設計である。しかし、非同期設計にも長所があり、むしろ研究ネタとしてはこっちが盛り上がっていく気配もある

*2:Dフリップフロップの詳細動作についてはめんどいので省略する。一応内部回路構成について述べておくと、マスタースレーブ方式(Dラッチ2つを接続した構造)で、スイッチ+インバータではなく、クロックドインバータを用いている