状态机的枚举状态是否立即减速,是否保证无故障行为与将以下状态分配给状态的行为相同?
enum { a,b,c} states;
//vs if you were to declare
parameter a = 3'b000;
parameter b= 3'b010;
parameter c = 3'b011;
/////////////////////////
always @(posedge clk) begin
if ( reset) begin
// initial condition
end
else begin
case ( state) begin
a: begin
state<=b;
end
b: begin
state<=c;
end
c: begin
state<= a;
end
default: state<=c;
endcase
end
end
答案 0 :(得分:2)
要使状态机“可靠地”工作,所有输入信号必须满足组成状态机的所有寄存器的建立和保持时间。
这与状态值的定义无关。直接或通过枚举。
如果一个或多个控制信号异步到达,则不能保证下一状态将是什么。
即使状态是使用格雷码定义的,并且遵循格雷序列(请参见下面的示例)。这不能保证状态机将“可靠地”工作。
localparam ST0 = 2'b00,
ST1 = 2'b01,
ST2 = 2'b11,
ST3 = 2'b10;
...
case (state)
ST0 : if (in==2'b11)
state <= ST1;
ST1 : if (in!=2'b11)
state <= ST2;
ST2 : if (in==2'b10)
state <= ST3;
ST3 : if (in==2'b01)
state <= ST0;
endcase
如果in
异步到达,它可以从任何状态进入任何其他状态。这是因为驱动每个寄存器的逻辑需要“稳定”。当信号未稳定时,它可能在“ 1”或“ 0”之间变化。因此,每个寄存器的输入可以为“ 1”或“ 0”。 FSM的下一个状态可以取任何可能的值(或保持旧状态)。
答案 1 :(得分:1)
默认情况下,enum
标签的编码为a = 0,b = 1,c = 2。您可以给出明确的编码:
enum { a=0,b=2,c=3} states;
但是许多综合工具都有指令,让该工具为他们所识别的FSM样式确定最佳编码。