序列检测器

161 阅读2分钟

三段式状态机:

状态寄存器 描述当前状态的状态寄存器:

always@(posedge clk or posedge areset)begin if(areset)begin current_state <= B; end else begin current_state <= next_state; end

状态转移条件判断 描述下一状态的状态寄存器:

always@(*)begin case(current_state) B:begin if(in == 1'b1)begin next_state = B; end else begin next_state = A; end end A:begin if(in == 1'b1)begin next_state = A; end else begin next_state = B; end end endcase end

状态输出 根据next_state进行状态输出:

always@(posedge clk or posedge areset)begin if(areset)begin out <= 1'b1; end else if(next_state == B)begin out <= 1'b1; end else begin out <= 1'b0; end end

Moore型状态机 Mealy型状态机

Moore型状态机 ,状态机的输出只与当前的状态有关。

Mealy型状态机的输出不仅与当前的状态有关,还与当前的输入有关。

检测序列1101

请用Moore型状态机实现序列“1101”从左至右的不重叠检测。
电路的接口如下图所示。当检测到“1101”,Y输出一个时钟周期的高电平脉冲。

image.png


module det_moore(
   input                clk   ,
   input                rst_n ,
   input                din   ,
 
   output	reg         Y   
);

    // 定义状态变量 5个状态,第四个状态可以等价于第一个状态
    // 采用独热码,每个状态只有一位表示
    parameter S0 = 5'b00001,
    S1 = 5'b00010,
    S2 = 5'b00100,
    S3 = 5'b01000,
    S4 = 5'b10000;
    
    //定义状态寄存器 state next_state
    reg [4:0]state,next_state;
    
    //三段式状态机
    
    //当前状态寄存器描述
    
    always@(posedge clk or negedge rst_n)
        if(!rst_n)
            state <= S0;
        else
            state <= next_state;
    //下一状态的状态寄存器描述
    
    always@(*)
        case(state)
            S0: next_state <= din?S1:S0;
            S1: next_state <= din?S2:S0;
            S2: next_state <= ~din?S3:S2;
            S3: next_state <= din?S4:S0;
            //为1,下一状态跳转到S1,否则跳转到S0
            S4: next_state <= din?S1:S0;
            default:next_state <= S0;
        endcase
    
    //状态输出
    always@(posedge clk or negedge rst_n)
        if(!rst_n)
            Y <= 1'b0;
        else if(state == S4)
            Y <= 1'b1;
        else
            Y <= 1'b0;
    

endmodule