下面这些门电路的标识,你需要非常熟悉,后续的电路都是由这些门电路组合起来的。

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

1 异或门和半加器

基础门电路

  • 输入都是两个单独的bit
  • 输出是一个单独的bit

2个8 位(bit)数的与/或/非逻辑运算
连续摆放8个开关,代表一个8位数
这样的两组开关,从左到右,上下单个的位开关之间,都统一用“与门”或者“或门”连起来,就是两个8位数的AND或者OR的运算了

最简单的8位的无符号整数的加法

“无符号”表示不需要使用补码来表示负数
无论高位是“0”还是“1”,这个整数都是一个正数

表示一个8位数的整数,简单地用8个bit,也就是8个电路开关
那2个8位整数的加法,就是2排8个开关
加法得到的结果也是一个8位的整数,所以又需要1排8位的开关
要想实现加法,我们就要看一下,通过什么样的门电路,能够连接起加数和被加数,得到最后期望的和

  • 其实加法器就是把三排开关电路连起来

人在计算加法的时候一般怎么操作
二进制的加法和十进制没什么区别,一样可以用列竖式
我们仍然是从左到右,一位一位进行计算,只是把从逢10进1变成逢2进1

一位数的加法
输入一共是4种组合,00、01、10、11

  • 加法计算之后的个位是什么,在输入的两位是00和11的情况下,对应的输出都应该是0
  • 在输入的两位是10和01的情况下,输出都是1

这个输入和输出的对应关系,其实就“异或门(XOR)”

与/或/非门,很容易就能和程序里面的“AND(&)”“ OR( | )”和“ NOT( !)”对应

为什么需要异或(XOR)
这样一个在逻辑运算里面没有出现的形式,作为一个基本电路
异或门就是一个最简单的整数加法,所需要使用的基本门电路

输入的两位都是11时,还需要向左侧一位进位
这就对应一个与门
也就是有且只有在加数和被加数都是1的时候,进位才是1

所以,通过一个

  • 异或门计算出个位
  • 与门计算出是否进位

就通过电路算出了一个一位数的加法
把两个门电路打包,给它取一个名字,就叫作半加器(Half Adder)

  • 半加器的电路演示

2 全加器(Full Adder)

半加器可以解决个位的加法问题,但放到二位上,就不够用
这里的竖式是个二进制的加法,所以从右往左数,第二列不是十位,称为“二位”
对应的再往左,就应该分别是四位、八位

二位用一个半加器不能计算完成的原因也很简单
因为二位除了一个加数/被加数,还需要加上来自个位的进位信号,一共需要三个数进行相加
无论是最简单的门电路,还是用两个门电路组合而成的半加器,输入都只能是两个bit,也就是两个开关。该怎么办呢?

两个半加器和一个或门,就能组合成一个全加器
第一个半加器,我们用和个位的加法一样的方式,得到是否进位X和对应的二个数加和后的结果Y,这样两个输出
然后,我们把这个加和后的结果Y,和个位数相加后输出的进位信息U,再连接到一个半加器上,就会再拿到一个是否进位的信号V和对应的加和后的结果W。

  • 全加器就是两个半加器加上一个或门

    这个W就是我们在二位上留下的结果。我们把两个半加器的进位输出,作为一个或门的输入连接起来,只要两次加法中任何一次需要进位,那么在二位上,我们就会向左侧的四位进一位。因为一共只有三个bit相加,即使3个bit都是1,也最多会进一位。

这样,通过两个半加器和一个或门,我们就得到了一个,能够接受进位信号、加数和被加数,这样三个数组成的加法。这就是我们需要的全加器。

有了全加器,我们要进行对应的两个8 bit数的加法就很容易了
只要把8个全加器串联起来就好了
个位的全加器的进位信号作为二位全加器的输入信号,二位全加器的进位信号再作为四位的全加器的进位信号
这样一层层串接八层,我们就得到了一个支持8位数加法的算术单元
如果要扩展到16位、32位,乃至64位,都只需要多串联几个输入位和全加器就好了

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

    唯一需要注意的是,对于这个全加器,在个位,我们只需要用一个半加器,或者让全加器的进位输入始终是0。因为个位没有来自更右侧的进位。而最左侧的一位输出的进位信号,表示的并不是再进一位,而是表示我们的加法是否溢出了。

既然int这样的16位的整数加法,结果也是16位数,那我们怎么知道加法最终是否溢出了呢?因为结果也只存得下加法结果的16位数。我们并没有留下一个第17位,来记录这个加法的结果是否溢出。

看到全加器的电路设计,相信你应该明白,在整个加法器的结果中,我们其实有一个电路的信号,会标识出加法的结果是否溢出。我们可以把这个对应的信号,输出给到硬件中其他标志位里,让我们的计算机知道计算的结果是否溢出
而现代计算机也正是这样做的。这就是为什么你在撰写程序的时候,能够知道你的计算结果是否溢出在硬件层面得到的支持。

3 总结延伸

两个门电路,搭出一个半加器,就好像我们拿两块乐高,叠在一起,变成一个长方形的乐高,这样我们就有了一个新的积木组件,柱子。我们再用两个柱子和一个长条的积木组合一下,就变成一个积木桥。然后几个积木桥串接在一起,又成了积木楼梯。

从简单到复杂,我们一层层搭出了拥有更强能力的功能组件

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

