关于状态机的书写规范

1、四段式状态机的书写规则
第一段:
同步时序的always模块,格式化描述次态迁移到现态寄存器。
代码如下

always @(posedge clk or negedge rst_n)  begin
  if(!rst_n)begin
  state_c <= IDLE;
  end
  else  begin
  state_c <= state_n;
  end
end

第二段:
组合逻辑的always块,描述状态转移条件。

always @(*)begin
  case(state_c)
  IDLE:begin
            if(idl2s1)begin
              state_n = S1;
            end
            else begin
              state_n = state_c;
            end
          end
   S1:begin
          if(s12s2)begin
            state_n = S2;
         end
         else  begin
           state_n = state_c;
         end
  end
  S2:begin
          if(s22idl)begin
             state_n = IDLE;
          end
          else begin
            state_n = state_c;
          end
     end
     default:begin
             state_n = IDLE;
             end
  endcase
end

第三段:定义转移条件

assign     idl2s1_start = state_c == IDLE && ...;
assign     s12s2_start  = state_c == S1   && ...;
assign     s22idl_start = state_c == S2   && ...;

第四段:设计输出
一个always设计一个信号,因此有多少个输出信号,就有多少个always。

猜你喜欢

转载自blog.csdn.net/emperor_strange/article/details/83053984