13 | 加法器:如何像搭乐高一样搭电路(上)?

如何通过电路,在硬件层面设计最基本单元:门电路,做简单的 “与(AND)”“或(OR)”“NOT(非)”和“异或(XOR)”,下面这些门电路标识组合起后续的电路

计算机硬件端最基本“积木”,包含十亿级别晶体管CPU,都是由这样一个个的门电路组合成的。

一、异或门和半加器

基础门电路,输入、出都是两个单独的 bit。对 2 个 8 位(bit)数,与、或、非这样的简单逻辑运算,连续摆放 8 个开关代表一个 8 位数)。两组开关,从左到右,上下单个用“与门”或者“或门”连起,两个 8 位数的 AND 或者 OR 运算

整数加法电路稍微复杂,8 位无符号(不需用补码表示负数、“0”或“1”都是正数)整数的加法

8 位数整数用 8 个 bit,2 个 8 位整数加法,就是 2 排 8 个开关。结果也是一个 8 位的整数,什么样的门电路,能够连接起加数和被加数,得到最后期望的和。

加法器:把这三排开关电路连起来

列竖式计算。从左到右,一位位逢 2 进 1计算。输入4 种组合,00、01、10、11就是我在上一讲留给你的思考题里面的“异或门(XOR)”。

讲与、或、非门,很容易就能和程序里的“AND( & )”“ OR( | )”和“ NOT( ! )”对应。为什么需要“异或(XOR)”,逻辑运算里面没有,作为一个基本电路。异或门就是最简单的整数加法,所需要使用的基本门电路

有且仅有输入两位都是 11 时(进位才会是 1),还需向更左侧一位进位。对应与门。

通过异或门计算出个位,一个与门计算出是否进位,通过电路算出一个一位数的加法两个门电路打包,就叫作半加器(Half Adder)。

半加器的电路演示

二、全加器

半加器解决个位加法,放到二位上就不够用。竖式是二进制加法,从右往左数,第二列(是二位)不是十位。往左,四位、八位。

二位还需加上进位信号(来自个位),一共三个数(加数和被加数)相加。目前组合而成半加器,输入都只能两个 bit,就是两个开关。怎么办?

解决方案:两个半加器 + 或门 = 全加器输出:

(1)第一个半加器,我们用和个位的加法一样的方式,得到是否进位 X加后结果 Y

(2)结果 Y,和个位数相加后输出的进位信息 U,再连接到半加器上,拿到是否进位信号 V 和对应加和后结果 W

W 是二位上留下结果。两个半加器进位输出,作为一个或门的输入连接起来,只要两次加法中任何一次需要进位,二位上,就会向左侧的四位进一位。三个 bit 相加,即都是 1,也会进一位。

全加器,两个 8 bit 数的加法很容易了。只要把 8 个全加器串联个位的全加器的进位信号作为二位全加器的输入信号二位作为四位进位信号。串接八层就得到支持 8 位数加法算术单元扩展只要串联输入位和全加器

8 位加法器可以由 8 个全加器串联而成

个位只需一个半加器,或全加器进位输入始终是 0。个位没有来自更右侧的进位。左侧的一位输出的进位信号,而是加法是否溢出(并不是再进一位)。

int 16 位整数加法,结果是16 位数,怎么知道是否溢出?并没有留下第 17 位来记录。

加法器结果,电路信号标识是否溢出,把这个信号输出给到硬件其他标志位里,让计算机知道结果是否溢出。这就是为什么写程序时,知道计算结果是否溢出硬件层面得到支持

三、总结延伸

门电路计算小功能,像搭乐高。

两个门电路,搭一个半加器,计算机中,软、硬件中重要的设计思想,分层

简单到复杂,上面的一层,只需考虑怎么用下一层组件搭建出自己的功能,不需要下沉到更低层的其他组件。就像你并没有深入学习过计算机组成原理,可直接通过高级语言撰写代码。

硬件层面,通过门电路、半加器、全加器搭出加法器。用来算术逻辑计算的组件叫作 算术逻辑单元ALU,。打造强大CPU 时,只需把门电路组合成ALU,不关注最细颗粒门电路(当成完成基础计算黑盒子)

CPU 设计和数据通路时,以 ALU 为一个基础单元来解释问题,就够了。

补充阅读

出于性能考虑,实际 CPU 里面使用的加法器,比起我们今天讲解的电路还有些差别,会更复杂一些。真实的加法器,使用的是一种叫作超前进位加法器的东西。北京大学在 Coursera 上开设的《计算机组成》课程中的 Video-306 “加法器优化”一节,了解一下超前进位加法器的实现原理为什么要使用它

课后思考

这一讲,讲解了无符号数加法器是怎么通过电路搭建。如果是有符号数(补码表示),这个加法器是否可以实现正数加负数运算呢?如果不行,我们应该怎么搭建对应的电路呢?

你可能感兴趣的:(13 | 加法器:如何像搭乐高一样搭电路(上)?)