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

幼女でもできる自作CPUチップ (5) ALU設計

電子工作 自作LSI

 前回の記事

ourfool.hatenablog.com

では、CPUの命令セットに準拠した命令デコーダの設計をおこなった。

 今回は、命令デコーダの出力に応じて種々の演算をおこなう、CPUの中でもっともつよいもの、ALUの設計をおこなう。

 前回の記事に示した命令デコーダの出力のうち、S2、S1、S0がALUの演算機能を切り替えるための信号、SelectALUである。内部データパス図で示したとおり、SelectALUは3bitの信号であり、この3bitの組み合わせによって、加算、減算、論理演算(AND、OR、NOT)と、ALUの機能を切り替える。命令の内容と照らし合わせるとわかるように、SelectALU信号に応じて実現するべき演算内容は以下のようにまとめられる。

f:id:ourfool:20160606182243p:plain

SelectALU=101~111はそもそも入力として現れないため、前回のデコーダ設計と同様、気にしないこととする。

 これらの演算を実現できるよう、各演算用の回路ブロックを搭載することとし、ALU内部を回路ブロックごとの接続図で表してみる。

f:id:ourfool:20160606182525p:plain

台形を横にしたようなブロックは、2入力のマルチプレクサである。1bit(0 or 1)の信号に応じて、2つの入力のうちどちらを出力するか選択する。加減算器ブロックは、加算、減算用の回路をひとつにしたものである。先ほどの表を見てみると、加算と減算ではSelectALU[0]の値が異なっているので、この信号で加算と減算を切り替えればよい。SelectALU[2]では加減算器の出力をインバータに入力するか、しないかを切り替える。インバータを挟んだ場合、NOT演算が実現できる。また、AND演算器とOR演算器はSelectALU[0]で切り替える。最終段ではSelectALU[1]に応じて、どちらかの入力を選択する。上に示した表と見比べてみると、SelectALUに応じて適当な演算器の出力が選択されるように、たぶん、なっているはずである。

 さらに、ブロックの中身を詳しく見ていく。

f:id:ourfool:20160606184504p:plain

加減算回路は全加算器(FA)とマルチプレクサ(Mux)によって実現する。全加算器をデータのbit数と同じだけ並べることで、加算を実現する。さらに、全加算器への入力をインバータにより反転させることで、減算を実現する。これが、情報系の耳タコワードたる「2の補数」による減算というやつである。ウェハ上のレイアウトを作成する前に、このブロック図をさらに論理ゲートレベルまで落とす必要があるが、煩雑になるので今回はやめておく。

 他のブロックについても見てみる。

f:id:ourfool:20160606184904p:plain

 ANDとORはゲートレベルのANDとORをデータのbit数分並列に並べるだけであり、ドチャクソ簡単である。女児向けの説明にはなるが、ANDゲートやORゲートの記号を使わずに敢えてNANDゲート+インバータ、NORゲート+インバータと表現しているのは、今後CMOS回路でこれを実現したいからである。CMOS回路では、トランジスタの動作上、NANDやNORゲートが基本単位となる。ANDやORゲートはそれらにインバータを付けて実現すると考えておくとわかりやすい。このあたりはトランジスタレベルの回路を見てみると速攻で理由がわかって優勝できる。

 今回はALUの具体的な回路構成を策定した。次回はこれらをLTSpice上でシミュレーションし、演算が正確におこなえるかどうか調査する。余力があれば、命令デコーダともつないでみたい。

 なお、これまで書くタイミングがなかったが、本記事は以下のような書籍を参考にして執筆している。どの本も、知ってる幼女は確実に知ってる、知らない幼女は覚えとかないと死ぬぞといった感じのアンセムである。晴れて5回記事が続いたということで、続いているうちに示しておく。

コンピュータの構成と設計 第5版 上

コンピュータの構成と設計 第5版 上

 
コンピュータの構成と設計 第5版 下

コンピュータの構成と設計 第5版 下

 
ディジタル回路設計とコンピュータアーキテクチャ (IT Architects' Archiveクラシックモダン・コンピューティング)

ディジタル回路設計とコンピュータアーキテクチャ (IT Architects' Archiveクラシックモダン・コンピューティング)

 
CPUの創りかた

CPUの創りかた