计算机要素--第三章 时序逻辑

计算机系统要素,从零开始构建现代计算机(nand2tetris)
如果完成了本书所有的项目 你将会获得以下成就

  • 构建出一台计算机(在模拟器上运行)
  • 实现一门语言和相应的语言标准库
  • 实现一个简单的编译器

而且,这本书的门槛非常低,只要你能熟练运用一门编程语言即可。本课程综合了数字电路,计算机组成原理,计算机体系架构,操作系统,编译原理,数据结构等的主要内容,搭建了计算机平台的构建的框架,并未深入细节,如果需要了解细节,可由本书作为主线,逐步完善的知识体系。

QQ交流群(含资料):289682057
课程连接
项目地址Github


本章要实现的逻辑门电路

  • 1bit寄存器,16bit寄存器
  • RAM8,RAM64,RAM512,RAM4K,RAM16K
  • 程序计数器PC

内容

1位寄存器:

一个触发器可以对1位数据进行存储。因此这个1位寄存器使用一个触发器来实现。
输入管脚:in,load
输出管脚:out
核心代码:

Mux(a=preout, b=in, sel=load, out=o1)
DFF(in=o1, out=preout, out=out)

16位寄存器:

将16个一位寄存器排列起来,将时序信号作用于每个寄存器,然后每个寄存器接收一位的输入,根据时序信号确定是接收输入还是继续保持。
输入管脚:in[16], load
输出管脚:out[16]
伪码:

for i=0:15
    Bit(in=in[i], load=load, out=out[i])

RAM8:

要实现RAM8芯片,就要将一组8个寄存器排列起来。接着,必须构建一个组合逻辑,把从RAM8"in"输入端的输入值装载到被选中的某个记忆单元内。依次类推,还需要构建一个组合逻辑,其对给定的address值选择正确的寄存区,然后将它的out输出值送到RAM8的out输出上。
要将in[16]存储到某个单元,首先需要定位该单元,然后将数据和控制信号送给该单元。定位某个单元,也就是将控制信号通过指定的线路输出,这可以通过DMux8Way来实现。然后由于我们不知道具体是哪个单元,所以需要将数据和控制信号送个所有的单元,至于用哪个单元,完全由控制信号决定。根据address输出值很显然是个16位八选一的问题。
输入管脚:in[16], load, address[3]
输出管脚:out[16]
伪码:

DMux8Way(in=address,out=loadSignal)
for i=0:7
    Register(in=in,load=loadSignal,out=out_i)
Mux8Way16(in=out_[0..7], sel=address, out=out)

RAM64:

采用的思路是类似的,不同的是,对DMux8Way传递的地址和对Mux8Way16传递的地址时不同的。我们只需要将高三位地址传给DMux8Way和Mux8Way16让他们对芯片进行选择即可,然后将低三位地址传给RAM8作为它的地址参数,进行芯片内部的地址选择。
依次类推,我们可以构建RAM512,RAM4K,RAM16K…
输入管脚:in[16], load, address[6]
输出管脚:out[16]
伪码:

DMux8Way(in=address[3..5],out=loadSignal)
for i=0:7
    RAM8(in=in,load=loadSignal,address=address[0..2],out=out_i)
Mux8Way16(in=out_[0..7], sel=address[3..5], out=out)

PC程序计数器:

总体上来看,inc,load,reset三个管脚的信号所实现的功能都是二选一,因此可以使用Mux16来进行实现,加一操作是非常显然的要用增量器Inc16来实现。由于PC计数器中数据有时需要改变,有时需要保持,所以还需要一个寄存器(16位)来实现。课本上是这么说的“w位计数器包含两个主要部分:一个常规的w位寄存器和组合逻辑。组合逻辑用来:(a)、执行计数功能。(b)、根据控制位的3种不同的命令值,将计数器置于正确的操作模式。提示:这个逻辑的大部分功能都已经在第2章中实现了。”
Inc的功能:确定是否需要对之前的数据进行加一操作,因此此二路选择器a管脚应该输入之前的数据值,b管脚应该输入加一之后的数据值。显然存储功能是由寄存器实现的,所以要想获得之前的数据值,就得从寄存器的输出管脚那里获得,因此,将寄存器的输出管脚分为两路,一路给管脚a,另一路经由增量器给管脚b。而寄存器的输入应该是上一个器件的输出。
load功能:确定是否加载芯片的输入值,显然b管脚连接in,而a管脚连接实现Inc功能的选择器的输出。
reset功能:确定是否将数据值置零,显然b管脚连接常量false,而a管脚连接实现load功能的输出。由于reset功能之后就没有控制信号了,因此reset的输出端给register的输入。这样就完成了一个简单的计数器。至于计数器的原理和细节内容还需要参考数字电路的知识。示意图,并不是规范的电路图
在这里插入图片描述
输入管脚: in[16],load,inc,reset
输出管脚:out[16]


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章