深入浅出计算机组成原理
徐文浩
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第二期 | 世界上第一个编程语言是怎么来的?
特别加餐 | 我的一天怎么过?
深入浅出计算机组成原理
登录|注册

19 | 建立数据通路(下):指令+运算=CPU

徐文浩 2019-06-07
上一讲,我们讲解了时钟信号是怎么实现的,以及怎么利用这个时钟信号,来控制数据的读写,可以使得我们能把需要的数据“存储”下来。那么,这一讲,我们要让计算机“自动”跑起来。
通过一个时钟信号,我们可以实现计数器,这个会成为我们的 PC 寄存器。然后,我们还需要一个能够帮我们在内存里面寻找指定数据地址的译码器,以及解析读取到的机器指令的译码器。这样,我们就能把所有学习到的硬件组件串联起来,变成一个 CPU,实现我们在计算机指令的执行部分的运行步骤。

PC 寄存器所需要的计数器

我们常说的 PC 寄存器,还有个名字叫程序计数器。下面我们就来看看,它为什么叫作程序计数器。
有了时钟信号,我们可以提供定时的输入;有了 D 型触发器,我们可以在时钟信号控制的时间点写入数据。我们把这两个功能组合起来,就可以实现一个自动的计数器了。
加法器的两个输入,一个始终设置成 1,另外一个来自于一个 D 型触发器 A。我们把加法器的输出结果,写到这个 D 型触发器 A 里面。于是,D 型触发器里面的数据就会在固定的时钟信号为 1 的时候更新一次。
这样,我们就有了一个每过一个时钟周期,就能固定自增 1 的自动计数器了。这个自动计数器,可以拿来当我们的 PC 寄存器。事实上,PC 寄存器的这个 PC,英文就是 Program Counter,也就是程序计数器的意思。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入浅出计算机组成原理》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(18)

  • 小海海
    (手滑点了保存,接上条)无条件跳转意味着没有计算的逻辑,应该是可以不经过ALU的,但是要控制器把PC设置成跳转后的指令地址,不知我理解的对不对🤣

    作者回复: 小海海同学你好,

    回答正确😀

    2019-06-07
    6
  • 小海海
    @陈华应 我的理解无条件跳转就是goto,是没有比较结果的

    作者回复: 👍

    2019-06-07
    3
  • 鱼向北游
    应该是无条件跳转没有cmp吧

    作者回复: 鱼向北游同学,你好

    cmp是一条单独的指令,和跳转是否是有条件的没有关系。无条件跳转不需要检查条件码寄存器哦。可以想想这样的话,在硬件上有什么区别呢?

    2019-06-11
    2
  • humor
    一个指令的执行想用多少个时钟周期都可以吗?

    作者回复: humor同学你好,

    一个指令需要的时钟周期是固定的,并不是多少个都可以啊。

    2019-06-10
    1
    1
  • 陈华应
    无条件跳转不需要依赖于比较结果吗?

    作者回复: 既然是“无条件”了,当然不依赖比较结果啦。

    2019-06-07
    1
  • wei
    老师好,“加法器的两个输入,一个始终设置成 1,另外一个来自于一个 D 型触发器 A。我们把加法器的输出结果,写到这个 D 型触发器 A 里面。于是,D 型触发器里面的数据就会在固定的时钟信号为 1 的时候更新一次。” 这里我明白,为什么时钟信号为 1 的时候只会更新一次,而不是两次或更多次?
    2019-11-30
  • 寒玉
    一个周期执行多条指令和java里面的多线程意思上是一样的吗?
    2019-11-07
  • Im Robin
    老师你好,有一个问题很困惑,PC寄存器自动加1,我怎么感觉应该是自动加指令字节数啊,这样寄存器里才能存下一个指令的起始地址,如果PC寄存器里只是数值,那么程序如何从PC寄存器中取出指令地址呢,麻烦老师给予解答,谢谢
    2019-10-31
  • Im Robin
    老师你好,看了好几遍也没理解下面这句,我理解时钟周期(机器时钟)是固定值,也就是1/主频,在这样的语境下,想实现一个时钟周期内执行一个任意的CPU指令,我感觉是不可能的事情,能否帮忙解惑,谢谢
    ——————————————————————————
    在这种设计下,我们需要在一个时钟周期里,确保执行完一条最复杂的 CPU 指令,也就是耗时最长的一条 CPU 指令。这样的 CPU 设计,我们称之为单指令周期处理器(Single Cycle Processor)。
    2019-10-30
    1
  • 随心而至
    真的是深入浅出,赞
    2019-10-15
  • 活的潇洒
    “怎样通过连接不同功能的电路,实现出一个完整的CPU” 讲的真好
    day19 笔记:https://www.cnblogs.com/luoahong/p/11431367.html
    2019-09-01
  • 业余爱好者
    流水线让我想起了大学时的一门选修课———项目管理
    2019-08-27
  • 小先生
    为什么我们的 if…else 会变成这样两条指令,而不是设计成一个复杂的电路,变成一条指令?到这里,我们就可以解释了。这样分成两个指令实现,完全匹配好了我们在电路层面,“译码 - 执行 - 更新寄存器“这样的步骤。

    请问老师这段话,是什么意思,还是没看懂。
    2019-08-14
    1
  • 张立昊Leon
    还记得当年数电考试分还挺高的,不知道有啥用。后面就直接学c++,嵌入式系统之类的课程,跳过了中间的计算机组成,操作系统之类的东西,万恶的电气系学科体系...嵌入式系统当时学得完全不知所云,也极大的损害了我对这些东西的兴趣,今天在这里总算补学了一些重要的东西啊
    2019-07-01
  • Geek_54edc1
    因为无条件跳转不需要访问条件码寄存器,而且地址跳转就是一个直接寻址的过程,因此不需要通过运算器和ALU
    2019-06-25
  • -W.LI-
    老师好!无条件调整,直接把跳转过去的指令跟在当前指令后面可以么?变成顺序的。
    D触发器感觉用处很大啊,存储相关的都可以通过它实现,寄存器的速度比内存快很多,和硬件实现有关系么比如D触发器比CMOS快?
    高速缓存使用触发器实现的还是CMOS啊?
    2019-06-22
  • -W.LI-
    老师好,读取数据的那个寄存器就是。当前指令地址+指令长度。每次就能取到下一条指令了是吧?这里的内存地址都是虚存地址么?物理内存很容易就不连续吧。特别是那种动态申请内存的。还是说Java这样的编程语言,编译后的机器码就是在物理内存里顺序存储的?
    2019-06-22
  • 许童童
    《编码:隐匿在计算机软硬件背后的语言》这本书这几天看完了,写得真是很不错。希望老师再多推荐一些好看的书。
    2019-06-07
收起评论
18
返回
顶部