跳到正文
芯片启蒙

状态:让系统记住刚才发生了什么

10 分钟

只用逻辑门的电路像一个只看眼前的裁判:同样的输入总给同样的输出。可是自动夜灯需要知道「刚才有人,现在正在倒计时」;密码锁需要知道「已经输入了前两位」。这类关于过去的信息叫状态

同样输入,不同状态,结果不同

夜灯当前检测不到人。如果状态是「从来没人来」,灯应该灭;如果状态是「人刚离开,十秒还没到」,灯应该继续亮。眼前输入相同,输出不同,原因就是系统记住的过去不同。

最小的记忆单元可以保存一个 0 或 1,许多记忆单元组合成寄存器,再组合成更大的存储器。时钟到来时,电路把新的状态锁进去,下一拍继续使用。CPU 的寄存器、计数器和内存,都建立在「保存状态」这件事上。

用状态图把过程画出来

自动夜灯可以有三个状态:

  1. DAY:白天,灯灭。
  2. WAIT:夜晚无人,灯灭。
  3. ON:夜晚有人或正在延时,灯亮。

箭头上写切换条件,例如光线变暗时从 DAYWAIT,检测到人时从 WAITON,十秒无人时从 ON 回到 WAIT。这叫状态机:有限个状态,加上清楚的转换规则。

一定要设计初始状态

设备刚通电时从哪里开始?如果没有复位规则,记忆单元可能处于不可预测状态,灯也许莫名亮起。复位就像开学第一天统一回到起跑线,让系统进入已知状态。

状态不能无限增加

每遇到一个例外就新增状态,图会变成蜘蛛网。先保留完成目标所需的最少状态,给每个状态清楚命名,再检查是否有走不出去的死路。

练一练:给红绿灯画三个状态,写出每个状态的输出以及切换到下一个状态的条件。

小纸条

为什么同样是「没有人」,自动夜灯有时灭、有时还亮着?