Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

尝试加法自动化

复习

  1. 第十一~十三章:掌握了补码,理解了它可以统一加减法
  2. 第二十三章:认识了时钟,它可以统一各部件的更新节拍
  3. 第二十六章:设计实现了寄存器,本质是多个触发器并排连接

TL;DR

  • 把加法器、寄存器、多路选择器接成一个回路,就能自动累加
  • 寄存器保存“目前的累加和“,多路选择器决定这一轮加的是新输入还是上一次的结果
  • 这个电路就叫累加器,是 CPU 运算部件的雏形

正文

  我们已经造出了不少零件:会算加法的全加器,会记数据的寄存器,会统一节拍的时钟,还有会“多选一“的多路选择器。现在,是时候把它们拼起来,做点真正有用的东西了。

目标

  试着让机器自动完成这样的计算:

1 + 2 + 3 + 4 = 10

  人算的时候,是先算出 1+2=3,再算 3+3=6,再算 6+4=10。每一步都要把“目前的和“记在心里,再和下一个数相加。

  机器要自动化这件事,就得解决两个问题:

  1. 谁来记住“目前的和“?——用寄存器。
  2. 每一次相加,是拿“新来的数“加,还是拿“上次的结果“加?——用多路选择器来选。

搭出电路

  思路其实很朴素:让加法器的输出,经过寄存器保存下来,再绕回到加法器的输入,和自己加。

  • 加法器:两个输入,一个来自外部的新数,一个来自寄存器里存着的“当前和“;输出新的和
  • 寄存器:把加法器算出来的新和存起来
  • 多路选择器:在“外部新数“和“寄存器里的当前和“之间二选一,送给加法器
  • 时钟:告诉寄存器什么时候把新结果存进去

  接好之后大概是这样一条回路:

   外部输入 ──┐
             ├──[多路选择器]──┬──[加法器]──┬──[寄存器]──> 输出
   寄存器 ───┘               │           │
                             └───────────┘(回送到加法器的另一个输入)

它是怎么工作的

  假设初始时寄存器里是 0。我们依次送入 1、2、3、4:

  1. 送入 1:多路选择器把“当前和 0“和“新数 1“送给加法器,算出 1,存进寄存器
  2. 送入 2:把“当前和 1“和“新数 2“相加,得 3,存进寄存器
  3. 送入 3:1、3 相加得 6,存进寄存器
  4. 送入 4:6、4 相加得 10,存进寄存器

  每来一个数、每来一个时钟脉冲,寄存器就更新一次。四个数送完,寄存器里就躺着答案 10。

  这个专门用来“累加“的寄存器,就叫累加器(Accumulator)

别忘了时钟

  整件事能有序进行,全靠时钟。如果没有时钟,加法器还没算稳,寄存器就抢先存了,结果就错了。时钟保证了:先算完,再存;存完,再算下一个

思考题

  我们已经做出了能自动累加的电路。但注意,它只会“加“。

  如果想让它先算 1+2,再算 ×3,最后算 -4,应该怎么改?换句话说,我们能不能让它按人的意愿,做不同的运算?

小结

知识点

  • 用加法器 + 寄存器 + 多路选择器构造累加器
  • 多路选择器在回路中的作用:选择反馈值还是新输入
  • 时钟在其中的作用:决定何时写入
  • 累加器的意义:运算部件的雏形

参考资料

  1. Wikipedia(zh):加法器:加法器的详细工作原理
  2. Wikipedia(zh):累加器:累加器的基本概念
  3. Wikipedia(zh):数据选择器:数据选择器的工作原理

推荐

思考题答案(仅供参考)

  让它“听命令“运算。具体做法是:在加法器之外,再放上减法器、乘法器等功能部件,然后用多路选择器在它们的输出之间选择,用一个信号告诉多路选择器“这一轮选哪个运算“。这个信号,我们已经在前面的 ALU 里见过,它就是“操作码“。把操作码、累加器和数据通路组合起来,就离真正的 CPU 很近了。

协议

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

封面图

设计师 | 南国微雪