Quartus电梯FSM状态转换冲突Error(154039)解决求助
Quartus电梯有限状态机(FSM)编译错误排查与解决
编译错误信息
Error (154039): State S1 contains multiple transitions, but more than one transition equation are TRUE when ~R2 & R1 & R3 | R2 & ~R1 & R3 | R2 & R1. As a result, the next state cannot be decided. Error (154039):State S2 contains multiple transitions, but more than one transition equation are TRUE when ~R2 & R3 & R1 | R2 & ~R3 & R1 | R2 & R3. As a result, the next state cannot be decided. Error (154039): State S3 contains multiple transitions, but more than one transition equation are TRUE when ~R3 & R2 & R1 | R3 & ~R2 & R1 | R3 & R2. As a result, the next state cannot be decided.
现有配置
输入端口配置
| 输入端口 | 受控信号 |
|---|---|
| clock | Clock |
| reset | Reset |
| R1 | No |
| R2 | No |
| R3 | No |
输出端口配置
| 输出端口 | 已注册 | 输出状态 |
|---|---|---|
| U1 | Yes | 当前时钟周期 |
| U2 | Yes | 当前时钟周期 |
| D1 | Yes | 当前时钟周期 |
| D2 | Yes | 当前时钟周期 |
| NOGO | No | 当前时钟周期 |
状态转换配置(原冲突版本)
| 源状态 | 目标状态 | 条件 |
|---|---|---|
| S1 | S2 | R2 |
| S1 | S1 | R1 |
| S1 | S3 | R3 |
| S2 | S2 | R2 |
| S2 | S3 | R3 |
| S2 | S1 | R1 |
| S3 | S3 | R3 |
| S3 | S2 | R2 |
| S3 | S1 | R1 |
输出动作配置
| # | 输出端口 | 输出值 | 当前状态 | 附加条件 |
|---|---|---|---|---|
| 1 | U1 | R2 | S1 | 当前时钟周期 |
| 2 | U1 | R3 | S2 | 当前时钟周期 |
| 3 | U2 | R3 | S1 | 当前时钟周期 |
| 4 | D1 | R1 | S2 | 当前时钟周期 |
| 5 | D1 | R2 | S3 | 当前时钟周期 |
| 6 | D2 | R1 | S3 | 当前时钟周期 |
| 7 | NOGO | R1 | S1 | 当前时钟周期 |
| 8 | NOGO | R2 | S2 | 当前时钟周期 |
| 9 | NOGO | R3 | S3 | 当前时钟周期 |
错误原因
当前状态转换条件未做互斥处理,当多个请求信号(如R1和R2同时为1)时,同一个源状态下会触发多个转换条件,导致Quartus无法确定下一个状态。比如在S1状态,若R1和R2同时有效,既满足R1(留S1)又满足R2(转S2),产生逻辑冲突。
解决方案
方案1:修改状态转换条件为互斥逻辑
给请求信号设定优先级(比如高层请求优先,或低层优先,根据电梯需求确定),确保每个输入组合仅对应一个状态转换。以下是高层优先的修改示例:
修改后的状态转换表
| 源状态 | 目标状态 | 条件 |
|---|---|---|
| S1 | S3 | R3 |
| S1 | S2 | R2 & ~R3 |
| S1 | S1 | R1 & ~R2 & ~R3 |
| S1 | S1 | ~R1 & ~R2 & ~R3 |
|
| S2 | S3 | R3 | // 优先去3楼 |
|---|---|---|---|
| S2 | S1 | R1 & ~R3 | // 仅R1有效时去1楼 |
| S2 | S2 | R2 & ~R1 & ~R3 | // 仅R2有效时留2楼 |
| S2 | S2 | ~R1 & ~R2 & ~R3 | // 无请求时保持原状态 |
| S3 | S1 | R1 | // 优先去1楼(可根据需求调整为低层/高层优先) |
| S3 | S2 | R2 & ~R1 | // 仅R2有效时去2楼 |
| S3 | S3 | R3 & ~R1 & ~R2 | // 仅R3有效时留3楼 |
| S3 | S3 | ~R1 & ~R2 & ~R3 | // 无请求时保持原状态 |
方案2:添加输入仲裁模块
在FSM外部增加一个仲裁逻辑,对R1/R2/R3的请求进行优先级判断,输出唯一的目标楼层信号(比如target,取值1/2/3),再将该信号输入FSM。这样FSM的状态转换条件仅基于target,避免多输入冲突。
方案3:适配NOGO逻辑
原NOGO配置是在当前楼层有请求时输出有效,修改状态转换条件后,需确保NOGO逻辑与新规则一致:只有当无更高/更低请求、仅当前楼层请求有效时,NOGO才输出有效。
内容的提问来源于stack exchange,提问作者Gr_10
相关产品推荐
相关产品推荐

