7839

雑草魂エンジニアブログ

演算回路(1)組合せ論理回路

現在、CSの勉強のために、コンピュータアーキテクチャ (電子情報通信レクチャーシリーズ)を読んでいる。

P.13

f:id:serip39:20220206183354j:plain
コンピューターの演算サイクル

コンピューターの演算サイクルをなんとなく理解できたが、この基礎をしっかり抑えておきたいと思い、自分なりにまとめてみた。

計算とは

  • 計算とは、1個以上の2進数データから、新たに1個以上の以上の2進数データを作ることである。
  • 計算は論理式で表現され、組合せ論理回路として実現される。
  • 組合せ論理回路は、数種類の基本素子で実現される。

f:id:serip39:20220208013017j:plain
基本的な論理回路

加算器

加算は全ての演算の基本である。1ビットの加算を行う回路は以下のようになる。下の桁からの桁上がりを考慮するか否かで、半加算(HA)と全加算(FA)がある。

f:id:serip39:20220212220807j:plain

論理代数の計算に関しては、1になっている部分のみを抽出することで表現することができる。全加算の桁上げCの簡単化において、ABC項を3度使用している。これは、べき等則A+A+…+A = Aから、1つの項を何度使用してもいいので、このような式変形が可能となっている。また、全加算の桁上げCは、多数決回路になっている。全加算の和Sは、3入力のXOR回路になっているので、置き換えることができる。(排他的論理和であるXORは、「入力のうち奇数個が真ならば真、偶数個ならば偽」となる。)

次に、半加算を2つ使うことで、全加算の構成ができることを確認する。

f:id:serip39:20220211225019j:plain

半加算の和Sである、XOR演算を使う形にできるように変形することで導出することができた。

次に、1ビットではなく、4ビットの加算を考えてみる。

f:id:serip39:20220213002521j:plain

手計算同様に、下位桁から上位桁に向かって順次桁上げをし、加算を行なっていく。この場合、ビット数が増えれば増えるほど、加算結果の出力までに多くの時間を要してしまう。このように、順次桁上げをして、加算する方式をリプルキャリー方式という。(rippleはさざ波のことで、順々に伝わって広がっていくことが語源とのこと。)

リプルキャリー方式の加算時間遅れ解消のために、ルックアヘッドキャリー方式が考案された。(Look ahead carry:先見桁上げ)下位の桁上がりの計算結果を待たなくていいように、下位の全ての桁上がりを前もって演算し、各桁に加算するようにしている。

減算器

減算 X − Y は X + (−Y) を計算するようにすれば、減算も加算で処理することができる。(−Y)は、2の補数をとって求めることができる。

補数(Complement)

  • 2進数の2の補数(基数の補数)
    • 足し合わせるとちょうど桁上げが発生する
    • C + Y = 2n → C = 2n − Y
    • ex) C = 24 − 1010 = 10000 - 1010 = 0110
  • 2進数の1の補数(減基数の補数)
    • 2の補数より1小さい
    • 足し合わせても桁上げが発生しない
    • C + Y = 2n − 1 → C = (2n − 1) − Y
    • ex) C = (24 − 1) − 1010 = (10000 - 1) - 1010 = 111 - 1010 = 0101
    • 元の数の各桁の"1"と"0"を反転させることで求めることができる

1の補数は"1"と"0"を反転させるだけでいいので、2の補数との関係性は以下の式が成り立つことより、2の補数は簡単に求めることができる。

(2の補数)=(1の補数)+ 1

加算器による減算回路

(−Y)の2の補数を求められるように、まずNOT回路でYを反転して、桁上がり入力Cinを使って「+1」できるようにする。減算の場合、X − YがX < Yの場合に、計算結果がマイナスになってしまう。この見分けに関しては、桁上がり出力Coutで判断することができる。

また、加減算回路はYの入力をXOR回路で制御することで構築することができる。

f:id:serip39:20220213014853j:plain

まとめ

加減算回路の導出までをまとめてみた。久しぶりに論理代数を使って、式変形による証明もすることできちんと理解を深めることができた。

関連書籍