第三章,01-D触发器与1比特存储器实现
简介
这是《计算机系统要素:从零开始构建现代计算机》的学习笔记,刚刚启程学习,记录博客好提醒自己不要半途而废。
书籍获取,代码实现与书籍介绍,可关注这位大佬,视频课程:coursera/B站
偷一张大佬github截图作为介绍:
实现的逻辑电路
1比特位存储器
1bit存储器的记忆能力来源于D触发器(Data Flip Flop, DFF),下面先介绍DFF
D触发器介绍
在前面两章实现的电路都没有时序相关逻辑,对输入即时计算并输出计算结果,对上一时刻的状态没有记忆,而对状态的记忆是存储器实现的核心。存储器的记忆能力来源于D触发器。
D触发器功能
DFF功能为输出上一时刻的输入:
o
u
t
(
t
)
=
i
n
(
t
−
1
)
out(t)=in(t-1)
out(t)=in(t−1)
即输出永远是延迟一个时钟周期的,完成一个时钟周期的记忆
D触发器原理
1.由Nand实现状态保持与翻转(基本RS触发器)
将两个Nand门按如下方式连接,成为RS触发器,为叙述方便,分别将两个Nand门记为A,B
假设某个时刻输入为1,1
此时不必关心输出是什么值,我们将上面A的输入改为0,此时A的输出为1,导致B的输出为0,B的输出转接到A的输入,可以看到两个Nand都保持了稳定:
此时将A的输入改为1,仍然保持稳定:
若此时将B的输入改为0再改为1,由于A,B是等效的,因此A将稳定输出0,B稳定输出1
总结:
输入为1,1时保持输出不变(存储的1bit内容不变)
任何时候,要保证某个Nand输出1,而另一个为0,只需要进行两个操作:
先将这个Nand的输入置为0,再置为1
2.从基本RS触发器到同步RS触发器
这里不分析,仅作中间变化的参考
3.从同步RS触发器到D触发器
上面这张图对应下图的in out 应该是D和Q端,
至于最后
o
u
t
(
t
)
=
i
n
(
t
−
1
)
out(t)=in(t-1)
out(t)=in(t−1)是怎么实现的,请看下面真值表的解析
真值表
D(in) | CP | S’ | R’ | Q(out) | Q ˉ \bar{Q} Qˉ |
---|---|---|---|---|---|
0 | 0 | 1 | 1 | 不变 | 不变 |
0 | 1 | 1 | 0 | 0 | 1 |
1 | 0 | 1 | 1 | 不变 | 不变 |
1 | 1 | 0 | 1 | 1 | 0 |
可见:
1.一个完整的时钟周期分成2部分:CP=0(tic),CP=1(toc)
2.tic时DFF输出不变(因为基本RS触发器的输入为1 1)
3.toc时DFF输出更新为D
注:可能0叫toc,1叫tic,在这里不细究,只为了方便演示记忆的电路实现
把真值表拉长一点,从第一行开始,让它按时间演化,看看 o u t ( t ) = i n ( t − 1 ) out(t)=in(t-1) out(t)=in(t−1)是怎么实现的:
time | D(in) | CP | S’ | R’ | Q(out) | Q ˉ \bar{Q} Qˉ |
---|---|---|---|---|---|---|
tic | 0 | 0 | 1 | 1 | 不变 | 不变 |
toc | 0 | 1 | 1 | 0 | 0 | 1 |
tic | 1 | 0 | 1 | 1 | 0 | 1 |
toc | 1 | 1 | 0 | 1 | 1 | 0 |
tic | 0 | 0 | 1 | 1 | 1 | 0 |
toc | 0 | 1 | 1 | 0 | 0 | 1 |
tic | 0 | 0 | 1 | 1 | 0 | 1 |
toc | 0 | 1 | 1 | 0 | 0 | 1 |
tic | 1 | 0 | 1 | 1 | 0 | 1 |
toc | 1 | 1 | 0 | 1 | 1 | 0 |
tic | 1 | 0 | 1 | 1 | 1 | 0 |
toc | 1 | 1 | 0 | 1 | 1 | 0 |
从真值表看来tic toc的职责是:
1.tic,不更新,D值被忽略,输出上一toc时的输入值
2.toc,更新,将Q更新为D,不输出
第2点,toc若输出,输出的就是toc当前的输入值,而不是上一周期的输入值,失去了时间性,变成了无记忆电路。
根据以上两点,去掉干扰再看一下真值表(空格表示忽略),
o
u
t
(
t
)
=
i
n
(
t
−
1
)
out(t)=in(t-1)
out(t)=in(t−1)就很清晰了:
真值表
time | D(in) | Q(out) |
---|---|---|
tic | 不变 | |
toc | 0 | |
tic | 0 | |
toc | 1 | |
tic | 1 | |
toc | 0 | |
tic | 0 | |
toc | 0 | |
tic | 0 | |
toc | 1 | |
tic | 1 | |
toc | 1 |
可以看到,DFF延迟输出的实现,来自于两个方面:
1.RS触发器的状态保持
2.计算机时钟的控制
DFF电路是在tic toc都会进行输出的,所以外部应该还要有控制的电路,实现tic时对DFF取值, toc不取值,这应该是计算机时钟设计考虑的范围
1bit存储器
有了上面的DFF,1bit存储器的实现是相当简单的
从上面看DFF功能为
if tic Q=D(t-1), out Q
if toc Q=D, no out
1bit存储器每一时刻都有两个输出候选:一,上一时刻的输入,二,上一时刻的输出
既然有两个输出候选,就把它们与load一起输入一个Mux,然后输入DFF的D端:
电路
因为DFF在toc时才读取 D,更新值,所以load操作只在toc时生效
真值表,空格表示忽略:
time | in | load | D | Q(out) |
---|---|---|---|---|
tic | 不变 | |||
toc | 1 | 1 | 1 | |
tic | 1 | |||
toc | 1 | 0 | 1 | |
tic | 1 | |||
toc | 0 | 0 | 1 | |
tic | 1 | |||
toc | 0 | 1 | 0 | |
tic | 0 | |||
toc | 1 | 1 | 1 | |
tic | 1 | |||
toc | 1 | 1 | 1 |
hdl:
CHIP Bit {
IN in, load;
OUT out;
PARTS:
Mux(a=preOut, b=in, sel=load, out=o1);
DFF(in=o1, out=preOut, out=out);
}