0

状态机的状态的枚举字面减速是否保证无故障行为,就像将以下顺序分配给状态一样?

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
4

2 回答 2

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 的下一个状态可以取任何可能的值(或保持旧状态)。

于 2019-01-28T18:07:48.003 回答
1

默认情况下,enum标签的编码为 a=0、b=1、c=2。你可以给出明确的编码:

enum { a=0,b=2,c=3} states; 

但是许多综合工具都有指令让工具决定它们识别的 FSM 样式的最佳编码。

于 2019-01-28T16:58:04.703 回答