深入浅出计算机组成原理
徐文浩
bothub 创始人
69514 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 62 讲
深入浅出计算机组成原理
15
15
1.0x
00:00/00:00
登录|注册

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

上一讲,我们看到了如何通过电路,在计算机硬件层面设计最基本的单元,门电路。我给你看的门电路非常简单,只能做简单的 “与(AND)”“或(OR)”“NOT(非)”和“异或(XOR)”,这样最基本的单比特逻辑运算。下面这些门电路的标识,你需要非常熟悉,后续的电路都是由这些门电路组合起来的。
这些基本的门电路,是我们计算机硬件端的最基本的“积木”,就好像乐高积木里面最简单的小方块。看似不起眼,但是把它们组合起来,最终可以搭出一个星球大战里面千年隼这样的大玩意儿。我们今天包含十亿级别晶体管的现代 CPU,都是由这样一个一个的门电路组合而成的。

异或门和半加器

我们看到的基础门电路,输入都是两个单独的 bit,输出是一个单独的 bit。如果我们要对 2 个 8 位(bit)的数,计算与、或、非这样的简单逻辑运算,其实很容易。只要连续摆放 8 个开关,来代表一个 8 位数。这样的两组开关,从左到右,上下单个的位开关之间,都统一用“与门”或者“或门”连起来,就是两个 8 位数的 AND 或者 OR 的运算了。
比起 AND 或者 OR 这样的电路外,要想实现整数的加法,就需要组建稍微复杂一点儿的电路了。
我们先回归一个最简单的 8 位的无符号整数的加法。这里的“无符号”,表示我们并不需要使用补码来表示负数。无论高位是“0”还是“1”,这个整数都是一个正数。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入浅出计算机组成原理》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(63)

  • 最新
  • 精选
  • 不记年
    基本电路>门电路>全加器>加法器,经历了三层的封装,分层可以带来很多好处,但经过这么多层的封装是不是也带来了性能的损耗,所以我想对于像加法器这样经常用到的电路,可不可以打破分层,直接通过最底层的电路来实现,以达到性能的最优呢。在进一步,性能和封装之间是否也存在着取舍呢

    作者回复: 不记年同学你好, 你的思考很对,实际的加法器,并不是由全加器串联组成的,在14讲里面我们可以看到为了减少门延迟的损失,实际高位的计算结果直接来自低位的组合电路里面的输入。 封装意味着我们提供了更多的“简单电路”或者说“简单指令”来操作。但这也意味着同样复杂的操作需要更多条指令。 这个也是为什么在计算机体系结构里面会有 RISC 和 CISC 这样的复杂/精简 指令之争。

    5
    63
  • 张立昊Leon
    负数用补码表示的话加法就和正数的加法没什么区别了,只是结果如果是负数的话,也是补码。发生溢出会有问题,最高位符号有可能会变,需要额外的标记位

    作者回复: 👍

    4
    46
  • kdb_reboot
    这部分就是本科学的数电了

    作者回复: 👍

    15
  • 一步
    我们仍然是从左到右,一位一位进行计算,只是把从逢 10 进 1 变成逢 2 进 1。 这里不应该是从右往左运算吗?

    作者回复: 一步同学你好, 谢谢指出,的确是从右到左计算,我修改一下。

    14
  • 玉琢天窗
    老师,要想自己搭建一个电路实现1+1,需要哪些材料呢

    作者回复: 如果是写程序模拟的话有很多办法,比如有人用Minecraft 做了一个虚拟的CPU http://mc.163.com/2017/04/07/25535_682214.html 如果是硬件,如果只是为了体验,最简单的办法是用电路绘画导电笔直接在纸上画了来体验一下 或者也可以去淘宝上买个组合电路套件自己来搭一下。

    4
    7
  • 南山
    打卡,5月24日03:45,坚持完整的学到底~

    作者回复: 加油

    7
  • ldd
    课后思考: 补码表示下,加法器也是可以正常运行的;因为补码的发明就是为了方便正负数的二进制计算。 正数+负数是不会溢出的,所以加法器可以直接忽略最左边的进位; 但是补码计算,还是会出现溢出的情况的,比如:假设二进制位数是4位,-8-2=6;7+2=-1 就算是溢出了; 那么还是需要最右边的输出来判断是否溢出的: 假设最右边的输入为a、b,输出为c,那么溢出位可以为 (~(a&b)) & c & (~(a&b)),输出为1,就代表溢出了,否则就是未溢出。 不知道思考的对不对,有不对的地方,望老师指出。

    作者回复: 我不知道我有没有准确理解你的意思 两个负数相加,是否溢出,其实不是看最后多出来的进位的信号。而是也要看计算结果的最高位是1还是0 如果两个输入的高位是1而输出的高位是0,那么就溢出了,如果输出的高位还是1就没有溢出。 你这里的a,b,c是不是指输入a,b和输出c的左侧的高位(不是进位的溢出位)?我的理解没有错吧?

    2
    6
  • supermouse
    老师您好!请问「与非门」、「或非门」是将「与门」、「或门」计算得到的结果取反吗?

    作者回复: 是的,就是把与门和或门的真值表取反

    6
  • 小海海
    思考题: 反向推导,补码的设计本来就是要解决正数加负数的问题,使之可以当作普通的加法来进位即可,所以文章里的加法器模型应该是可以的

    作者回复: 回答正确,不过可以再想想补码情况下,如何处理溢出呢?

    4
  • 铁皮
    课后思考题: 用补码表示的话,这个加法器应该可以实现正数加负数。 最左端如有溢出位的情况去掉就可以

    作者回复: 是的,不过可以思考一下两个负数的相加或者整数的相加是否也会溢出?怎么通过电路来告诉大家是发生了溢出?

    4
收起评论
显示
设置
留言
63
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部