Memory: The faculty of the brain by which data or information is encoded, stored, and retrieved when needed.It is the retention of information over time for the purpose of influencing future action —— Wikipedia
文中提到的所有实现都可以参考:nand2tetris_sol,但是最好还是自己学习课程实现一遍,理解更深刻。
之前的文章里实现了组合逻辑单元和 ALU,我们有了计算的能力。
但是我们不能存储信息,只能处理 16bit 的数字,不能处理时序的信息(比如 x[t+1] = x[t])。有了处理时序信息的能力,我们才能构建强大的计算机,因为处理时序信息代表着我们可以把一个芯片的输出作为另一个芯片的输入,从而实现各种复杂的功能。所以我们需要时序逻辑单元 DFF(Data Flip-Flop),DFF 干了一件很简单的事情,就是实现了 x[t+1] = x[t]。
下图展示了组合逻辑单元和时序逻辑单元的区别,其中的时钟信号由电子振荡器提供。
有了 DFF 和之前的组合逻辑单元,我们就可以构建 Register 和 RAM 了。
下面的芯片图约定:三角形图标代表时钟信号输入。
Data Flip Flop
1-Bit 寄存器
16-bit 寄存器
课程里的寄存器是 16位的,现代电脑一般是 64 位的,为了简单,方便理解,课程选择了 16 位,但是原理上和 64 位没有区别。
Program Counter(程序计数器)
添加图片注释,不超过 140 字(可选)
顾名思义,PC 用来实现三件事情:
-
(Reset)执行第一条指令 PC = 0
-
(Next)执行下一条指令 PC++
-
(Goto)执行第 n 条指令 PC = n
/**
* A 16-bit counter with load and reset control bits.
* if (reset[t] == 1) out[t+1] = 0
* else if (load[t] == 1) out[t+1] = in[t]
* else if (inc[t] == 1) out[t+1] = out[t] + 1 (integer addition)
* else out[t+1] = out[t]
*/
RAM
上图中 n 和 k 存在 的关系,意思是 RAM8(8 个寄存器可以用 3 位地址寻址),其他寄存器同理。
上图可知,RAM 可以读取数据,也可以写入数据,是计算机的存储设备。
我们来看 RAM8 的实现:
通过 DMux 和 Mux,我们可以在 load = 0 时读取对应第 k 个寄存器的值,在 in = any value,load = 1 的时候把 value 写入第 k 个寄存器。
对于 RAM64 我们把上图中的 Register 替换成 RAM8 即可,RAM512、RAM4K、RAM16K 同理。
现在我们有了 Register、ALU、RAM,接下来我们可以构建一个简单的 CPU,在这之前我们会介绍汇编语言和指令集,之后我们会实现我们自己的 CPU,以及相应的汇编器(将指令转变为机器码)。