状态的枚举文字减速是否保证无故障状态机?
Does enum literal deceleration of states guarantee a glitch free state machine?
状态机的状态枚举字面减速是否保证无故障行为,就像将如下顺序分配给状态一样?
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
默认情况下,enum
标签获得编码 a=0、b=1、c=2。你可以给出明确的编码:
enum { a=0,b=2,c=3} states;
但是许多综合工具都有指令让工具决定它们识别的 FSM 样式的最佳编码。
要使状态机工作'reliably',所有输入信号必须满足构成状态机的所有寄存器的设置和保持时间。
这与状态值的定义方式无关。直接或通过枚举。
如果一个或多个控制信号异步到达,则无法保证下一状态是什么。
即使状态是使用格雷码定义的并且遵循格雷序列(参见下面的示例)。这并不能保证状态机会工作 'reliably'。
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
异步到达,它可以从任何状态转到任何其他状态。这是因为驱动每个寄存器的逻辑需要'settle'。虽然信号未稳定,但它可能会在“1”或“0”之间变化。因此,每个寄存器都可以在输入端获得“1”或“0”。然后 FSM 的下一个状态可以取任何可能的值(或保持在旧状态)。
状态机的状态枚举字面减速是否保证无故障行为,就像将如下顺序分配给状态一样?
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
默认情况下,enum
标签获得编码 a=0、b=1、c=2。你可以给出明确的编码:
enum { a=0,b=2,c=3} states;
但是许多综合工具都有指令让工具决定它们识别的 FSM 样式的最佳编码。
要使状态机工作'reliably',所有输入信号必须满足构成状态机的所有寄存器的设置和保持时间。
这与状态值的定义方式无关。直接或通过枚举。
如果一个或多个控制信号异步到达,则无法保证下一状态是什么。
即使状态是使用格雷码定义的并且遵循格雷序列(参见下面的示例)。这并不能保证状态机会工作 'reliably'。
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
异步到达,它可以从任何状态转到任何其他状态。这是因为驱动每个寄存器的逻辑需要'settle'。虽然信号未稳定,但它可能会在“1”或“0”之间变化。因此,每个寄存器都可以在输入端获得“1”或“0”。然后 FSM 的下一个状态可以取任何可能的值(或保持在旧状态)。