深入浅出计算机组成原理
徐文浩
bothub创始人
立即订阅
13019 人已学习
课程目录
已完结 62 讲
0/4登录后,你可以任选4讲全文学习。
入门篇 (5讲)
开篇词 | 为什么你需要学习计算机组成原理?
免费
01 | 冯·诺依曼体系结构:计算机组成的金字塔
02 | 给你一张知识地图,计算机组成原理应该这么学
03 | 通过你的CPU主频,我们来谈谈“性能”究竟是什么?
04 | 穿越功耗墙,我们该从哪些方面提升“性能”?
原理篇:指令和运算 (12讲)
05 | 计算机指令:让我们试试用纸带编程
06 | 指令跳转:原来if...else就是goto
07 | 函数调用:为什么会发生stack overflow?
08 | ELF和静态链接:为什么程序无法同时在Linux和Windows下运行?
09 | 程序装载:“640K内存”真的不够用么?
10 | 动态链接:程序内部的“共享单车”
11 | 二进制编码:“手持两把锟斤拷,口中疾呼烫烫烫”?
12 | 理解电路:从电报机到门电路,我们如何做到“千里传信”?
13 | 加法器:如何像搭乐高一样搭电路(上)?
14 | 乘法器:如何像搭乐高一样搭电路(下)?
15 | 浮点数和定点数(上):怎么用有限的Bit表示尽可能多的信息?
16 | 浮点数和定点数(下):深入理解浮点数到底有什么用?
原理篇:处理器 (18讲)
17 | 建立数据通路(上):指令+运算=CPU
18 | 建立数据通路(中):指令+运算=CPU
19 | 建立数据通路(下):指令+运算=CPU
20 | 面向流水线的指令设计(上):一心多用的现代CPU
21 | 面向流水线的指令设计(下):奔腾4是怎么失败的?
22 | 冒险和预测(一):hazard是“危”也是“机”
23 | 冒险和预测(二):流水线里的接力赛
24 | 冒险和预测(三):CPU里的“线程池”
25 | 冒险和预测(四):今天下雨了,明天还会下雨么?
26 | Superscalar和VLIW:如何让CPU的吞吐率超过1?
27 | SIMD:如何加速矩阵乘法?
28 | 异常和中断:程序出错了怎么办?
29 | CISC和RISC:为什么手机芯片都是ARM?
30 | GPU(上):为什么玩游戏需要使用GPU?
31 | GPU(下):为什么深度学习需要使用GPU?
32 | FPGA和ASIC:计算机体系结构的黄金时代
33 | 解读TPU:设计和拆解一块ASIC芯片
34 | 理解虚拟机:你在云上拿到的计算机是什么样的?
原理篇:存储与I/O系统 (17讲)
35 | 存储器层次结构全景:数据存储的大金字塔长什么样?
36 | 局部性原理:数据库性能跟不上,加个缓存就好了?
37 | 高速缓存(上):“4毫秒”究竟值多少钱?
38 | 高速缓存(下):你确定你的数据更新了么?
39 | MESI协议:如何让多核CPU的高速缓存保持一致?
40 | 理解内存(上):虚拟内存和内存保护是什么?
41 | 理解内存(下):解析TLB和内存保护
42 | 总线:计算机内部的高速公路
43 | 输入输出设备:我们并不是只能用灯泡显示“0”和“1”
44 | 理解IO_WAIT:I/O性能到底是怎么回事儿?
45 | 机械硬盘:Google早期用过的“黑科技”
46 | SSD硬盘(上):如何完成性能优化的KPI?
47 | SSD硬盘(下):如何完成性能优化的KPI?
48 | DMA:为什么Kafka这么快?
49 | 数据完整性(上):硬件坏了怎么办?
50 | 数据完整性(下):如何还原犯罪现场?
51 | 分布式计算:如果所有人的大脑都联网会怎样?
应用篇 (5讲)
52 | 设计大型DMP系统(上):MongoDB并不是什么灵丹妙药
53 | 设计大型DMP系统(下):SSD拯救了所有的DBA
54 | 理解Disruptor(上):带你体会CPU高速缓存的风驰电掣
55 | 理解Disruptor(下):不需要换挡和踩刹车的CPU,有多快?
结束语 | 知也无涯,愿你也享受发现的乐趣
免费
答疑与加餐 (5讲)
特别加餐 | 我在2019年F8大会的两日见闻录
FAQ第一期 | 学与不学,知识就在那里,不如就先学好了
用户故事 | 赵文海:怕什么真理无穷,进一寸有一寸的欢喜
FAQ第二期 | 世界上第一个编程语言是怎么来的?
特别加餐 | 我的一天怎么过?
深入浅出计算机组成原理
登录|注册

