第七章:存储器

复习

  • 第二章:这台计算机需要供能,输入,输出和处理过程。
  • 第三章:利用电能和布尔代数,造出了一个加法器。
  • 第四章:引入有符号数,介绍原码、反码和补码,使计算机可以表示负数和运算减法。
  • 第五章:介绍乘法与除法,并尝试从原理上优化效率过慢的问题。
  • 第六章:组成算术逻辑单元,负责计算,模块化。

正文

引子

  计算功能设计完成,但是哪怕一次微小扰动,都会使最终的结果立即变化。所以,为了保存中间结果,接下来需要一个东西,将其存起来。

锁存器

首尾相连

  回想一下,非门将输入取反。那如果首尾相接会怎么样?非门会直接短路吗?

  正如上面的图所示,非门不仅不会短路,而且输出会一直在 0 和 1 之间跳动。这是一个非常有意思的事情。 利用这个性质可以做一个简单的时钟。

  时钟 就是字面意思,就像一个钟表一刻一刻地走, 用来标记时序 ,但现实时钟有 12 个单位,会从 1 走到 12 然后归位,而二进制时钟只有 2 个单位,所以 时钟会一直在 0 和 1 中间跳变,永不停息

  之所以是简单的时钟,是因为当逻辑门叠加越多,其延迟越高。 而非门首尾相连构成的时钟跳变速度极快,其他逻辑部件(如加法器、乘法器、锁存器、触发器和选择器等)变化跟不上。简单起见,我们假设所有部件跳变速度一致,不存在这个问题。

  那与门和或门各自首尾相连,会有什么效果呢?

  与门和或门在某次输入一个信号之后,无论怎样改变输入值,都不会再改变输出值了。也就是说,有个信号“触发”了变化。

  这给了我们一个很重要的启示: 逻辑门可以首尾相连,达到意想不到的效果。

AND-OR 锁存器

  接下来我们把三大逻辑门按照下面的顺序,连接起来,形成一个奇怪的结构,研究它的真值表。

  • 结构

  • 真值表
设置端 S(et)重置端 R(eset)输出 Y
00上一次的输出 Y
010
101
110

  当 S = 0 并且 R = 0 时,下一次的输出 Y 取决于图中或门的另一个引脚,而该引脚连接到了上一次的输出 Y。所以,下一次的输出 Y 等于上一次的输出 Y。 换句话说,当 S = 0 并且 R = 0 时,这个结构锁住了输入的值。

  • 如果觉得不好理解,把三种情况列出来就明白了:
  • 当 S = 1 , R = 0 变为 S = 0, R = 0 时,之前的输出 Y 为 1,变化后为 1,之后也一直为 1
  • 当 S = 0, R = 1 变为 S = 0, R = 0 时,之前的输出 Y 为 0,变化后为 0,之后也一直为 0
  • 当 S = 1 , R = 1 变为 S = 0, R = 0 时,之前的输出 Y 为 0,变化后为 0,之后也一直为 0

  所以,这个结构,具有记忆和存储的功能。取名为:AND-OR 锁存器。

D 锁存器

  上面的设计虽然达到了目的,但还是有些复杂,所以,我们打算只用两个输入端:D(Data) 为数据端,WE(Write Enable,允许写入) 为控制端。

  功能为: 当 WE 为 1 时,输出 Y 的值等于输入端 D 的值;当 WE 为 0 时,不允许写入,输出 Y 的值为上一次输出的值。

触发器

SR 触发器

  上述 AND-OR 锁存器可以采取另一种逻辑门实现方案,如下所示:

  注意,图中是 nand,也即与非门,从晶体管的角度来说,nand 门要更划算(详见第三章:简单逻辑门的补充部分)。

  这个东西有另一个名字:SR 触发器。SR 触发器有两个输入端:S(Set) 为设置端,R(Reset) 为重置端。

  • 特征方程(输出公式):Qnext = S + R · Q,且 R · S = 0
    • R
      • 意为 R 的反相,即 R 取反后的值,读作:R 反
      • 部分教程写作 R',写法不同,效果相同
    • R · S
      • 意为 R S,也意为 R 和 S 取 交集
      • 离散数学和集合论术语,等同于 R ∧ S
      • 在二进制运算上可以 一定程度上 等同于 乘法 运算
    • R + S
      • 同理, 意为 R S,也意为 R 和 S 取 并集
      • 离散数学和集合论术语,等同于 R ∨ S
      • 在二进制运算上可以 一定程度上 等同于 加法 运算
    • 运算优先级,同十进制加法和乘法运算法则:先乘后加,括号先算
    • 后文真值表中 X 为 无意义 或者 任意值均可
  • 状态转移表
