演算回路

ディジタル回路
9. 演算回路
五島 正裕
DATE
:
ディジタル回路
今日の内容
 演算回路
1.
2.
加算器
1.
半加算器・全加算器
2.
リプル・キャリー・アダー
3.
キャリー・ルックアヘッド・アダー
シフト演算器
2
ディジタル回路
1-bit 加算器
3
ディジタル回路
二進数の加算
0
+)
0
0
+)
1
1
0
+)
1
0
1
+)
1
1
10
桁上げ
carry
1 1
1
0 1
+)
0 1
1 0
1 1
0 1
+)
1 1
1 0 0
1 1
1 1
+)
0 1
1 0 0
部分和
partial sum
← 桁上げ
1 1
+)
1 1
1 1 0
4
ディジタル回路
半加算器,全加算器
桁上げ
carry
部分和
partial sum
x
y cout s
cin x
y cout s
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
1
0
1
1
0
0
1
0
1
0
0
1
1
1
1
0
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
半加算器 (half adder)
全加算器 (full adder)
5
ディジタル回路
全加算器
xy
cin
00
01
0
1
11
xy
10
cin
1
1
1
00
0
1
01
11
1
1
1
10
1
1
s = x ^ y ^ cin
cout = x y + y cin + cin x
x
y
x
cout
cin
y
s
cin
6
ディジタル回路
n-bit 加算器
7
ディジタル回路
桁上げ伝搬加算器 (ripple carry adder)
 桁上げ伝搬加算器 (ripple carry adder)
 n 個の全加算器の cin と cout を順に接続
 桁上げ (carry) が下位から伝播
 伝搬遅延時間:O(n)
xn-1 yn-1
x1 y1
FA
cn-1
x0 y0
FA
cout
x
y
s
sn-1
cin
cn-2
c1
c-1 = 0
FA
cout
x
y
s
s1
cin
c0
cout
x
y
s
s0
cin
8
ディジタル回路
加算器による減算
 減算なら (sub = 1),減数(y)を二の補数に:
 y の各ビットを反転
 1 (= sub) と XOR
 y に 1 を加える
 c−1 を 1 (= sub) に
xn-1 yn-1
x1 y1
x 0 y0
sub
c-1
FA
cn-1
FA
cout
x
y
s
sn-1
cin
cn-2
c1
FA
cout
x
y
s
s1
cin
c0
cout
x
y
s
s0
cin
9
ディジタル回路
桁上げ先見加算器 (carry lookahead adder)
 桁上げ先見加算器 (carry-lookahead adder)
 桁上げを先読み
 伝搬遅延時間:
 O(log n)
