7483减法器和BCD加法器

不要单独做一个复杂的减法器,而是用 7483 这个 4 位全加器,通过补码把减法变成加法。

也就是:

A - B = A + (-B)

而在二进制里:

-B = B 的二进制补码 = 反码 + 1

所以真正要做的是:

A - B = A + 反码(B) + 1

1. 减法为什么可以用加法器实现?

以 4 位为例:

A = 1100
B = 0101

十进制就是:

A = 12
B = 5

要算:

A - B = 12 - 5 = 7

在二进制里,不直接减,而是算:

A + B 的补码

B 是:

0101

先取反码:

1010

再加 1,得到补码:

1011

所以:

A - B
= 1100 - 0101
= 1100 + 1011

计算:

  1100
+ 1011
------
1 0111

结果低 4 位是:

0111

也就是十进制 7。

最高位多出来的 1 是 Co,在减法里它通常表示:

Co = 1,说明没有借位

2. 关键电路:在 B 输入前面加 XOR 门

关键电路:在 B 输入前面加 XOR 门

bit de sélection de l’opération

运算选择位

设这个选择位叫:

M

然后让 B 的每一位先经过 XOR 门:

B0' = B0 ⊕ M
B1' = B1 ⊕ M
B2' = B2 ⊕ M
B3' = B3 ⊕ M

同时把 7483 的输入进位设成:

Ci = M

于是整个电路实际计算的是:

S = A + (B ⊕ M) + M

当 M = 0:做加法

那么 XOR 的性质是:

B ⊕ 0 = B

所以 B 不变。

同时:

Ci = 0

因此电路变成:

S = A + B + 0

也就是普通加法:

S = A + B

当 M = 1:做减法

如果选择位:

M = 1

那么 XOR 的性质是:

B ⊕ 1 = 反码(B)

所以 B 的每一位都会被取反。

同时:

Ci = 1

于是电路变成:

S = A + 反码(B) + 1

而:

反码(B) + 1 = B 的补码

所以:

S = A - B

因此:

M B 输入 Ci 功能
1 B 取反 1 A – B

3. 完整公式总结

这个加减法器的统一公式是:

S = A + (B ⊕ M) + M

所以一个 7483 加上一组 XOR 门,就可以变成:

4 位加法 / 减法共用电路

4. Co 在减法里是什么意思?

Co 在减法里是什么意思?

这一点很重要。

在普通加法里:

Co = 1

通常表示最高位产生了进位,也就是结果超过了 4 位范围。

例如:

  1100
+ 0101
------
1 0001

低 4 位是:

0001

但是 Co = 1,说明真实结果是 17,已经超过 4 位能表示的最大无符号数 15。

在减法里,Co 的含义不一样。

当做:

A - B

时:

Co 含义
1 没有借位,A ≥ B
0 发生借位,A < B

所以减法时:

例如:

A = 0101 = 5
B = 1100 = 12

算:

A - B = 5 - 12 = -7

用 4 位补码计算:

B = 1100
反码(B) = 0011
补码(B) = 0100

所以:

  0101
+ 0100
------
  1001

结果是:

1001

在 4 位补码里,1001 表示 -7。

此时:

Co = 0

说明发生了借位,也说明无符号意义下 A 小于 B。


5. retenue / dépassement”

法语里的:

retenue

意思是:

进位

或者在减法语境下,也可以用来理解为和借位有关的信号。

法语里的:

dépassement

意思是:

溢出 / 超出表示范围

La valeur de la retenue indiquera un dépassement également.

进位的值也可以指示是否发生了超出范围的情况。


6. BCD / 十进制加法部分

L'additionneur en base 10
Binary-Coded Decimal

也就是:

十进制加法器
BCD 码

BCD 的意思是:

Binary-Coded Decimal

中文叫:

二进制编码的十进制数

它不是直接用二进制表示整个数字,而是每一个十进制数字单独用 4 位二进制表示。

例如:

18

在普通二进制里是:

10010

但是在 BCD 里是:

0001 1000

也就是:

1 = 0001
8 = 1000

所以:

(18)10 = (0001 1000)BCD

7. 为什么 BCD 加法要 “加 6”?

一个 4 位二进制数可以表示:

0000 ~ 1111

也就是十进制:

0 ~ 15

但是 BCD 每一组 4 位只能表示十进制数字:

0 ~ 9

也就是:

0000 ~ 1001

下面这些在 BCD 里是非法的:

1010 = 10
1011 = 11
1100 = 12
1101 = 13
1110 = 14
1111 = 15

所以当两个 BCD 数字相加后,如果结果大于 9,就需要修正。

修正方法是:

加 6

也就是:

+ 0110

例如:

8 + 7 = 15

直接二进制加法得到:

  1000
+ 0111
------
  1111

但是 1111 在 BCD 里非法。

所以加 6:

  1111
+ 0110
------
1 0101

低 4 位是:

0101

表示 5。

前面的进位 1 表示十位进 1。

所以结果就是:

15

BCD 表示为:

0001 0101

7. BCD 修正条件

BCD 修正条件

K = Co + R3R2 + R3R1

也可以写成:

K = Co + R3(R2 + R1)
8 = 1000 → R3=1, R2=0, R1=0
9 = 1001 → R3=1, R2=0, R1=0
10 = 1010 → R3=1, R2=0, R1=1
11 = 1011 → R3=1, R2=0, R1=1
12 = 1100 → R3=1, R2=1, R1=0
13 = 1101 → R3=1, R2=1, R1=0
14 = 1110 → R3=1, R2=1, R1=1
15 = 1111 → R3=1, R2=1, R1=1

当:

K = 1

说明结果不是合法 BCD,或者已经产生了十进制进位。

这时第二个 7483 会再加:

0110

也就是加 6。

当:

K = 0

说明结果在 0 到 9 之间,不需要修正。