本文是笔者拜读《计算机系统要素》第3章(时序逻辑)的实践项目。
本文的HDL程序所调用的组合逻辑模块来自前几篇博客。
D触发器
DFF
的输出被赋予了上个时钟周期的输入,所有的DFF
门都连接同一个主时钟,所有时序芯片都在主时钟频率的协调下共同工作。
和Nand
门一样,DFF
门在计算机体系中处于非常底层的位置,计算机中的所有时序芯片(寄存器、内存、计数器)都基于大量的DFF
门。
DFF
的物理实现是个复杂的任务,它使用反馈电路(仅基于Nand
门)连接几个基本的逻辑门。
寄存器
1比特位寄存器
如果希望寄存器开始存储一个新值,可以把这个值置于in
输入口,然后将load
位设为1
;如果希望寄存器一直存储它的内部值直到新的指令到来,就将load
设置为0
。
CHIP Bit {
IN in, load; // t
OUT out; // t+1
PARTS:
// Put your code here:
Mux(a = o1, b = in, sel = load, out = o2);
DFF(in = o2, out = out);
DFF(in = o2, out = o1);
}
内部接线
o1
的默认初值是false
,即低电平。
输入是t
时刻的,输出是t+1
时刻的,该输出又是t+2
时刻输出的一部分。
多比特位寄存器
读:要读取寄存器的内容,只需获取它的输出。
写:要将新数据d
写入寄存器,只需将d
置于in
输入管脚,并将load
输入管脚的值设为1
,这样,在下一个时钟周期,寄存器被赋予新的数据值,输出变成了d
。
CHIP Register {
IN in[16], load;
OUT out[16];
PARTS:
// Put your code here:
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]);