xn-1 yn-1
x1 y1
x0 y0
c-1 = 0
carry lookahead generator
x
y
s
sn-1
cin
x
cn-2
y
s
s1
cin
x
c0
y
s
s0
cin
10
ディジタル回路
gとp
ci
= xi yi + y ci-1 + ci−1 xi
= xi yi + (xi + yi) ci−1
≡ gi + pi
ci−1
gi ≡ xi yi
:(下位からのキャリーに関わらず)キャリーが生成 (generate)
pi ≡ xi + yi :(下位からのキャリーが 1 のとき)キャリーが伝播 (propagate)
11
ディジタル回路
g と p (十進数の場合)
ci
= xi yi + y ci-1 + ci−1 xi
= xi yi + (xi + yi) ci−1
≡ gi + pi
ci−1
gi ≡ xi yi
:(下位からのキャリーに関わらず)キャリーが生成 (generate)
pi ≡ xi + yi :(下位からのキャリーが 1 のとき)キャリーが伝播 (propagate)
1 ?
5 ?
+)
5 ?
? ?
1 1
1 ?
1 ?
9 ?
+)
9 ?
? ?
gi = 1 : xi と yi は足して 10 以上
1 1
+)
8 ?
0 ?
6 ?
+)
3 ?
0 ?
pi = 1 : xi と yi は足して 9
12
ディジタル回路
gとp
ci
= xi yi + y ci-1 + ci−1 xi
= xi yi + (xi + yi) ci−1
≡ gi + pi
ci−1
gi ≡ xi yi
:(下位からのキャリーに関わらず)キャリーが生成 (generate)
pi ≡ xi + yi :(下位からのキャリーが 1 のとき)キャリーが伝播 (propagate)
1 ?
1 ?
+)
1 ?
? ?
gi = 1
1 1
1 1
0 ?
1 ?
+)
1 ?
? ?
gi = pi = 1
1 1
+)
1 ?
1 ?
+)
0 ?
0 ?
0 ?
pi = 1
13
ディジタル回路
gと p
ci
= xi yi + y ci-1 + ci−1 xi
= xi yi + (xi ^ yi) ci−1
≡ gi + pi ci−1
gi ≡ xi yi
:(下位からのキャリーに関わらず)キャリーが生成 (generate)
pi ≡ xi ^ yi :(下位からのキャリーが 1 のとき)キャリーが伝播 (propagate)
1 ?
1 1
1 ?
+)
1 ?
? ?
gi = 1 : xi と yi は足して 2 以上
1 1
0 ?
+)
1 ?
0 ?
1 ?
+)
0 ?
0 ?
pi = 1 : xi と yi は足して 1
14
ディジタル回路
漸化式 ―― g1:0 と p1:0
x1 y1 x1 y1
ci
= gi + pi ci−1
gi
pi
≡ xi yi
≡ xi ^ yi
g1
c0
= g0 + p0 c−1
c1
= g1 + p1c0
= g1 + p1(g0 + p0 c−1)
= g1 + p1g0 + p1 p0 c−1
≡ g1:0 + p1:0 c−1
g1:0
p1:0
≡ g1 + p1 g0
≡ p1 p0
p1
g1:0
x0 y0 x0 y0
g0
p0
p1:0
c1
c-1
15
ディジタル回路
g1:0 / p1:0 は,四進数 1桁 の g / p
1111
1
1001
1
1
2
1
9
+) 0 1 1 1
+)
1
3
+)
7
10000
1
0
0
1
0
二進数
四進数
十六進数
16
ディジタル回路
g1:0 / p1:0 は,四進数 1桁 の g / p
c1
= g1:0 + p1:0 c-1
g1:0
p1:0
≡ g1 + p1g0
≡ p1 p0
gi
pi
≡ xi yi
≡ xi ^ yi
 1 になるのは,x1:0 と y1:0 が:
 g1:0 : 足して 4 以上
y1:0
x1:0
0
00
1
01
2
10
3
11
0
1
2
3
00
01
10
11
p1:0
p1:0
p1:0
p1:0
g1:0
g1:0
(p1g0)
g1:0
(g1)
(p1g0)
 p1:0 : 足して 3
