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

18、P1 W3 U3.3 存储单元(待完善)

2019-08-06  本文已影响0人  shazizm

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

在开始讲存储单元的时候,课程先回顾了一下在 P1W2U2.4 ALU 那节课里提到的冯诺依曼架构图。

如下图这节课就来讲右下角灰色部分“存储”(Memory)。

老师设计的存储只有一个主存储:RAM (类似内存?),不考虑次存储(比如硬盘)。

老师设计的主存储器RAM:即用来存储被操作的数据,也存储程序。

RAM的实现原理重逻辑,而现实世界的物理实现不会涉及。

和DFF一样,如果想用硬件物理实现的RAM,也要做些课外工作

RAM = Random Access Memory (随机存取存储器)

在开始RAM前,先看看RAM的基础组成部分“寄存器”。

课程又先回顾了上节课的 1位寄存器。

寄存器

16位寄存机 由 16个1位寄存器组成。

在本课程里,老师不特殊说明的情况下,Register(寄存器)默认都是指16位寄存器。

寄存器,图中w = word width字宽? = 16-bit

读 寄存器

“读”寄存器,实际上就是 16位 out 的输出。

读 Register

写 寄存器

“写”寄存器,先设置 In 的值,再设置 load 为1,这样在 load 设置 1 的一个Clock周期后,out就输出一个Clock周期前In的值了。


写 Register

那接下来,用硬件模拟器来用 内建的 寄存器 演示一下。

打开硬件模拟器,选择 tools/builtInChips/DRegister.hdl
1.设置 输入值 (44)和 load值(1)。

2.因为hdl文件里有 CLOCKED ,所以模拟器的钟表按钮就可以点击了。
点击一下。

3.Time 从 0 到 0+(半个Clock),寄存器内部变为44了,但是out还没变。

4.再点击一下 “钟表按钮”,Time 从 0+ 到 1(完成一个Clock周期)。out变成44。

上图演示视频 从 5分50秒 到 12分20秒

RAM 单元

1.学习了寄存器,RAM就是有n个有序排列寄存器组成的。从0到n-1。

2.在任何一个时间点,只有一个寄存器被选中,从out/w 输出。

3.如何选择寄存器,需要一个地址(address),地址由k位组成。

4.课程 Hack小电脑 的 w(word width)默认为 16位。

5.RAM 的示意图 底部 也是有 小三角,所以也是时序电路,图中左下,写出了HDL语言如何编写。

假设k为本课系统最大位数16.那么通过这个16位各种组合,可以代表2的16次方(65536)个寄存器的地址,也就是说存储最大只能到64k?存储再大就没有地址来对应了,也就无法使用。

读 RAM

设置 地址(address),例如 i。设置 load 为 0(读操作)。

那么RAM的 out 此时的输出,就是 选中的 “寄存器 i ” 的 out

读 RAM

写 RAM

1、设置地址为 i (address = i)
2、设置数据为 v (in = v)
3、设置load 为 1 (写操作)

写 RAM

模拟器演示

操作演示,打开 tools/builtInChips/RAM8.hdl

写操作
地址选择1
设置load为1(写)
输入In 设为44
点一下闹钟按钮(走半个Clock周期)
RAM里的寄存器1就被设置成了44
如果再点一下闹钟按钮(完成一个Clock周期),RAM的out就输出44了。

读操作
切换地址i
设置load为0 (读)
从演示上来看,只要点一下闹钟按钮,RAM 的 out 就能读出对应 寄存器i 的数。

上图演示视频 从 18分00秒 到 25分40秒

最后,如下作业:
RAM8
RAM64
RAM512
RAM4k
RAM16k

上面几个RAM是组成Hack小电脑所需的。

为什么要用RAM,而不是其他存储单元呢?
因为,不管RAM有多大,读写操作 和 “找出对应寄存器” 都能在同样一个很短的时间内(一个clock?)完成。

RAM

这节课,讲了如何从 1位寄存器,做出 16位寄存器,又从16位寄存器 如何组成 RAM。

下节课 来讲另一个重要的单元 计数器(Counter)。

上一篇下一篇

猜你喜欢

热点阅读