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

35、P1 W5 U5.4 小电脑(待完善)

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

视频:
如果本次课程对应的 Coursera 的视频打不开,可以点击下面链接
P1W5U5.4 - The Hack Computer

整个Part1课程到此,基本上就是硬件的大组装前(做作业前)的最后的讲解了。
老师在本节将把整个小电脑里的三个重要(CPU、RAM、ROM)部分再从整体的功能角度说明了一下。
本节涉及三部分分别做什么?我们如何制作它们(基本就是结合硬件接口回顾复习)。

本节重点1、2、3

第一部分:CPU

前一节U5.3 中央处理器已经用了一节课对其本身详细讲解过了

这里从CPU的输入输出接口说起,如下图:

CPU接口示意

CPU 不同 instruction 的情况分析

instruction //指令分3种情况
1、涉及 D 寄存器的 instruction :D = D - A

D寄存器 和 A寄存器 都在CPU里。
操作的时候直接取,不多说。

2、涉及 A 寄存器的 instruction :@A

那么就把 这个16位的A指令里的左边15位存在 A寄存器。(最右边1位用来区分A指令 和 C指令)

3、涉及 M 寄存器的 instruction :M = M+1

这种涉及M寄存器的指令,这里M在 “=” 的左右,涉及的接口是不一样的。

如果M在 “ = ” 右侧,表示需要读M寄存器,要考虑 CPU 另一个输入接口

inM

如果M在 “ = ” 左侧,表示要把指令的运算结果存回M寄存器,要考虑的CPU 另3个输出接口

outM      //写什么数据
writeM     //要不要写    PS:不写也可以丢弃
addressM     //写回哪个M寄存器

M寄存器 实际上指的是memory(RAM)里的某一个寄存器。
哪一个呢?所以需要一个@A的指令来利用它的第二个副作用来指定。

回顾 U4.3
例如:@21

1.把 A寄存器 设置成 21
2.同时有一个副作用的效果, RAM的21号寄存器,通过addressM?就被对应到 M寄存器上了。假如下一步指令里有对M寄存器的读写,就是对RAM[21]号寄存器的读写。

例如:要把RAM[100]设置成-1的两条汇编指令就如下:

@100
M = -1
复习D、A、M寄存器,回顾第4周的课程

4、涉及跳转的 instruction

老师通过 跳转指令,来讲几个操作,和对应的硬件接口

先回顾一下

reset

reset = 0 时,程序正常运行,也就是PC指向的指令执行完了,(自动PC+1)然后顺序执行下一条指令。
reset = 1时,那么PC直接设置成0,就回到第一条指令重头开始执行。

回到一般正常情况,当reset = 0时(没人去捅电脑重启键时)

来看下图 D = D-1;JEQ 这条命令

回顾 U4.3
jump 有8种比较跳转情况。把 D-1 的结果 和 0 比。

JGT:comp大于0跳?
JEQ:comp等于0跳?
JGE:comp大于等于0跳?
JLT:comp小于0跳?
JNE: comp不等于0跳?
JLE:comp小于等于0跳?
JMP:无条件跳?

以上满足条件的 都跳到 M[A]。

如果 D-1 等于 0 那么就跳转到 A寄存器里存的地址指定的 M。
如下图也就是M[100]

回顾reset、PC、jump指令

这些指令的规则都是由CPU硬件架构决定的。

接下来来说存储。

第二部分:Data Memory

(RAM = RAM16 + RAM8 + Register)

如下图
数据区 RAM(16k个“16位寄存器”)回顾U3.3,实现就是第三周作业RAM16
屏幕映射区(8k个“16位寄存器”)回顾U4.5,实现就是第三周作业RAM8
键盘映射区(1个“16位寄存器”)回顾U4.5,实现就是第三周作业16-bit Register

临时存储的数据区、屏幕映射区、键盘映射区

1、数据区

通过 address 选择一个 “寄存器”,再通过 in 或者 out 来存取16位二进制数据。

需要注意就是 怎么 把“外层”Memory(RAM)的in、address、out 和 “内层”的 RAM16的in、address、out结合。

2、屏幕映射区

关于屏幕映射的原理,有点复杂。。。回顾U4.5

这里对于硬件设计来说,其实就是对RAM8的操作,课程并没有真正做一个屏幕出来,而是软件模拟的一个显示屏,实时扫描RAM8,然后把RAM8里存的每一位对应到屏幕上的每一个像素。

映射方式。假如屏幕也拿硬件实现,该如何做呢? 屏幕映射区 8K,会被模拟出来的显示器不断扫描,对应显示

3、键盘映射区

就是一个 16位寄存器

它和显示映射区一样,也有一种映射关系。
通过Scan-code来把按键 和 0101xxxx对应起来。

Scan-code 老师设计的,回顾U4.5。有表格参考。

例如下图 上↑箭头键 对应Scan-code码就是 131,二进制就是图中左边16位。

电脑会一直扫描这一寄存器,无按键寄存器值为0,有按键就寄存器里就是对应的二进制码。

另外放到整个Data memory 里,键盘寄存器地址在 24576。

映射关系:Scan-code。假如键盘也用硬件实现,又改如何实现呢?

最后,三块RAM16、RAM8、1Register 的地址怎么搞到一起呢,留在作业里解决吧

回顾U4.8
之前U4.6也提到了,有两个“别名”,方便使用:
SCREEN = 16384
KBD = 24576
回顾U3.3
单个RAM寻址操作

三、Program memory

(ROM32)

关于程序存储器ROM,老师先讨论了如何将我们写的代码烧写到ROM芯片里,其次探讨了怎么实现ROM。(其实两件事都没做。。。)

现实里,我们的确需要一些额外的软硬件来帮助烧写程序到ROM里。然后把含有不同程序的ROM插到HACK小电脑上,就可以了。但我们的HACK小电脑就是虚拟存在的。。。所以这条路就不考虑了。

这里我们还是用老师提供的 CPU硬件模拟器,简单的打开程序,就自动帮咱们模拟完成这 “烧写” 和 “插入” HACK系统的物理步骤。

老师介绍的这种存“程序”的memory,一般一次烧录完程序就不能改了,所以Program memory是ROM存储器。
有点像小时候玩的插卡游戏机,插上不同的卡(ROM)就可以运行不同的游戏(程序已经提前烧写在ROM里)。

这里有个CPU硬件模拟器(老师提前做好的一个CPU模拟器)里加载汇编程序的演示视频 ,从16:50 到22:40

但是我们如何设计这个ROM呢

它和RAM很像,就是没有input,因为只读不写。
还记得CPU上的PC永远指向 下一条指令,所以图中address其实就是对应CPU的一个输出pc,ROM的out应该就是对应CPU的一个输入instruction(本文第一张图)。

ROM32K,作业里貌似没有这个

最后


CPU
data memory
program memory
屏幕
键盘

都过了一遍。具体内容也都在前面课程见过了。

下一节课U5.5 将提供一些做CPU作业时的一些建议和提示。

最最后,跟着老师再惊叹一下它的“大道至简”。由简单的一个逻辑单元Nand便可以组成的如此复杂系统。

爱默生 Emerson 1803-1882
上一篇下一篇

猜你喜欢

热点阅读