17
ディジタル回路
g1:0 / p1:0 は,四進数 1桁 の g / p
1 ??
1 1?
1? ?
01 ?
1? ?
+)
11 ?
+)
?? ?
1
+)
1
?
2
?
2
?
?
?
+)
1 11
00 ?
11 ?
+)
0? ?
1
?
2
?
3
?
?
?
+)
g1 = 1
g1:0 = 1 : 足して 4 以上
1
?
3
?
?
?
01 ?
10 ?
+)
00 ?
?
1
1 11
+)
00 ?
1
1
0
?
3
?
0
?
+)
1
1
?
2
?
0
?
p1g0 = 1
p1:0 = 1 : 足して 3
18
ディジタル回路
2-bit 桁上げ先見器のツリー接続
x3 y3 x3 y 3 x2 y2 x2 y2
x1 y1 x1 y1 x0 y0 x0 y0
g1:0 = g1 + p1 g0
p1:0 = p1 p0
g3
p3
g2
p2
g1
p1
g0
p0
g3:2 = g3 + p3 g2
p3:2 = p3 p2
g3:2
p3:2
g3:0
p3:0
g1:0
p1:0
g3:0 = g3:2 + p3:2 g1:0
p3:0 = p3:2 p1:0
c3 = g3:0 + p3:0 c−1
c3
c-1
19
ディジタル回路
2-bit 桁上げ先見器のツリー接続
x7/y7 x6/y6 x5/y5 x4/y4 x3/y3 x2/y2 x1/y1 x0/y0
cin
p1
g/p7
g/p6
g/p7:6
g/p5
g/p4
g/p5:4
g/p3
g/p2
g/p3:2
g/p7:4
g/p1
p0
c0
c1
g/p0
g/p1:0
g/p3:0
g/p7:0
c7
c3
c−1
c5
c6
c1
c4
c2
c0
p1:0
cout
s7
s6
s5
s4
s3
s2
s1
s0
: si = xi ^ yi ^ c−1 = pi ^ c−1
p1
g1:0
g1
p1
g0
p0
p0
c-1
g0
c-1
20
ディジタル回路
2-bit 桁上げ先見器のツリー接続
g/p7 g/p6
g/p5 g/p4
g/p3 g/p2
g/p1 g/p0
c7
c5
c3
c1
c6
c4
c2
c5
g/p7:6
p1
p0
c0
c1
c0
c1
g/p5:4
g/p3:2
c7
c3
g/p1:0
c3
c−1
cin
g/p7:4
cout
g/p3:0
c7
p1:0
p1
g1:0
p1
g1
g0
p0
p0
c-1
g0
c-1
21
ディジタル回路
4-bit 桁上げ先見器
ci
≡ gi +
pi
ci−1
gi ≡ xi yi
:(下位からのキャリーに関わらず)キャリーが生成 (generate)
pi ≡ xi ^ yi :(下位からのキャリーが 1 のとき) キャリーが伝播 (propagate)
c3
= g3 + p3 c2
= g3 + p3 (g2 + p2c1)
= g3 + p3 (g2 + p2 (g1 + p1c0))
= g3 + p3 (g2 + p2 (g1 + p1(g0 + p0 c−1)))
= g3 + p3 g2 + p3 p2 g1 + p3 p2 p1 g0 + p3 p2 p1 p0 c−1
c2
= g2 + p2 g1 + p2 p1 g0 + p2 p1 p0 c−1
c1
= g1 + p1 g0 + p1 p0 c−1
c0
= g0 + p0 c−1
22
ディジタル回路
4-bit 桁上げ先見器
p0
p1
p2
p3
c3
c2
p3
p3
p3
p2
p3
p2
p1
p0
p2
g3
p1
g2
p3:0
g3:0
g1
c0
c1
g2 p2
p2
p2
p1
p1
g1 p1
p1
p0
p0
p0
g1
g0
c-1
g0
c-1
g0
g0
c-1
c-1
23
ディジタル回路
4-bit 桁上げ先見器のツリー接続
g/p31 g/p30 g/p29 g/p28
g/p27 g/p26 g/p25 g/p24
g/p23 g/p22 g/p21 g/p20
g/p19 g/p18 g/p17 g/p16
c31
c27
c23
c19
c30
c29
c28
g/p31:28
c26
c27
c25
c24
g/p27:24
c23
c22
c21
c20
g/p23:20
c19
c18
c17
c16
g/p19:16
c31
c15
g/p63L48
c47
g/p47:32
c31
g/p31:16
g/p15:0
c63
c−1
24
ディジタル回路
シフタ
25
ディジタル回路
シフト演算
 シフト演算の種類:
 {論理,算術,ローテート} × {左,右}
 論理シフト (logical shift):
 左 1桁: 10100 ⇒ 01000
 右 1桁: 10100 ⇒ 01010
 算術シフト (arithmetic shift): 符号ビットを保存
 左 1桁: 10100 ⇒ 11000 (-12 ⇒ -8,オーバフロー)
 右 1桁: 10100 ⇒ 11010 (-12 ⇒ -6)
 ローテート (rotate):
 左 1桁: 10100 ⇒ 01001
 右 1桁: 10100 ⇒ 01010
26
ディジタル回路
算術シフト演算
 n 進数,k 桁のシフト:
 n k 倍(左),n -k 倍(右)
 二進数,k 桁のシフト:
 2 k 倍(左),2 -k 倍(右)
 粒度が小さいので,使いやすい
 (小さい整数)倍: 算術シフト & 加算
 3x = 2x + x
 5x = 4x + x
 7x = 8x - x
27
ディジタル回路
論理/算術 左シフト演算
 オーバフローする場合:
 論理シフト演算: 10100 ⇒ 01000
 算術シフト演算: 10100 ⇒ 11000
(-12 ⇒ -8,オーバフロー)
 オーバフローしない場合:
 論理シフト演算: 11010 ⇒ 10100
 算術シフト演算: 11010 ⇒ 10100
(-6 ⇒ -12)
 フラグの更新以外,論理と算術は区別する必要がない
28
ディジタル回路
バレル・シフタ(ローテータ)
x7
x6
x5
x4
x3
x2
x1
x0
shamt0
shamt1
shamt2
z7
z6
z5
z4
z3
z2
8b バレル・ローテータ
z1
z0
29
ディジタル回路
まとめ
30
ディジタル回路
まとめ
 二の補数
 正負の区別なく扱える
 「符号付き加算器」「符号なし加算器」はない
 加算器によって減算できる
 「減算器」はない
31
ディジタル回路
まとめ
 多ビット加算器
 リプル・キャリー・アダー:
O(n)
 キャリー・ルックアヘッド・アダー:
O(log n)
 シフト演算器
 O(log n)
32