SlideShare una empresa de Scribd logo
1 de 32
Descargar para leer sin conexión
コンピュータシステム
の理論と実装②
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で実装する。

Más contenido relacionado

La actualidad más candente

研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法Takeshi Yamamuro
 
コンピュータシステムの理論と実装 6章 アセンブラ
コンピュータシステムの理論と実装 6章 アセンブラコンピュータシステムの理論と実装 6章 アセンブラ
コンピュータシステムの理論と実装 6章 アセンブラYoko Yama
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Inc.
 
AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説AtCoder Inc.
 
AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Inc.
 
AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Inc.
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexprGenya Murakami
 
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)AtCoder Inc.
 
AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説AtCoder Inc.
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Inc.
 
AtCoder Regular Contest 028 解説
AtCoder Regular Contest 028 解説AtCoder Regular Contest 028 解説
AtCoder Regular Contest 028 解説AtCoder Inc.
 
AtCoder Regular Contest 024 解説
AtCoder Regular Contest 024 解説AtCoder Regular Contest 024 解説
AtCoder Regular Contest 024 解説AtCoder Inc.
 
AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Inc.
 
C++のビルド高速化について
C++のビルド高速化についてC++のビルド高速化について
C++のビルド高速化についてAimingStudy
 

La actualidad más candente (20)

研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法
 
컴퓨터개론04
컴퓨터개론04컴퓨터개론04
컴퓨터개론04
 
コンピュータシステムの理論と実装 6章 アセンブラ
コンピュータシステムの理論と実装 6章 アセンブラコンピュータシステムの理論と実装 6章 アセンブラ
コンピュータシステムの理論と実装 6章 アセンブラ
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
 
AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説AtCoder Beginner Contest 022 解説
AtCoder Beginner Contest 022 解説
 
実践QBVH
実践QBVH実践QBVH
実践QBVH
 
AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説AtCoder Beginner Contest 008 解説
AtCoder Beginner Contest 008 解説
 
Trianguler
TriangulerTrianguler
Trianguler
 
AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説AtCoder Beginner Contest 030 解説
AtCoder Beginner Contest 030 解説
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
 
AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048
 
AtCoder Regular Contest 028 解説
AtCoder Regular Contest 028 解説AtCoder Regular Contest 028 解説
AtCoder Regular Contest 028 解説
 
AtCoder Regular Contest 024 解説
AtCoder Regular Contest 024 解説AtCoder Regular Contest 024 解説
AtCoder Regular Contest 024 解説
 
컴퓨터개론02
컴퓨터개론02컴퓨터개론02
컴퓨터개론02
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
abc031
abc031abc031
abc031
 
AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説
 
C++のビルド高速化について
C++のビルド高速化についてC++のビルド高速化について
C++のビルド高速化について
 

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