三段式状态机 序列检测

219 阅读1分钟

有限状态机:简称状态机,表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。

moore 摩尔型:时序逻辑的输出不但取决于状态还取决于输入。

mealy 米勒型:时序逻辑的输出只取决于当前状态。

状态机三大部分:

1 状态转移部分 当前状态和次态的转换顺序 : 当前状态状态寄存器

2 判断状态转移条件 不同输入对状态转换的影响 : 下一个状态状态寄存器

3 输出状态 状态或输入对输出的影响 : 各状态对应的输出

三段式状态机 :三段式状态机的输出通过触发器产生,不会有毛刺。将组合逻辑和时序逻辑分开写,便于理解和后续维护。

三段式状态机序列检测:10110

状态IDLE A B C D E 到达E状态时候输出,表明已经检测到序列。

module sequence_detect(clk,rst_n,d_in,d_out);
    input clk,rst_n;
    input din;
    output reg d_out;
    
    // 描述状态
    parameter IDLE = 3'd0;
    parameter A = 3'd1;
    parameter B = 3'd2;
    parameter C = 3'd3;
    parameter D = 3'd4;
    parameter E = 3'd5;
    
    // 状态寄存器
    reg [2:0] c_state,n_state;
    
    // 1 描述对应的当前状态的状态寄存器  
    always@(posedge clk or negedge rst_n)
        if(!rst_n)
            c_state <= IDLE;
         else
             c_state <= next_state;
             
    //2  描述下一状态的状态寄存器,阻塞赋值
    always@(*)
        begin:
            case(c_state)
                IDLE:
                    if(d_in)  n_state = A;
                    else  n_state =IDLE;
                A:
                    if(!d_in)  n_state = B;
                    else   n_state = A;
                B:
                    if(d_in)   n_state = C;
                    else  n_state = A;
                C:
                    if(d_in)   n_state = D;
                    else  n_state = B;
                D:
                    if(!d_in)  n_state = E;
                    else  n_state = A;
                E:
                    if(d_in) n_state = A;
                    else n_state = IDLE;
                default:
                    n_state = IDLE;
           endcase
        end
   // 描述输出 
   always@(posedge clk or negedge rst_n)
       if(!rst_n)
           d_cout <= 1'b0;
       else
           case(n_state) 
               IDLE: 
                   d_out <= 1'b0;
                A:
                   d_out <= 1'b0;
                B:
                   d_out <= 1'b0;
                C:
                   d_out <= 1'b0;
                D:
                   d_out <= 1'b0;
                E:
                   d_out <= 1'b1;
                default:
                   d_out <=1'b0;
           endcase
    end
   
                    
                    
                   
        
    
    




endmodule