Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

状态机

复习

  • 触发器:触发器在时钟边沿保存一个比特,避免锁存器跟随输入
  • 寄存器:多个触发器并排,形成能保存多位数据的寄存器
  • 累加器:把寄存器输出接回运算器,构成能连续累加的累加器

TL;DR

  • 状态表示机器当前走到了哪一步
  • 组合逻辑根据当前状态和输入,决定本拍动作与下一状态
  • 状态寄存器在时钟边沿保存下一状态,让步骤自动向前推进

正文

  累加器能保存“算到了多少”,但要自动完成一长串操作,机器还得记住“走到了哪一步”。

  以乘法为例,它需要反复执行同一套动作:检查乘数当前位、决定要不要累加、把数据移位、判断是否结束。如果每一步仍要靠人拨动控制线,那这台机器只是会记事,还算不上会做事。

  我们想要的是什么?是给一次运算写好步骤,然后按下开始键,剩下的它自己走完。

给步骤编号

  办法还是那个办法:存起来。用寄存器给步骤编号:

00:等待开始
01:检查当前位
10:累加并移位
11:判断是否完成

  寄存器里保存的这个编号,叫作当前状态(current state)。不同的状态会打开不同的控制线,让相应的部件完成这一拍的动作。状态,本质上是给“走到哪一步”起的一个名字。

让状态自己前进

  接下来是巧妙的第二步:让状态自己决定自己的下一步。组合逻辑读取当前状态和外部输入,同时产生两类结果:

  • 本拍要执行的动作
  • 下一个状态

  时钟边沿到来时,状态寄存器收下“下一个状态”;下一拍,机器便按照新状态继续工作。这就是“当前状态 → 动作 → 下一状态”的循环,这样的电路叫作状态机(state machine)。

  请注意状态机有多“笨”,又有多“聪明”。它不必理解乘法是什么、9 到底对不对,它只负责依照条件推进步骤。正因为如此,交通灯、电梯、售票机、以及下一章的控制器,全都可以用同一套方法组织动作。把’做什么’和’走到哪’分开,是控制复杂流程的通用智慧。

  现在,三块拼图都齐了:组合逻辑负责“这一拍算什么”,数据寄存器负责“已经算出了什么”,状态寄存器负责“接下来走哪一步”。下一章,我们用这套结构真正完成一次乘法。

思考题 1

  交通灯按照“绿 → 黄 → 红 → 绿”循环。状态寄存器需要保存什么?组合逻辑又负责决定什么?

思考题 2

  状态机和累加器都用到了寄存器,它们保存的东西有什么本质不同?

小结

知识点

  • 状态是对执行步骤的编号
  • 状态机根据当前状态和输入决定动作与下一状态
  • 状态寄存器让机器按照时钟自动推进步骤

参考资料

  1. Wikipedia(zh):有限状态机:状态、转移与输出的通用模型
  2. Wikipedia(zh):控制单元:状态机在处理器中的典型应用

思考题答案(仅供参考)

思考题 1

  状态寄存器保存当前亮的是绿灯、黄灯还是红灯。组合逻辑根据当前颜色和“计时是否结束”,决定本拍点亮哪些灯,并计算出下一个应该进入的颜色状态。

思考题 2

  累加器的寄存器保存的是数据——算出来的和;状态机的寄存器保存的是序号——当前走到哪一步。前者参与运算,后者决定控制。一个是“算什么”,一个是“做什么”,职责完全不同。也正因为如此,机器里通常会把数据寄存器和状态寄存器分开设置。

协议

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

封面图

设计师 | 南国微雪