FSM:下一个州优先权

时间:2014-11-20 14:34:18

标签: verilog system-verilog fsm state-machine operator-precedence

当处于状态" a1"如何显示下一个箭头将优先于彼此,而不会产生额外状态的开销?

完整示例:

  • 我们处于 a1 状态,信号 x && y 已断言:我们转到州b1
  • 如果该条件未被断言但 x && z 被断言,那么我们将转到州b2
  • 如果未声明上述条件但声明 x ,则我们转到州b3

视觉概念:

enter image description here

在上面的" FSM"我们无法在其他两个之前检查 x && y

代码段:

always_comb begin
  case (states)
    a1: begin
      if (x && y)
        next_state = b1;
      else if (x && z)
        next_state = b2;
      else if (x)
        next_state = b3;
      else
        next_state = a1;
    end
  endcase
end

2 个答案:

答案 0 :(得分:2)

由于您使用SystemVerilog标记了问题,我只是想提一种描述下一个状态逻辑的替代方法:

always_comb begin
  case (states)
    a1: 
        priority casez ({x,y,z})
         3'b11?:  next_state = b1; // x && y
         3'b1?1:  next_state = b2; // x && z
         3'b1??:  next_state = b3; // x
         default: next_state = a1; 
        endcase
  endcase
end

此外,常用的状态图未指定优先级,因此您需要完全指定转换条件,如xbug的答案。但我不明白为什么你不能扩展这种表示法,例如,用标签1, 2, 3, and 4标记每个弧,其中较低的数字表示较高的优先级。

答案 1 :(得分:1)

理想情况下,您需要涵盖每种状态下输入事件的所有可能组合,以获得正确的DFA(确定性FSM)。

但是,您可以根据输入信号完全指定触发器,并让您的HDL默认为“无转换”。在那种情况下:

  • a1
  • 可能会触发从b1x && y && !z的转换
  • a1
  • 可能会触发从b2x && !y && z的转换
  • a1
  • 可能会触发从b3x && !y && !z的转换

!表示逻辑'不')。

使用3个符号的字母表(您的三个输入信号),您可以在每个状态下获得2 ^ 3 = 8种可能的组合。问问自己:在您当前的设计中,如果所有xyz都被声明,会发生什么?你需要具体说明这一点。

修改

让我更具体一点。

让我们将ABC,... H视为事件,每个事件代表一种可能的输入信号组合,例如:

  x y z
A 0 0 0
B 0 0 1
C 0 1 0
D 0 1 1
E 1 0 0
F 1 0 1
G 1 1 0
H 1 1 1

然后尝试用ABC,... H来表达您的过渡。如果可以,生成的FSM适合您的任务。如果你做不到,你应该重新考虑你的逻辑。