• 引言
  • 一、有限状态机的相关概念
  • 二、经典的三段式有限状态机的Verilog代码实现(标准模板)
引言
  状态机!!!非常重要!非常重要!非常重要!重要的事说三遍!
  可能你还没有搞过比较大的 FPGA 工程设计,没有体会到一大堆时序状态信号、时序控制信号、时序顺序操作的费神费脑,甚至,可能是无底洞的一个时序设计,毕竟时序是设计出来的,我们需要有一个规范的时序设计套路,类似于 IC 验证需要一种方法学如 UVM 一样。后续,我会根据具体的设计来详细进行 FSM 的设计思路讲解。

一、有限状态机的相关概念
  有限状态机(Finite State Machine):FSM 由状态寄存器和组合逻辑电路构成,是一个能够进行状态转移与状态输出的控制模块,是协调相关信号动作、完成特定操作的控制中心。
  有限状态机主要分为两大类:第一类,若输出仅与状态有关,则称为 Moore 状态机(通常都是这个);第二类,输出与状态和输入都有关,则称为 Mealy 状态。
  如下所示,这是有限状态机的架构图,需要我们非常了解。
forum.jpg
有限状态机架构图
二、经典的三段式有限状态机的 Verilog 代码实现(标准模板)
module FSM(
  •     input clk,
  •     input rst_n,
  •     input x, // 输入序列
  •     output reg z // 检测结果
  •     );
  •     // FSM中主要包含现态 CS、次态 NS、输出逻辑 OL;
  •     parameter S0=2'b00,S1=2'b01,S2=2'b11,S3=2'b10; // 状态编码,采用格雷编码方式,S0 为 IDLE
  •     reg [1:0] c_state,n_state;
  • /*---------------次态到现态的时序逻辑------------*/
  •     always @(posedge clk or negedge rst_n) begin
  •         if(!rst_n)
  •             c_state <= S0;
  •         else
  •             c_state <= n_state;
  •     end
  • /*-------现态在输入情况下转换为次态的组合逻辑------*/
  •     always @(c_state or x) begin
  •         case(c_state)
  •             S0:begin
  •                 if(x)
  •                     n_state<=S1;
  •                 else
  •                     n_state<=S0;
  •             end
  •             S1:begin
  •                 if(x)
  •                     n_state<=S1;
  •             else
  •                     n_state<=S2;
  •             end
  •             S2:begin
  •                 if(x)
  •                     n_state<=S3;
  •             else
  •                     n_state<=S0;
  •             end
  •             S3:begin
  •                 if(x)
  •                     n_state<=S1;
  •             else
  •                     n_state<=S2;
  •             end
  •             default:n_state<=S0;
  •         endcase
  •     end
  • /*--------------现态到输出的组合逻辑---------------*/
  •         always @(c_state) begin
  •             case(c_state) // 从 S3 要变化到 S2 这一刻;
  •                 S3:     z=1'b1;
  •                 default:z=1'b0;
  •             endcase
  •         end
  • endmodule
  • 复制代码