数字电路初学者
经典笔试例子:设计一个可乐售卖机状态机。投币有5分、10分,可乐价格15分。要求输出找零和可乐。这个题考察状态定义(如0分、5分、10分、15分)、状态转移、以及输出逻辑。易错点是找零输出时机,还有投币信号可能抖动,需要去抖处理。
经典笔试例子:设计一个可乐售卖机状态机。投币有5分、10分,可乐价格15分。要求输出找零和可乐。这个题考察状态定义(如0分、5分、10分、15分)、状态转移、以及输出逻辑。易错点是找零输出时机,还有投币信号可能抖动,需要去抖处理。
避免毛刺的方法,除了输出寄存,还可以用独热码编码。因为独热码每次只有一个触发器变化,组合逻辑输出毛刺少。但要注意状态机非法状态处理。独热码有很多非法状态,上电可能进入非法,要在设计里加复位或容错跳转,笔试常考这个。
面积和速度权衡的题我见过。比如问:一个状态机有20个状态,要求运行在500MHz,用哪种编码?独热码虽然面积大,但解码简单,速度快,适合高频。二进制面积小但需要解码器,可能关键路径长。笔试时要估算触发器数量和组合逻辑延迟,再决定。
复杂条件跳转时,建议画状态转移图前先列真值表。把所有输入条件和现态组合穷举,再确定次态。笔试里可能给一段模糊描述,让你设计状态机。先列真值表能避免遗漏。另外,状态数太多时可以考虑用计数器加条件逻辑简化,但要看题目是否允许。
格雷码编码在笔试中常考应用场景。比如跨时钟域的状态信号传递,用格雷码可以避免亚稳态传播。因为每次只变一位,即使采到亚稳态,也可能解码成相邻状态,不会出大错。但要注意格雷码只适合顺序切换的状态机,随机跳转的用格雷码没优势。
易错点里,状态机输出类型容易混淆。Mealy型输出依赖状态和输入,Moore型只依赖状态。笔试里常给一个波形图或描述,让你判断用哪种。设计时要注意Mealy型可能产生毛刺,如果要求输出干净,可以寄存器输出,但会延迟一个周期。
优化思路方面,笔试可能问状态机与流水线结合。比如一个状态机控制多个阶段,每个阶段耗时不同,怎么设计使吞吐量最大。这时可以考虑用流水线结构,状态机只负责跳转,数据通路用流水寄存器隔离。注意状态跳转要和流水节拍对齐,避免数据冲突。
异步事件处理是个难点。如果状态机有多个异步输入,直接用来做条件可能产生亚稳态。笔试会问怎么处理。通常要在状态机外同步这些信号,再用同步后的信号做判断。另外,复杂条件跳转时,建议把条件组合逻辑单独写,别全塞在always块里,这样代码清晰也好维护。
我笔试时遇到过状态机覆盖不全的坑。题目给一个序列检测,要求检测到‘1011’输出1。很多人直接画状态转移,但没考虑非重叠检测和重叠检测的区别。非重叠检测完回到初始状态,重叠检测时可能回到中间状态。笔试里这个必考,写代码时一定明确题目要求。
笔试里状态机考得确实细。除了三段式结构,常问怎么选状态编码。二进制省触发器但速度慢,独热码速度快但面积大,格雷码用在经常顺序切换的状态减少毛刺。笔试会让你根据场景选,比如高速控制用独热,资源紧张用二进制。还要注意状态机输出要不要寄存,避免毛刺。