コンピュータシステム
の理論と実装②
2章 ブール算術
PCで用いられる演算 → 論理演算 + 算術演算
1章ブール論理 2章ブール算術
(加算と減算)
論理演算と算術演算を処理するハードウェア装置
→ ALU(Arithmetic and Logic Unit)
2進数と10進数の関係
(𝑥 𝑛 𝑥 𝑛−1・・・𝑥0) 𝑡𝑤𝑜= σ𝑖=0
𝑛
2𝑖 × 𝑥𝑖
2進数から10進数
(ex) (11010) 𝑡𝑤𝑜= 20 × 0 + 21 × 1 + 22 × 0 + 23 × 1 + 24 × 1
= 26
10進数から2進数
連除法 ・・・ 2で割り続けて、余りを並べる
(ex) 26 → (11010) 𝑡𝑤𝑜
各桁の重み 各桁の数
262
132 0
62 1
32 0
1 1
下
か
ら
並
べ
る
2進数加算
2進数の加算 → 10進数と同様。
各桁で足し合わせ、1を超えたら桁上げ(キャリー)
(ex) 1001 + 0101
1001
+ 0101
1110
0001 キャリー
算術オーバーフロー
コンピュータでは、扱える桁数(ビット数)の上限が決まっている!
上限を超えてしまった状態 = オーバーフロー
特に
数値の計算によるオーバーフロー = 算術オーバーフロー
ex) 上限が4ビットの場合
1001
+ 0101
1110
オーバーフロー
なし
結果が4ビット
に収まってる!
1011
+ 0111
10010
オーバーフロー
あり
結果が5ビット
に突入!
算術オーバーフロー
算術オーバーフローが起こった場合の処理
→ ・ エラーを出力し、プログラムを停止
・ オーバーフローを示す特殊な値を出力
・ オーバーフローで溢れたビットを無視
・ etc.
恐らく、今回はこれ
符号付き2進数
数 → 正の数と負の数
0と1を用いて、符号付きの数をどう表現するか?
→ 2の補数表現が主流!
符号がなくてもOK
+2 or 2 −2
符号が必要
2の補数
ある𝑛 桁2進数𝑥の2の補数 ҧ𝑥は次のように定義される。
ҧ𝑥 𝑡𝑒𝑛 = ቊ
2 𝑛
− 𝑥 𝑡𝑒𝑛 (𝑥 ≠ 0)
0 (𝑥 = 0)
ex) 4桁2進数 (0010) 𝑡𝑤𝑜を2の補数表現すると
24
− 2 = 14 = (1110) 𝑡𝑤𝑜
2の補数
2の補数を簡単に求めるテクニック
1. 各ビットの数を反転させる
2. 最下位ビットに1を加える
ex) (0010) 𝑡𝑤𝑜の2の補数を求める
1. ビットの反転 → (1101) 𝑡𝑤𝑜
2. 1を加える → (1110) 𝑡𝑤𝑜
ҧ𝑥 𝑡𝑒𝑛 = ቊ
2 𝑛 − 𝑥 𝑡𝑒𝑛 (𝑥 ≠ 0)
0 (𝑥 = 0)
で求めるのは面倒。。。
2の補数
2の補数は、元の数と絶対値は同じで逆符号をもつ数となる!
ex) (0010) 𝑡𝑤𝑜 の 2の補数は(1110) 𝑡𝑤𝑜
(0010) 𝑡𝑤𝑜 ↔ (1110) 𝑡𝑤𝑜
(0010) 𝑡𝑤𝑜 + (1110) 𝑡𝑤𝑜 = (0000) 𝑡𝑤𝑜
本当に対か?
算術オーバーフローで5桁目は無視される!
符号付き2進数の注意点
(0010) 𝑡𝑤𝑜の2の補数は(1110) 𝑡𝑤𝑜 ⇒ (1110) 𝑡𝑤𝑜= −2
ただ、 (1110) 𝑡𝑤𝑜= 14では?
→ 符号付き2進数では、最上位ビットが1の場合は、負の数として扱う!
符号を考慮するなら (1110) 𝑡𝑤𝑜≠ 14
符号付き2進数の注意点
なぜ最上位ビットが1で負の数?
→ 限られたビット数で正数、負数の両方を表現するため!
ex) 数字を4ビットで扱う場合
24
= 16 通りの数を表せる → 正の数、負の数を8つずつに
分ける
→ 最上位ビットが0 : 正の数
最上位ビットが1 : 負の数
符号付き2進数の注意点
最上位ビットが0 : 正の数
最上位ビットが1 : 負の数
正の数 負の数
0 0000
1 0001 −1 1111
2 0010 −2 1110
3 0011 −3 1101
4 0100 −4 1100
5 0101 −5 1011
6 0110 −6 1010
7 0111 −7 1001
−8 1000
2進数減算
2の補数表現を用いると、減算は加算として扱える!
ex) 6 −3 = 3 を2の補数表現を用いて計算
6 −3 = 6 + (−3) = (0110) 𝑡𝑤𝑜+(1101) 𝑡𝑤𝑜
= (0011) 𝑡𝑤𝑜
= 3
加算として扱う
加算器
加算器の種類
・半加算器 ・・・ 2つの1ビットの和を求める
・全加算器 ・・・ 3つの1ビットの和を求める
・(多ビット半)加算器 ・・・ 2つの多ビットの和を求める
・インクリメンタ ・・・ 1を加える
ALU (Arithmetic and Logic Unit)
ALU ・・・ 論理演算と算術演算を処理する装置
制御ビットによって、演算の内容が操作される
今回のALUは、6つの制御ビットを用いる
→ 26 = 64通りの演算内容が存在するが、以降で重要と
なってくるのは18種類
作業
1. 4種加算器とALU回路を実装する
2. シミュレーション
半加算器
sum ・・・ 最下位ビット sum = Xor(a,b)
carry ・・・ 最上位ビット carry = And(a,b)
a b carry sum
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0
Half
Adder
a
b
sum
carry
半加算器
sum ・・・ 最下位ビット sum = Xor(a,b)
carry ・・・ 最上位ビット carry = And(a,b)
Xor
a
b
sum
carryAnd
a b carry sum
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0
全加算器
sum ・・・ 最下位ビット
carry ・・・ 最上位ビット
Full
Adder
a
b
sum
carry
a b c carry sum
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1
c
全加算器
a + b (a + b) + c
a=b=c=1の場合の例
a sum
carry
b
Half
Adder
Half
Adder
c Or
s
c
s
c
c1
s1
s1
c2
1
1
+ 1
1 0
a
b
c1 0
1 0
+ 1
1 1
c1 s1
c
c2
sumcarry
全加算器
a + b (a + b) + c
a=b=c=1の場合の例
a sum
carry
b
Half
Adder
Half
Adder
c Or
s
c
s
c
c1
s1
s1
c2
1
1
+ 1
1 0
a
b
c1 0
1 0
+ 1
1 1
c1 s1
c
c2
sumcarry
半加算器 半加算器Orゲート
多ビット加算器
16ビット2進数の加算
・・・ ・・・ 1 1
0 1 ・・・ 1 1
+ 1 1 ・・・ 1 1
・・・ ・・・ ・・・ 1 0
オペランド1
オペランド2
キャリービット(桁上げ)
Add16
a[16]
b[16]
out[16]
多ビット加算器
16ビット2進数の加算
・・・ ・・・ 1 1
0 1 ・・・ 1 1
+ 1 1 ・・・ 1 1
・・・ ・・・ ・・・ 1 0
オペランド1
オペランド2
キャリービット(桁上げ)
2ビットの足し算なので半加算器
多ビット加算器
多ビット加算器 → 最下位ビットの加算は半加算器
その他ビットの加算は全加算器
Half
Adder
s
c
a[0]
b[0]
out[0]
a[1]
b[1]
Full
Adder
s
c
out[1]
Full
Adder
s
c
out[2]
インクリメンタ
インターフェイス
実装
HDLで記述する際、0はfalse、1はtrueとする。
→ 00・・・01 = false false ・・・ false true
Inc16in[16] out[16]
Add16
in[16]
out[16]
00・・・01
1入力から2入力
→具体的な値なら増やせる?
ALU
入力 → データビット : x[16]、y[16]
制御ビット : zx、nx、zy、ny、f、no
出力 → out[16]、zr、ng
x[16]
y[16]
out[16]
nx zy ny f nozx
zr ng
ALU
ALU
各制御ビットの役割 (p.36の図を参照)
・ zx → x[16]を00・・・0にする ・ f → f=1ならx[16]+y[16]
・ nx → x[16]を否定(反転) f=0ならAnd(x[16],y[16])
・ ny → y[16]を00・・・0にする ・ no → zx~fを経た結果を否定(反転)
・ ny → y[16]を否定(反転)
ALU
具体例
zx nx zy ny f no out
if zx=1
then x=0
if nx=1
then x = !x
if zy=1
then y=0
if ny=1
then y = !y
if f=1
then out=x+y
else
out=x&y
if no=1
then out = !out
0 0 1 1 1 0 x-1
zx=0 → x[16]はそのまま f=1 → out = x[16]+y[16]
nx=0 → x[16]はそのまま = x[16]+11・・・1
zy=1 → y[16]は00・・・0になる = x – 1 (10進数)
ny=1 → y[16]は11・・・1になる
zx nx zy ny f no out
if zx=1
then x=0
if nx=1
then x = !x
if zy=1
then y=0
if ny=1
then y = !y
if f=1
then out=x+y
else
out=x&y
if no=1
then out = !out
0 0 1 1 1 0 x-1
ALU
Mux16
x
false
Mux16 And16
Mux16
y
false
Mux16 Add16
Mux16
Mux16
Or8Way
Or8Way
Or
And16true
out
zr
Andtrue ng
zx nx
f
zy ny
ALU
今回作成したALUができる算術演算は、加算と減算のみである。
→ 乗算や除算、浮動小数点演算はOSで実装する。

コンピュータシステムの理論と実装2