幼女でもできる自作CPUチップ (6) ALUのゲートレベル表現

 前回の記事

ourfool.hatenablog.com

では、CPUの中でもっともつよいもの、ALUの設計をおこなった。

 ALUの構成要素のうち、AND演算器、OR演算器、マルチプレクサはゲートレベルの表現を示したが、加減算器は面倒なので先送りしていた。今回はこの加減算器のゲートレベル表現をおこなっていく。

 ALUとその内部にある加減算器の構成を再掲しておく。

f:id:ourfool:20160607235815j:plain

 

f:id:ourfool:20160607235930j:plain

 加減算器の構成要素のうち、インバータは既にゲートレベル表現であり、マルチプレクサのゲートレベル表現も前回の記事で示している。したがって、あとは全加算器さえゲートレベルで表現してやれば、加減算器のゲートレベル化はクリア、よってALU全体もクリア、ということになりそうである。

 さて、全加算器について書く前に、その構成要素である半加算器について見ていく。

f:id:ourfool:20160608000330j:plain

半加算器は、2つの入力信号DataA、DataBの足し算結果を出力する回路である。2進数であるから、0+0=0、0+1=1、1+0=1、1+1=10(繰り上げ)というような感じになっている。足し算の結果はSumとして出力される。1+1で繰り上がりが発生する場合のみ、桁上げ信号Carryが1になる。

 半加算器の真理値表を満たすゲートレベル表現は以下のようになる。うまいことすることでNANDとインバータだけで表現できる。半加算器の設計にもいろいろと工夫のしようはあるのだが、今回はごく普通のCMOS回路としておく。

f:id:ourfool:20160608001201j:plain

 一見すると半加算器でしっかり足し算ができるように思えるが、半加算器はあくまで半人前の加算器である。理由は、複数bitの足し算をおこなう場合、2つの入力に加えて下の桁からの繰り上がりを考慮しなければならないからである。

 繰り上がりを考慮した加算器を全加算器と呼ぶ。全加算器は以下のような構成である。

f:id:ourfool:20160608001045j:plain

図からわかるように、全加算器は2つの半加算器とORゲートから構成できる。1段目の半加算器で2つのデータの足し算結果を出力している。その結果と、下の桁からの桁上がり信号ICarryとをさらに2段目の半加算器で足し合わせ、最終的な結果をSumとして出力している。1段目の足し算と2段目の足し算のどちらかで繰り上がりが発生していれば、それを上の桁に伝える桁上げ信号OCarryとして出力する。これで加算演算が実現できた。

 半加算器のゲートレベル表現は上に示したとおりであるから、それを2つ組み合わせれば全加算器のゲートレベル表現ができる。

f:id:ourfool:20160608002107j:plain

これでいよいよALUが完成–––ではなく、最後にもう一工夫を加えておく。

f:id:ourfool:20160608002239j:plain

OCarryを出力するORゲートの2入力はどちらもインバータを経ている。つまりここで、「notAまたはnotB」は「not「AかつB」」、というガチで女児レベルの定理を活用できる。ドモルガン律からの全てNANDのみ構成––––––優勝!!!

 というわけで今回は、ALUの回路をすべてゲートレベルで記述することができた。次回はこれを回路シミュレータに記述し検証をおこなう。