视频:
如果本次课程对应的 Coursera 的视频打不开,可以点击下面链接
P1W3U3.3 - Memory Units
在开始讲存储单元的时候,课程先回顾了一下在 P1W2U2.4 ALU 那节课里提到的冯诺依曼架构图。
如下图这节课就来讲右下角灰色部分“存储”(Memory)。
老师设计的存储只有一个主存储:RAM (类似内存?),不考虑次存储(比如硬盘)。
老师设计的主存储器RAM:即用来存储被操作的数据,也存储程序。
RAM的实现原理重逻辑,而现实世界的物理实现不会涉及。
RAM = Random Access Memory (随机存取存储器)和DFF一样,如果想用硬件物理实现的RAM,也要做些课外工作
在开始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 (写操作)
模拟器演示
操作演示,打开 tools/builtInChips/RAM8.hdl
写操作
地址选择1
设置load为1(写)
输入In 设为44
点一下闹钟按钮(走半个Clock周期)
RAM里的寄存器1就被设置成了44
如果再点一下闹钟按钮(完成一个Clock周期),RAM的out就输出44了。
读操作
切换地址i
设置load为0 (读)
从演示上来看,只要点一下闹钟按钮,RAM 的 out 就能读出对应 寄存器i 的数。
最后,如下作业:
RAM8
RAM64
RAM512
RAM4k
RAM16k
上面几个RAM是组成Hack小电脑所需的。
为什么要用RAM,而不是其他存储单元呢?
因为,不管RAM有多大,读写操作 和 “找出对应寄存器” 都能在同样一个很短的时间内(一个clock?)完成。
这节课,讲了如何从 1位寄存器,做出 16位寄存器,又从16位寄存器 如何组成 RAM。
下节课 来讲另一个重要的单元 计数器(Counter)。
网友评论