14 | 乘法器:如何像搭乐高一样搭电路(下)?

徐文浩 2019-05-27
和学习小学数学一样,学完了加法之后,我们自然而然就要来学习乘法。既然是退回到小学,我们就把问题搞得简单一点,先来看两个 4 位数的乘法。这里的 4 位数,当然还是一个二进制数。我们是人类而不是电路,自然还是用列竖式的方式来进行计算。
十进制中的 13 乘以 9,计算的结果应该是 117。我们通过转换成二进制,然后列竖式的办法,来看看整个计算的过程是怎样的。

顺序乘法的实现过程

从列出竖式的过程中,你会发现,二进制的乘法有个很大的优点,就是这个过程你不需要背九九乘法口诀表了。因为单个位置上,乘数只能是 0 或者 1,所以实际的乘法,就退化成了位移和加法。
在 13×9 这个例子里面,被乘数 13 表示成二进制是 1101,乘数 9 在二进制里面是 1001。最右边的个位是 1,所以个位乘以被乘数,就是把被乘数 1101 复制下来。因为二位和四位都是 0,所以乘以被乘数都是 0,那么保留下来的都是 0000。乘数的八位是 1,我们仍然需要把被乘数 1101 复制下来。不过这里和个位位置的单纯复制有一点小小的差别,那就是要把复制好的结果向左侧移三位,然后把四位单独进行乘法加位移的结果,再加起来,我们就得到了最终的计算结果。
对应到我们之前讲的数字电路和 ALU,你可以看到,最后一步的加法,我们可以用上一讲的加法器来实现。乘法因为只有“0”和“1”两种情况,所以可以做成输入输出都是 4 个开关,中间用 1 个开关,同时来控制这 8 个开关的方式,这就实现了二进制下的单位的乘法。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入浅出计算机组成原理》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(19)

  • 一步
    最后一个的展开电路图,没有看懂
    2019-06-02
    1
    16
  • 龙猫
    从加法到乘法,先是计算过程变得复杂了,步骤变得更多,可以像人一样,逐位计算,但线性带来时间复杂度高。从而可以考虑通过增加线路/硬件复杂度,从空间换时间的思路,加快乘法速度。
    空间 vs 时间。
    但CPU毕竟也是很珍贵的资源,晶体管也不宜太多,这中间需要相互平衡。

    作者回复: 总结得很好,其实这也可以认为是CISC和RISC的路线之争最朴素的由来

    2019-05-27
    10
  • 活的潇洒
    “这之间的权衡,其实就是计算机体系结构中的RISC和CISC的经典历史路线之争”
    这句才是重点,day14 笔记:https://www.cnblogs.com/luoahong/p/10929985.html

    作者回复: 👍

    2019-05-27
    6
  • WB
    最后一张图片中的加法器是一个与门和一个或门??
    加法器不是由一个与门和一个异或门组成的吗?

    作者回复: WB同学你好,


    最后一张图是表示如果我们不希望有太多的门延迟的情况下,我们怎么让加法器里面高位的是否获得进位,不用等待前面低位的全加器的计算结果。而不是一个完整的加法器。

    我们重新复习一下 13 和 14 两讲的内容
    完整的加法器可以由很多个全加器串联起来
    全加器由两个半加器外加一个或门组成

    半加器由一个与门和一个异或门组成

    半加器只是整个加法器中最基础的一个零件

    2019-05-27
    4
  • 木心
    4位加法器的最大门延迟是进位,是2*4+1 9个门延迟

    作者回复: 木心同学,
    你好,这是一个问题么?电路并行这部分我已经写了,可以做到没有那么多门延迟的。

    2019-09-27
    1
    1
  • DreamItPossible
    除法器算法实现描述:
    步骤1 从余数寄存器中减去除数寄存器中的值,将结果保存在除数寄存器中;
    步骤2 测试余数是否小于0
    如果余数小于0,则执行步骤2b;
    否则,执行步骤2a;
    步骤2a 将商寄存器左移,且最低位设置为1;
    步骤2b 将余数寄存器的值跟除数寄存器的值相加,结果存放在余数寄存器中;将商寄存器左移,最低位设置为0;
    步骤3 将除数寄存器右移1位
    步骤4 测试是否第N+1次执行
    如果是,则结束;否则,跳转到步骤1执行;
    2019-08-14
    1
  • 花仙子
    对于最后那个优化版本的加法器,我的理解是这样的:每一位都是又全加器组成,而每个全加器由两个半加器和一个或门电路组成,其中一个半加器是计算每个位相加的和进位信息无关,所以这个半加器在各个位上可以同时并行计算,同时计算后每个位会得出相加结果Y和进位信息U,Y与上一位的进位信息W0用另一个半加器相加后得到结果Z和进位信息V,Z为此位最终相加结果,U和V通过或门电路计算可得出最终进位信息W提供给下一位进行同样的计算。这样看来似乎第二个半加器和或门电路计算还是要依赖上一位同样的计算得出的进位信息,貌似这里无法并行。但是真的就此结束了吗?看老师给出的图我的理解是这样的:每一位的运算公式是这样的:W=U||V,Z=(Y+W0)1,V=(Y+W0)2,(请允许我这里用+表示半加器,后缀1表示半加器得到的相加结果,后缀2代表半加器得到的进位信息),而W0=U0||V0,所以有Z=(Y+(U0||V0))1,W=U||(Y+W0)2,这样以来即便是最高位也能得到一个基于各位第一个半加器计算结果的逻辑表达式,对于人类来解这个表达式似乎也没有优化效果,但是正如老师所说电路的天然并行行,我们将这个很长的表达式展开,硬件就可以并行计算很多小步骤,从而得到空间换时间的巨大效率提升。
    2019-07-03
    1
  • -W.LI-
    老师好!前面的意思大概看懂了,最后那个优化版本的加法器看不懂了。。。
    2019-06-16
    1
  • 愤怒的虾干
    老师好,最近在看您推荐的计算机组成公开课,x86保护模式下会使用全局符号描述表寻址,同时操作系统又是使用页表来分配地址、映射物理和逻辑地址。我想问全局符号描述表和页表在寻址上有什么区别与联系?

    作者回复: 全局符号表是虚拟内存内的内存寻址和跳转。
    页表是虚拟内存和物理内存之间的映射关系。

    2019-05-27
    1
  • 默默地付出
    一个全加器,其实就已经有了3T的延迟,为什么只考虑进位的3个门电路(2个与门和1个或门),半加器中的2个异或门为什么不要考虑?
    2019-10-30
  • 拯救地球好累
    ---总结---
    并行化:无论是硬件还是软件层面,并行化首先就是要确认号各个模块之间的依赖关系,找出可最大并行化的分组。

    ---问题---
    1. 请问下老师,移位的错开接线是如何做到的,乘法过程中会不断位移,那不是要一直重新连线?
    2. 门延迟明白了,时钟频率的问题指的是几个操作实际耗费的时间不同,从而导致一个时钟周期内短指令的空闲期长吗?
    3. 最后一张图的话,每一位在独立计算时,都需要同时获得前几位所得来的进位信息么?
    2019-10-26
  • J.D.
    “把结果加到刚才的结果上”,想起了编程语言里的 sum = sum + i 之类的语句。

    作者回复: J.D.同学,

    你好,是很像的

    2019-09-21
  • 小广
    徐老师你好,最后那个展开图,第二列的最下面一个运算组件,标注的表达式是"P3*P2*P1*P0*G0",但是我认为这里是笔误,应该是"P3*P2*P1*P0*C0",应该把G0改为C0,^_^

    作者回复: 小广同学,

    你好,谢谢你,的确是笔误了,应该是C0

    2019-09-16
  • 小先生
    不太明白老师最后说的“门电路逻辑进行完全展开“,能再详细解释一下吗?
    2019-08-07
  • Alery
    老师你好,根据最后一个图所示的电路,比如我计算一个 4 位整数最高位是否进位,如上展开门电路图所示,经过的门电路不是更多了吗?文中最后所说的“我们只需要 3T 的延迟就可以拿到是否进位的计算结果”这句话怎么理解呢?
    2019-07-26
  • 瀚海星尘
    有种觉得二进制很优雅的感觉~
    2019-07-12
  • 庄风
    老师,文中讲到“因为二位和四位都是 0,所以乘以被乘数都是 0,那么保留下来的都是 0000。乘数的八位是 1,我们仍然需要把被乘数1101 复制下来”。但按图上显示,被乘数13是1101,乘数9是1001。不知道是不是我思考不周,上文是否应该改为“因为二位和三位都是 0,所以乘以被乘数都是 0,那么保留下来的都是 0000。乘数的四位是 1,我们仍然需要把被乘数1101 复制下来”。
    2019-06-14
    1
  • LDxy
    大学数字电子技术课程里面也有相应的内容
    2019-05-27
  • 池小帅
    真棒
    2019-05-27
收起评论
19
返回
顶部