SRQnext动作
00Q保持
010重置
101设置
11X不允许的输入
  • 激励表(专业术语,意为上一个输出怎样 影响或激励 下一个输出,所以 Q 在前)
QQnextSR
00X0
0110
1001
11X0

电平触发和边沿触发

  感觉一切都很完美了。 但是如果输入的信号并不是期望的信号,而是被干扰的信号呢? 比如,希望输入 1,但在传输过程中,由于发热或者噪声等原因,导致电子能量逐渐减弱,降到门电压阈值之下,被逻辑门看作了 0。那么输出不就全错了?

  为此,计算机科学家们设计了根据时钟跳变变化的的边沿触发。边沿是指 1 跳变为 00 跳变为 1 的一瞬间。根据跳变的方向不同,可以分为上升沿和下降沿,因此触发器也分为上升沿触发和下降沿触发。

  边沿触发可以有效解决传输错误的问题。电平只有在单方向跳变时才发生改变,所以电平被干扰和电平反方向跳变均不会引起改变。

D 触发器

  改造上述的 D 锁存器,改为边沿触发。同样,两个输入端:D(Data) 为数据端,但 WE(Write Enable,允许写入) 改为 Clk(Clock,时钟脉冲) 作为信号端,接受一个上升沿或下降沿作为有效输入,其他时间无论高电平和低电平,均视为不允许写入。

  D 触发器的功能是: 当每一个上升沿或下降沿触发 Clk 端时,将 D 端目前的值输出并锁存。

  • 特征方程(输出公式):Qnext = D
  • 真值表
DClkQQnext
0↑(上升沿)X0
1↑(上升沿)X1
X0 或 100
X0 或 111

JK 触发器

  JK 触发器过于复杂,此处不展开。只贴出其原理图、真值表和输出公式,感兴趣的读者可以自行推导。

  • 原理图

  • 特征方程(输出公式):Qnext = K · Q + J · Q
  • 状态转移表
JKClk动作Qnext
00保持Q
01重置0
10设置1
11反转Q
XX0 或 1保持Q
  • 激励表
QQnext动作JK
00不变0X
01设置1X
10重置X1
11不变X0

存储器

  将上面的锁存器或触发器连接起来,可以形成存储器。

简单排列

  简单堆叠 8 个、16 个、32 个、64 个锁存器或触发器,可形成 8 位、16 位、32 位、64 位的存储器。

  然而,这种方式,位宽越大,成本越高。因为需要的引脚翻倍增长。

  • 8 位引脚数:1(允许写入)+ 8(数据输入)+ 8(数据输出)= 17
  • 16 位引脚数:1(允许写入)+ 16(数据输入)+ 16(数据输出)= 33
  • 32 位引脚数:1(允许写入)+ 32(数据输入)+ 32(数据输出)= 65
  • 64 位引脚数:1(允许写入)+ 64(数据输入)+ 64(数据输出)= 129
  • 128 位引脚数:1(允许写入)+ 129(数据输入)+ 128(数据输出)= 257
  • 256 位引脚数:1(允许写入)+ 256(数据输入)+ 256(数据输出)= 513

  现代计算机大多都有 64 位,这样的成本不可接受。

矩阵排列

  将锁存器或触发器呈矩阵排列可以解决上述问题。

小结

知识点

  • 时钟
  • 锁存器
    • AND-OR 锁存器
    • D 锁存器
  • 边沿触发
  • 触发器
    • SR 触发器
    • D 触发器
    • JK 触发器
  • 存储器

参考资料

思考题答案(仅供参考)

协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。