第 15 讲:工程状态机、寄存器与移位寄存器
会画一个计数器,还不等于会设计工程状态机。工程题的难点通常在第一步:状态究竟要记住多少历史,才能决定下一拍做什么。
状态不是“步骤名”,而是必要记忆
设计状态时可以问一句:如果只知道当前输入,还缺少哪段历史才能决定输出和下一状态?缺少的那部分信息,就是状态必须保存的内容。
连续三个 1 检测器
要在输入中检测连续三个或更多的 1,可以用:
- :末尾没有连续 1;
- :末尾已有一个 1;
- :末尾已有两个 1;
- :末尾已有至少三个 1。
若允许重叠检测,在 再读到 1 后仍留在 并继续输出 1;读到 0 才回到 。若题目要求不可重叠,检测成功后的转移规则就不同。
课程例子同时对比了重叠和不可重叠输出。区别不在最后一根输出线,而在“检测成功后保留多少历史”。
工程状态化简
课程用序列检测说明了状态合并,也用 8421 BCD 串行码监视器展示了更大的化简:原始状态按“已经收到了几位、当前前缀是什么”展开,之后把输出和后续转移完全相同的状态合并。
化简时应反复检查:
- 相同输入下输出是否相同;
- 次态是否相同;
- 次态不同的话,那两个次态是否已被证明等价。
有时会出现循环依赖的隐含等价,不能只比较状态名字。
自动售货机:先定金额状态
题设为每次投入 0.5 元或 1 元,累计到 1.5 元出货,多余金额同时找回。自然的状态含义是:
- :累计 0 元;
- :累计 0.5 元;
- :累计 1 元。
输入编码区分 0.5 元和 1 元;输出编码区分“无动作”“出货”“出货并找零”。例如在 投入 1 元,应出货并找回 0.5 元,然后回 。
这类题要先用真实业务语义把每条边走通,再做二进制编码。若一上来就画 Karnaugh 图,很容易把“金额”和“状态码”混成一件事。
自启动仍然不能省
三个状态通常用两个触发器编码,必然留下一个未用码。课程例子特别指出:某个化简结果会使无效状态在无输入时无法回到有效状态。解决办法不是口头声明复位,而是重新选择无关项的取值,使未用状态也能回到有效循环;若系统确实依赖外部复位,也要在设计中明确它。
寄存器是什么
寄存器是一组共享控制信号的触发器,用于保存一个多位字。四个 D 触发器共用时钟和清零端,就构成四位并行寄存器:在有效沿同时把 写入 。
保持功能
给寄存器增加使能 ,可写成
其中课程电路取 时写入、 时保持。不同器件的使能有效电平可能相反,必须看功能表。
保持并不是“停止时钟”的同义词。用组合门随意截断时钟容易产生窄脉冲,工程上通常使用触发器自带的时钟使能或经过规范设计的门控时钟单元。
移位寄存器
移位寄存器每来一个时钟沿,就把各位向同一方向移动一格,同时从串行输入端补入新位。
以四位右移为例,若串行输入为 ,可以写成
于是同一个结构可以完成:
- 串行输入、串行输出;
- 串行输入、并行输出;
- 并行装载后串行输出;
- 数据延迟与移位运算。
方向命名要先约定下标和位权。有人把“数据向 走”叫右移,也有人按二进制位权叫左移;最可靠的是直接写 接哪个 。
双向移位
用控制信号 选择左邻或右邻,就能得到双向移位寄存器。以中间位为例:
端点没有邻居,需要接左、右两个串行输入端。实质上每个 D 输入前都放了一个二选一选择器。
看时序图的办法
- 在图上圈出所有有效时钟沿;
- 写清初态;
- 每个有效沿只更新一次整组状态;
- 用更新前的 同时计算所有 ;
- 更新后再读并行输出或串行输出。
不能按“先算 ,再拿刚更新的 算 ”逐位覆盖。同步触发器是在同一个边沿采样旧状态。
这一讲和上一讲怎样衔接
工程状态机负责控制:根据输入和历史决定下一步;寄存器负责数据:保存、移动一组位。实际数字系统常把它们分成控制通路和数据通路。课程没有把这套术语展开,但序列检测器、售货机和移位寄存器已经展示了这两个角色。