在硬件层面,我们通过门电路、半加器、全加器一层层搭出了加法器这样的功能组件。我们把这些用来做算术逻辑计算的组件叫作ALU,也就是算术逻辑单元。当进一步打造强大的CPU时,我们不会再去关注最细颗粒的门电路,只需要把门电路组合而成的ALU,当成一个能够完成基础计算的黑盒子就可以了。

以此类推,后面我们讲解CPU的设计和数据通路的时候,我们以ALU为一个基础单元来解释问题,也就够了。

4 补充阅读

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

重学计算机组成原理(十二)- 加法器相关推荐

  1. 重学计算机组成原理(十)- 烫烫烫乱码的由来

    程序 = 算法 + 数据结构 对应到计算机的组成原理(硬件层面) 算法 - 各种计算机指令 数据结构 - 二进制数据 计算机用0/1组成的二进制,来表示所有信息 程序指令用到的机器码,是使用二进制表示 ...

  2. 重学计算机组成原理(三)- 进击,更强的性能!

    在上一篇中,我们谈到过 程序的CPU执行时间 = 指令数×CPI×Clock Cycle Time 要提升计算机的性能,可以从上面这三方面着手. 通过指令数/CPI,好像都太难了. 因此工程师们,就在 ...

  3. 重学计算机组成原理(一) —— 冯诺伊曼结构

    背景介绍 第一台通用电子计算机 ENIAC EDVAC -> 冯诺伊曼关于EDVAC的报告草案,即是冯诺伊曼结构计算机的起始 EDSAC UNIVAC 冯诺伊曼结构要点 在冯诺依曼署名的< ...

  4. 重学计算机组成原理(十一)- 门电路的千里传音

    人用纸和笔来做运算,都是用十进制,直接用十进制和我们最熟悉的符号不是最简单么? 为什么计算机里我们最终要选择二进制呢? 来看看,计算机在硬件层面究竟是怎么表示二进制的,你就会明白,为什么计算机会选择二 ...

  5. 计算机组成原理 五,重学计算机组成原理(五)

    CPU执行的也不只是一条指令,一般一个程序包含很多条指令 因为有if-else.for这样的条件和循环存在,这些指令也不会一路平直执行下去. 一个计算机程序是怎么被分解成一条条指令来执行的呢 1 CP ...

  6. 计算机组成原理实验报告十,合肥工业大学计算机组成原理实验报告.doc

    合肥工业大学计算机组成原理实验报告.doc (27页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 实验一 基本运算器实验一.实验目的了 ...

  7. 河北工程大学计算机考试试题,河北工程大学计算机组成原理08-09考试题B卷.doc...

    河北工程大学计算机组成原理08-09考试题B卷 晰甫瑰瑶怂栗馆物抹应限范钞扶张膳矣沁部忌喀咕层嘲恿晋懈开牺专坯奔校便勃尾翁虽荔赌玻壁测芹迪渊降犹苞盲四酬钱妨凄梭掩把由宫燎浦丰言频烫揩蒜崭滨姆碧孝规改曝 ...

  8. 计算机组成原理中FZ,计算机组成原理实验二.doc

    计算机组成原理实验二.doc 北京科技大学 计算机与通信工程学院 实 验 报 告 实验名称:?? 基本运算器实验 李奥林 ???? 专 业:??? 计算机科学与技 ? ? 班 级:??? 计1303? ...

  9. 计算机组成原理fc和fz,合肥工业大学计算机组成原理实验报告(DOC)

    合肥工业大学计算机组成原理实验报告(DOC),合肥工业大学计算机组成原理,合肥工业大学计算机组成原理试卷,计算机组成原理实验pdf,计算机组成原理微程序,计算机组成原理实验报告,计算机组成原理知识点, ...

最新文章

  1. java action处理list_Struts2 -- Jsp取action List及数据映射
  2. 程序员Geek们如何使用电脑
  3. Linux awk 命令
  4. NET问答: 到底是返回 null 好,还是 空集合 好?
  5. Android Spinnert的使用
  6. Android系统onKeyDown监控/拦截/监听/屏蔽返回键、菜单键和Home键
  7. android统一错误ui展示,Android UI异常分析
  8. python pdb调试快捷键,Python调试工具pdb使用详解
  9. 华为宣布智能计算战略,全栈全场景,当企业智能化转型加速器
  10. Freeswitch mod 安装
  11. 2010年 我的齐鲁软件大赛作品
  12. 27.Linux/Unix 系统编程手册(上) -- 程序的执行
  13. 区块链清明上河图 2018Q3
  14. 超频真的不难!G3258超频4.5GHz全攻略
  15. 服务器不能用pe安装win7系统安装,WinPE无法安装win7系统的完美解决方案
  16. QCC3040---earbudUi module
  17. python自然语言分析--倚天屠龙记人物关系、词云、柱状图、-词频
  18. 手把手教会搭建网站详细全过程(从域名到网站部署)
  19. 获得ISO20000体系认证过程介绍
  20. HTTP服务器开发教程

热门文章

  1. 菜鸟裹裹莫名出现快递_菜鸟裹裹出现非本人件
  2. 【秋招机试真题】荣耀机试0916-3-可重复选元素组合问题
  3. CSS实现文字镂空效果炫酷背景效果
  4. BED(比特生态系统)白皮书中文翻译版
  5. 机器学习三大框架对比
  6. 解决Neo4j Server shutdown initiated by request
  7. 星巴克、可口可乐、苹果这些顶级企业是如何进行品牌营销
  8. google翻译会说河南话
  9. 家园守卫战关于提升双倍还是提升攻速的建议
  10. 一位父亲对儿子说的话,值得深思!