VHDL实现简易CPU控制器时状态机跳过SUB中间状态问题求助
问题根因与修复方案
你的状态机逻辑本身没有“同时执行两个分支”的问题,异常观测结果和设计不符合的核心原因如下:
- VHDL 时钟进程内的
<=为非阻塞赋值,所有赋值更新会在时钟沿触发后才生效,因此S_Sub状态本身会完整存在一个时钟周期,不存在被跳过的情况。你观测不到S_Sub对应操作码的优先排查方向:- 单独把
cur_state信号加入仿真波形,确认start拉高后的第一个时钟沿后,cur_state是否出现了S_Sub的取值。如果没有,优先检查你的状态常量编码是否重复,或是综合工具是否开启了过度的状态机优化把S_Sub状态优化掉了。 - 你观测到
debug_sig和start同步拉高的现象是复位逻辑缺失导致的:你只在S_Sub分支给debug_sig赋值为1,复位分支没有给它赋初始值,其他状态也没有对它赋值,它会作为寄存器保持上一次的取值,你看到的高电平大概率是复位后的未知态或者之前运行的残留值,不是状态跳转异常。修复方式是在复位逻辑中添加debug_sig <= '0'的初始值赋值。
- 单独把
代码隐藏隐患
- 你把S_Add、S_Load等其他状态都归入了
others分支,会导致这些状态都只能存在一个时钟周期,就直接跳回S_Decode并拉高DONE,如果你这些运算需要多周期执行,必须单独给每个状态编写对应的分支逻辑,不要放在others分支统一处理。 - S_Decode分支里的DONE赋值存在冗余,你已经在if/else分支都给DONE赋了0,末尾又额外写了一次
DONE <= '0',可以删除冗余代码避免后续维护出错。
修复建议
- 补充复位分支的
debug_sig初始值,确认cur_state的跳转时序完全符合你的设计预期。 - 如果你需要S_Sub状态停留超过一个周期,可以添加计数标志或者跳转条件,不要直接无条件跳转到S_Add。
- 把所有用到的运算状态从
others分支中拆分出来,单独编写跳转和输出逻辑。
内容的提问来源于stack exchange,提问作者ajflj
相关产品推荐
相关产品推荐

