O'REILLY コンピューターシステムの理論と実装【第2章①】

2章ブール算術。
1章の論理ゲートを踏まえて、算術論理演算器(ALU: Arithmetic Logic Unit)を学習。
コンピューターの算術演算と論理演算はALU回路で行われる。コンピューターの命令の多くが2進数の加算に還元できるという。

2進数の復習。2進数の値11001010の10進数への変換。
 (11001010)_{two} = 1・ 2^7+1・ 2^6+0・ 2^5+0・ 2^4+1・ 2^3+0・ 2^2+1・ 2^1+0・ 2^0
一般公式( (x_nx_{n-1}...x_0)は2進数の値、bが底=2。  x_iが各桁の値。)
 (x_nx_{n-1}...x_0)_b = \sum_{i=0}^n x_i・b^i


2進数11001010は10進数で202。int型で202という値を格納するとコンピューターのレジスタに2進数11001010が格納される。
コンピュータが32bitアーキテクチャであればデータサイズが最大32bit幅のアーキテクチャとなる。上述の2進数11001010は8bitなのでデータ格納時は以下の通り左側が24bit分0でパディングされる。

00000000 00000000 00000000 11001010

2進数の加算について。
2進数のbit値同士を加算するには一番右のbit(最下位bit)から一番左のbit(最上位bit)まで加算を行う。この時桁上がりをビットを考慮して和を計算する。

f:id:sota0113:20190118132828p:plain
2進数加算

加算に際しては各桁の計算ごとに、加算対象となるx、y、桁上がりを記録するビット値の計3ビットが必要となるため上図の計算を実現する加算器は3ビット加算器と呼ばれる。

符号付きの2進数について。正負、補数の話。最上位bitが正負を示す。
6桁であれば000000 - 011111が正、111111 - 100000が負。

  • 1の例。1は6桁2進数で000001。

 (2^6)_{10} -  (1)_{10} =  (31)_{10} =  (111111)_2
ほかには、最下位bitからbitを確認し、1と遭遇した時に以降の上位bitを反転させるか、全bit反転+1で補数を得られる。
上記の式から-1の補数は111111となる。int型で-1を格納する時レジスタにはバイナリで111111が格納される。

補数を用いると(-2)+(-3)のような計算もそのまま実行できるので有用。正負を気にする必要はない。
引き算についても、上の計算(-2)+(-3)は(-2)-3と考えられるため補数を用いて足し算として計算することができる。

ここまで、本章の加算器と、1章のNand回路による論理回路構築で初歩的な算術演算と論理演算は実現可能であることが確認できた。

続いて、2章の課題の実装を行う。
課題は、1. 半加算器、2. 全加算器、3. 加算器、4. インクリメンタ、5. 算術論理演算器の構築。
1章の課題同様ハードウェアシミュレーターを用いてHDLを記述する。