当处于状态" a1"如何显示下一个箭头将优先于彼此,而不会产生额外状态的开销?
完整示例:
a1
状态,信号 x && y
已断言:我们转到州b1 x && z
被断言,那么我们将转到州b2 x
,则我们转到州b3 视觉概念:
在上面的" 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
答案 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
b1
到x && y && !z
的转换
a1
b2
到x && !y && z
的转换
a1
b3
到x && !y && !z
的转换
(!
表示逻辑'不')。
使用3个符号的字母表(您的三个输入信号),您可以在每个状态下获得2 ^ 3 = 8种可能的组合。问问自己:在您当前的设计中,如果所有x
,y
和z
都被声明,会发生什么?你需要具体说明这一点。
修改强>
让我更具体一点。
让我们将A
,B
,C
,... 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
然后尝试用A
,B
,C
,... H
来表达您的过渡。如果可以,生成的FSM适合您的任务。如果你做不到,你应该重新考虑你的逻辑。