You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VHDL实现简易CPU控制器时状态机跳过SUB中间状态问题求助

问题根因与修复方案

你的状态机逻辑本身没有“同时执行两个分支”的问题,异常观测结果和设计不符合的核心原因如下:

  • VHDL 时钟进程内的<=为非阻塞赋值,所有赋值更新会在时钟沿触发后才生效,因此S_Sub状态本身会完整存在一个时钟周期,不存在被跳过的情况。你观测不到S_Sub对应操作码的优先排查方向:
    1. 单独把cur_state信号加入仿真波形,确认start拉高后的第一个时钟沿后,cur_state是否出现了S_Sub的取值。如果没有,优先检查你的状态常量编码是否重复,或是综合工具是否开启了过度的状态机优化把S_Sub状态优化掉了。
    2. 你观测到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',可以删除冗余代码避免后续维护出错。

修复建议

  1. 补充复位分支的debug_sig初始值,确认cur_state的跳转时序完全符合你的设计预期。
  2. 如果你需要S_Sub状态停留超过一个周期,可以添加计数标志或者跳转条件,不要直接无条件跳转到S_Add。
  3. 把所有用到的运算状态从others分支中拆分出来,单独编写跳转和输出逻辑。

内容的提问来源于stack exchange,提问作者ajflj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:54:04