本系列为阅读《计算机系统要素》之后的总结,如有不准确或者错误的地方,欢迎指正。
个人建议,阅读完《Code–隐匿在计算机软硬件背后的语言》后,再阅读此书,效果更佳。
目录
在第一、二章中,介绍了逻辑门的搭建和算术芯片的搭建,这些门和算术芯片根据输入变量,及时输出结果,但是它们仅输出结果,并不能保持自身的状态。计算机不仅需要计算能力,还需要配备记忆单元,这些记忆单元由时序芯片组成。
记忆单元的搭建用到了触发器这一基础模块,基础模块我们当做黑匣子处理,不研究内部结构,只利用它的特性来实现其它硬件。
1、时序元件介绍
1.1 触发器(Flip-Flops)
数据触发器(Data Flip-Flop,DFF/D触发器 ),接口包含一个比特位输入和一个比特位输出,还有一个时钟输入,根据时钟信号连续地交变。out (t)= in(t - 1),DFF将前一个时间周期的输入值作为当前周期的输出。
1.2 寄存器(Registers)
能够“存储”或者记忆某一时刻的值,out(t)= out(t- 1)。
可以通过DFF实现该功能,在DFF前加上一个二选一选择器
- 比如现在load为1,表示选择器输出的是in接口的数值,那么DFF输出的就一直是in端口的数值;
- 如果load是0,那么选择器输出的是DFF上次输出的数值,相当于数据一直被保持,直到新的指令到来。
实现了1-bit寄存器就意味着实现了多位寄存器
1.3 内存(Memories)
寄存器堆叠形成RAM(Random Access Memory),不受限于访问数据,内存中的任何字都能以相等的速度被直接访问。
RAM中的每个内存单元分配一个唯一的地址,寻址逻辑门能够根据指定的地址寻找到对应的记忆单元。
RAM设备的接受包含:数据输入、地址输入和加载位(Load 为0时,输出被选中的记忆单元的数值;Load为1时,被选中的记忆单元被赋予新值)
1.4 计数器(Counter)
计数器每经过一个时钟周期就增加一个单位,out(t)= out(t -1) + c。
比如CPU包含一个程序计数器,它的输出是当前程序中下一步将要执行的指令地址。
综上,DFF门赋予了上述时序芯片维持状态或者对状态进行操作的能力。
2、时序元件的硬件语言描述
在文章中,DFF门作为原始构建模块
2.1 寄存器(Register)
一位寄存器:
CHIP Bit {
IN in, load;
OUT out;
PARTS:
Mux(a = preOut, b = in, sel = load, out = o1);
DFF(in = o1, out = preOut, out = out);
}
16位寄存器:
CHIP Register {
IN in[16], load;
OUT out[16];
PARTS:
Bit(in = in[0], load = load, out = out[0]);
Bit(in = in[1], load = load, out = out[1]);
Bit(in = in[2], load = load, out = out[2]);
Bit(in = in[3], load = load, out = out[3]);
Bit(in = in[4], load = load, out = out[4]);
Bit(in = in[5], load = load, out = out[5]);
Bit(in = in[6], load = load, out = out[6]);
Bit(in = in[7], load = load, out = out[7]);
Bit(in = in[8], load = load, out = out[8]);
Bit(in = in[9], load = load, out = out[9]);
Bit(in = in[10], load = load, out = out[10]);
Bit(in = in[11], load = load, out = out[11]);
Bit(in = in[12], load = load, out = out[12]);
Bit(in = in[13], load = load, out = out[13]);
Bit(in = in[14], load = load, out = out[14]);
Bit(in = in[15], load = load, out = out[15]);
}
2.2 存储器(Memory)
图7为包含8个寄存器(16位寄存器)的存储器,采用DMux8Way,将3位地址分解成8路控制信号,对八个Register进行控制
Load为0时,表示要对存储器进行读操作,寄存器输出其内容;Load为1时,表示要对存储器进行写操作,寄存器从in引脚加载数值。
RAM8
CHIP RAM8 {
IN in[16], load, address[3];
OUT out[16];
PARTS:
DMux8Way(in = load, sel = address, a = loadA, b = loadB, c = loadC, d = loadD, e = loadE, f = loadF, g = loadG, h = loadH);
Register(in = in, load = loadA, out = o1);
Register(in = in, load = loadB, out = o2);
Register(in = in, load = loadC, out = o3);
Register(in = in, load = loadD, out = o4);
Register(in = in, load = loadE, out = o5);
Register(in = in, load = loadF, out = o6);
Register(in = in, load = loadG, out = o7);
Register(in = in, load = loadH, out = o8);
Mux8Way16(a = o1, b = o2, c = o3, d = o4, e = o5, f = o6, g = o7, h = o8, sel = address, out = out);
}
2.3 程序计数器(Programmer Counter)
程序计数器的功能需求:指令地址计数器内容是计算机下一周期要读取和执行的指令地址,还要实现地址的跳转,清零
- 跳转功能: 跳跃执行编号为n的指令,可以将指令设置成n,然后它继续执行计数行为n + 1,n + 2等等
- 加1操作: 计算机获取下一条指令
- 计数器清零: 让程序重新执行
这里程序计数器中的选择器,选择引脚如果为1,就选择下面的那个作为输入
CHIP PC {
IN in[16],load,inc,reset;
OUT out[16];
PARTS:
Mux16(a = preOut, b = addOut, sel = inc, out = o1);
Mux16(a = o1, b = in, sel = load, out = o2);
Mux16(a = o2, b = false, sel = reset, out = o3);
Register(in = o3, load = true, out = preOut, out = out);
Inc16(in = preOut, out = addOut);
}