From Nand To Tetris 从与非门到俄罗斯方块

34、P1 W5 U5.3 中央处理器(待完善)

2019-09-25  本文已影响0人  shazizm

视频:
如果本次课程对应的 Coursera 的视频打不开,可以点击下面链接
P1W5U5.3 - Central Processing Unit

第五周,前两节课 U5.1 和 U5.2 基本上大概描述了一下 总线 和 CPU 执行程序时的运行方式。

这节课 U5.3,老师就提供了一种实现CPU的 逻辑单元组成图。

老师在给出一种方案前,还是要再说说抽象概念。感叹了一下CPU的神奇与美丽,静态程序马上就可以被运行起来了,仔细想想是挺不可思议。

CPU黑盒

CPU黑盒,执行当前命令,准备下一条要执行的命令

讲CPU的内部方案前,先说明一下黑盒对外的输入输出,主要就是和 数据存储和 程序存储 的交互。

黑盒左侧三个输入

16位data 要被当前命令处理的数据
16位instruction 当前的命令
还有1位输入之后再说 reset

CPU 的 输入项

黑盒右侧四个输出

16位outM 要写回的数据(往data memory存的数据)
1位writeM 是否写标识 (决定上面数据要不要写,也可以丢弃)
15位addressM 要存哪 (如果决定写入,那么这个提供写入data memory里的地址)
15位pc 下一条要执行的命令的地址(这个很重要,接下来会讲到)

CPU 的 输出项

打开黑盒

老师提供了其中一种高效简洁的方案,如下图

蓝色框的左右侧是上面提到的 输入和输出。

蓝色框内部,一看都是我们之前学过的。
(ALU 回顾 U2.4)
(PC 回顾 U3.4)

c 符号是控制位 control bits 不过这些从哪里来?老师故意不说清楚的,就是让学生在作业里自己搞明白...,命令里提取出来的?

黑盒内部

下面老师分三部分来讲解 CPU黑盒的内部

黑盒第一部分

19.png

第一部分主要是 处理指令,放大如下

首先如下图,看一个 指令@3001,回顾U4.3我们知道
@3001 就是把 3001 存入A register

(指令分 A指令 和 C指令,回顾U4.3)

A register 还有可能存入 ALU 的数据输出 (上图的outM),有一个Mux16的c控制位决定。

A register 根据之前 U4.3 的知识回顾,有三个功能。

A命令有设置常数参与计算的功能。应该就是上图A register输出 走入ALU的箭头路线。

A命令,还有自动选取M 寄存器 的功能。所以上图 A register输出 不加控制位,直接有一箭头走到 addressM

A命令,还有可能参与跳转,所以上图再往下 A register输出 有一箭头走到了PC(回顾U4.3 实例练习3)

@3001 的二进制数最左侧是0,代表是A指令

黑盒第二部分

在开始讲第二部分前,回顾一下C指令 (具体请看 U4.4)

最左边一位为1,代表C-指令,然后依次往右两位没用到,但是惯例设成1。
然后7位 蓝色0011111 代表 comp (决定选择哪些寄存器,参与什么运算)
然后3位 绿色010 代表 dest(决定结果存在哪里)
最后3位 红色111 代表 jump(决定运算结果与0进行那种判断,跳转位置需提前存在A寄存器)

C指令,回顾第四周内容

接下来讲解最黑盒内部复杂的部分-ALU

ALU 回顾 U2.4

放大如下图

ALU 输入

一个 D 寄存器
一个 A寄存器或者M寄存器

对进入的两个数,进行怎样的操作,由C指令上的 蓝色 数决定(不应该是7位吗?回顾U2.4 和 U4.4,为啥图里只有6位)

命令中的蓝色位决(comp)定由谁(D、A、M寄存器)参与什么计算

ALU 输出

上面提到回顾U4.4时,ALU输出存在哪里由 下图绿色三位决定(dest)

ALU 的输出会同时 送到 D、A、M寄存器,但是三个寄存器是不是要接受,就由dest决定了。

这个看来图中c标志都是根据 指令里提取出来的

注意上图里 ALU 还有两个 输出位,如下图所示

一个说明 ALU的计算结果是否为 负
一个说明 ALU的计算结果是否为 零

这个和接下来黑盒第三部分PC,有关

是负吗?是零吗?

黑盒第三部分

第三部分
Reset:它就像计算机重启按钮,一按hack小电脑就从头开始执行程序
(估计就是把PC地址设置成 instruction memory 的第一个位置。)

PC:决定下一条指令的地址

Reset、 PC

下图左侧C指令里红色位(jjj)回顾U4.4

如果
jjj = 000,不跳转,下一步执行,PC自加1的位置
jjj = 111,直接跳转,下一步执行,PC等于当前A存的位置
有条件跳转,参考U4.4里的一个图表。

这里具体几个细节如何实现老师让自己想

这里老师给出一个大概判断顺序,如下图

先判断 Reset
再通过 当前指令的jump(jjj) 和 ALU 两个输出 控制位(是负?是零?)
得出一个结果(load)
在通过load来判断PC如何设置下一条指令的地址。

原理讲清楚了,具体怎么实现还是自己想

到此 HACK小电脑的 CPU 就算讲解完了。
照理说,现在可以去写那个 HDL吧。
老师说别急。
因为CPU涉及到整个架构(存储啊,显示器,键盘)
总之先听完下节课再动手。

上一篇下一篇

猜你喜欢

热点阅读