|
入力 |
途中の計算 |
出力 |
|||||||||
|
Xn |
Yn |
Cn |
C1 |
S1 |
C2 |
S2 |
Cn+1 |
Sn |
|||
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0+0+0=00 |
||
|
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0+0+1=01 |
||
|
0 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0+1+0=01 |
||
|
0 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
0+1+1=10 |
||
|
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1+0+0=01 |
||
|
1 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
1+0+1=10 |
||
|
1 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1+1+0=10 |
||
|
1 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1+1+1=11 |
(1)
|
入力 |
途中の計算 |
出力 |
||||||||||
|
Xn |
Yn |
Bn |
B1 |
D1 |
B2 |
D2 |
Bn+1 |
Dn |
||||
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0-0-0=00 |
0 |
||
|
0 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
0-0-1=11 |
-1 |
||
|
0 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
0-1-0=11 |
-1 |
||
|
0 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
0 |
0-1-1=10 |
-2 |
||
|
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1-0-0=01 |
1 |
||
|
1 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
1-0-1=00 |
0 |
||
|
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1-1-0=00 |
0 |
||
|
1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1-1-1=11 |
-1 |
(2)
CPU,ALUなどで多用されている
x3 x2 x1 x0
y3 y2 y1 y0
1ビットFAと遅延素子(記憶素子)で4ビットの加算を実現する
Xn
Sn
Yn FA
Cn+1
Cn
1 1 0
1
0 1 0
1
0
0 0 0
0
s3 s2 s1 s0
クロック信号
(タイミングを指示)
記憶素子
(シフトレジスタ)
全加算器FA
c
FA
X: 1101
Y: 0101
1回目の計算
S: 0000
Cn+1: 0
FA
X: 110
Y: 010
計算が終わると右へシフト
S: 0000
Cn+1: 1
0
1
0
0
1
右へシフト
最下位ビットは捨てる
右へシフト
最上位ビットに入る
1+1+0 = 10
FA
X: 110
Y: 010
2回目の計算
S: 0000
Cn+1: 1
FA
X: 11
Y: 01
計算が終わると右へシフト
S: 1000
Cn+1: 0
1
0
1
1
0
右へシフト
最下位ビットは捨てる
右へシフト
最上位ビットに入る
0+0+1 = 01
FA
X: 11
Y: 01
3回目の計算
S: 1000
Cn+1: 0
FA
X: 1
Y: 0
計算が終わると右へシフト
S: 0100
Cn+1: 1
0
1
0
0
1
右へシフト
最下位ビットは捨てる
右へシフト
最上位ビットに入る
1+1+0 = 10
FA
X: 1
Y: 0
4回目の計算
S: 0100
Cn+1: 1
FA
X:
Y:
計算が終わると右へシフト
S: 0010
Cn+1: 1
0
1
1
0
1
右へシフト
最下位ビットは捨てる
右へシフト
最上位ビットに入る
1+0+1 = 10
FA
X:
Y:
S: 0010
Cn+1: 1
X,Yは4ビットの記憶素子
FAは4回
計算をする
[メリット]
[デメリット]
|
Cn+1 |
S |
暗号化で多ビット演算が必要になってきたため見直されている
簡単な構造で専用ハードウェア化しやすい
1101
+ 0101
10010
Y0
X0
Y1
X1
全加算器
FA
全加算器
FA
S0
S1
Cn
C2
Yn
Xn
全加算器
FA
Sn
Cn+1
C1
・・・
Snを計算するにはCnが必要
Cnを計算するにはCn-1が必要
・・・
Cn+1はCPU内部で
キャリーフラグ
オーバーフローフラグ
として使う
C0=0
リップルキャリー加算器(ripple carry adder)という
Y0
X0
Y1
X1
全加算器
FA
全加算器
FA
S0
S1
Cn
C2
Yn
Xn
全加算器
FA
Sn
Cn+1
C1
・・・
C0=0
最下位ビットの計算はHA
FAをHAとして使う
すべて同じ論理回路にすると
製造コストが下がる
・部分的にHAを作ることは避けたい
・すべてFAにできないか?
FAにおいて、Cn=0であるとき
FAはHAと同じ動作をする。
Y0
X0
Y1
X1
全加算器
FA
全加算器
FA
S0
S1
Cn
C2
Yn
Xn
全加算器
FA
Sn
Cn+1
C1
・・・
Snを計算するにはCnが必要
Cnを計算するにはCn-1が必要
・・・
C2を計算するにはC1が必要
全加算器n個分の遅延が発生
計算がとても遅くなる
Cn+1はCPU内部で
キャリーフラグ
オーバーフローフラグ
として使う
C0=0
下位の全加算器からのキャリーCnを使わない
全加算器の入力にはXn,Yn,Cnが必要
入力X0,X1,...,Xn,Y0,Y1,...Ynから直接Cn+1をつくる
Cn
Yn
Xn
全加算器
Sn
Cn+1
X0,X1,...,Xn,Y0,Y1,...YnからCn+1をつくる
X0,Y0からC1をつくる
X0,X1,Y0,Y1,からC2をつくる
上位になるほど複雑になる
キャリールックアップ方式
桁上げ先見方式
[例] Y=0101 について「2の補数」をつくる
Y3Y2Y1Y0 = 0101
Y3Y2Y1Y0 = 1010
Y3Y2Y1Y0 + 0001 = 1011
0,1を反転(1の補数をつくる)
1を加算 (C0=1)
2の補数
C0=1
X=1001
Y=0101
1
0
0
1
0
0
1
1
1
1
0
1
0
Y3
1001
➖ 0101
1001
1010
+ 1
C0=1
Y3 Y2 Y1 Y0
0101を1の補数にする
C0=1
1+0+1= 10
X=1001
Y=0101
1
0
0
1
1
1
0
1
0
C1=1
0+1+1= 10
C2=1
0+0+1= 01
C3=0
1+1+0= 10
S2=1
S1=0
S0=0
C4=1
S3=0
C0=1
1001
➖ 0101
1001
1010
+ 1
10100
X=1001
Y=0101
0101を1の補数にする
1
0
0
1
0
0
1
1
1
答え
この1は見ない
S2=1
S1=0
S0=0
C4=1
S3=0
加算器と減算器を1つの論理回路にまとめる
CPU内部で演算装置ALUとして使う
加減算器
入力
X(Xn,...,X0)
Y(Yn,...,Y0)
制御信号
SUB
出力
Cn+1
S(Sn,...,S0)
|
制御信号SUB |
入力X |
入力Y |
出力Cn+1, S |
|
0 |
X(Xn,...,X0) |
Y(Yn,...,Y0) |
X+Y |
|
1 |
X(Xn,...,X0) |
Y(Yn,...,Y0) |
X-Y |
(ALU:Arithmetic Logical Unit)
1
Xn … X2 X1 X0
+ Yn … Y2 Y1 Y0
SUB=1は最下位FAのキャリーとして入力
Cn+1 Sn … S2 S1 S0
あわせて
「2の補数」
あふれた桁は見ないふり
1
0
1
1
0
0
0
0
加算だから
SUB=0
Y3=0,SUB=0だから
XOR出力は・・・
0
1
1
0
0
Y2=0,SUB=0だから
XOR出力は・・・
Y1=0,SUB=0だから
XOR出力は・・・
Y0=0,SUB=0だから
XOR出力は・・・
【重要】
これまでの知識を前提にしています
蛍光ペン(赤・青)があるとよいでしょう
各自印刷教材を準備してください
これから先は、印刷教材がなしで理解することは難しいと思います
第1回基本的論理ゲートとブール代数の基礎[1]
から
第14回組合せ論理回路の設計[7]
までの印刷教材(記入済)が
あったほうがよいでしょう