Nand to Tetris - 3
背景
在第一章中,构建了逻辑门,第二章中构建了芯片,也就是ALU这个可以计算的单元。在第三章,将会构建电脑的存储系统。
为什么需要时间的概念
之前构建所运用的逻辑是,芯片的输入是固定不变的,芯片的输出是基于当前输入的函数,也就是不随时间变化的。而最终软件上想要实现的功能,一个是记住某个变量以便将来使用,另一个是能够序列地执行任务。
而在硬件中,不管是传播数据还是计算,都消耗时间。在一个时间周期内,刚开始输入的电信号都在波动中,没有稳定下来,而我们需要等待信号稳定再做下一步操作。
时间的概念可以保证数据以一个可控/有序/按步骤的方式被处理。
记忆功能
记忆就是把信息存储起来将来使用的功能。“记住”的意思是,先将17放到x变量中储存,之后每次取值都是17。也就是所设计的芯片,要实现能保持状态和改变状态的功能。
时间的表示
时间周期,设置成比传输/计算所需要的时间延误略大,这样就可以保证最后的结果是最终的稳定数据,而不是在传输/计算没有完成时期的不准确的数据。我们想要达到的效果就是每个时间间隔,状态可以从0马上变成1。
时钟,利用石英晶体稳定的震荡性来控制频率。给电脑提供一个时钟信号,可以控制计算和传输数据的时间,速度,顺序。
寄存器
寄存器是如何实现读写功能的?
- 当load=1,寄存器执行加载的动作,意思是要加载当前的输入作为新数据,作为下一个时间段的输出。
- 写入新的值之后,将load设置为0,这时候输出保持不变,寄存器只是存储数据。
1位寄存器和16位寄存器
- 1位寄存器储存1或者0作为1 bit,多位寄存器可以同时加载存储多位数据(16/32)。寄存器的输出位数和能存储的数据规格一致,1位寄存器输出就是1位。
为什么时钟概念重要
- 定义另什么时候加载数据,什么时候保持不变
- 将现在的输入与将来的输出区分开
RAM
最简单的电脑hack中,RAM是由n个16位寄存器组成,每个寄存器都有地址。
如何获取数据?
- 因为用多个寄存器来存储读取数据,所以使用地址输入来挑出想要使用哪一个寄存器。例如address = i
- load = 1,输入的数据存储到选择的寄存器RAM[i]中
- load = 0,RAM[i]保持现在的值
为什么叫做Random Access Memory
- 无论RAM有多少个寄存器,如果指定了一个地址,都可以立即访问到指定地址的寄存器,不需要从头到尾顺序查找。
计数器
计数器,CPU里面一个专门的寄存器,Program Counter。
计算机需要知道取出哪个指令,接下来执行哪个指令。PC用来存储下一条指令的地址。在之前的寄存器基础上,计数器就是多了一个reset和increment的功能。也就是可以直接输出0,也可以每次渐增读取下一个地址。
DFF
DFF是一个最基础的sequential gate,输出上一个时间段段输入。
通过DFF如何实现寄存器的加载/存储功能?
- MUX可以从两种输入中选一个输出
- load = 0,将DFF的输出作为MUX的输入,out不变,就可以实现上一个时间段的输出作为下一个时间段输出的存储功能
- load = 1, DFF输出in的值
这样得到寄存器之后,我们通过地址输入将多个多位寄存器结合起来,就是RAM。
如何实现RAM的读写功能?
- 多个寄存器的输出可以通过MUX进行一个1 to n的转换
- 多个寄存器的输入可以通过DMUX进行n to 1的转换
为什么可以实现直接访问?
- 存储的行为是基于时序性逻辑
- 寻址的行为是通过MUX/DMUX实现,是基于组合逻辑
如果想得到一个RAM16k(16384),地址输入需要几位?
如何从DFF得到RAM
如何从RAM得到RAM8,RAM16…?