状态机-重叠序列检测

195 阅读1分钟

描述


设计一个状态机,用来检测序列 1011,要求:

1、进行重叠检测   即10110111 会被检测通过2次

2、寄存器输出,在序列检测完成下一拍输出检测有效

注意rst为低电平复位

信号示意图:

image.png

状态转移图的绘制

设置5个状态。

IDLE初始状态。data为1跳转到S0。 SOdata为0跳转到S1。data为1保持在S0状态。,S1data为1跳转到S2,data为0返回IDLE状态,S2状态data为1,跳转到S3data为0,跳转到S1状态. S3最终状态,表示检测到序列将flag拉高。data为0回到S1状态,data为1回到S0状态。

8517efb3aec2e75e34a62ca343168b7.jpg

image.png

采用独热码编码,任何状态只有1bit为1,其余皆为0,编码密度低。

三段式状态机。 状态 状态转移条件(组合逻辑) 根据状态进行输出


module sequence_test2(
	input wire clk  ,
	input wire rst  ,
	input wire data ,
	output reg flag
);
//*************code***********//
    parameter IDLE=5'b00001,S0=5'b00010,S1=5'b00100,S2=5'b01000,S3=5'b10000;
    
    reg [4:0]state,next_state;
    
    always@(posedge clk or negedge rst)
        if(!rst)
            state <= IDLE;
        else
            state <= next_state;
    
    
    always@(*)
        if(!rst)
            next_state <= IDLE;
        else
            case(state)
                IDLE: next_state <= data?S0:IDLE;
                S0:   next_state <= data?S0:S1;
                S1:   next_state <= data?S2:IDLE;
                S2:   next_state <= data?S3:S1;
                S3:   next_state <= data?S0:S1;
                default: next_state <= IDLE;
                
            endcase
    always@(posedge clk or negedge rst)
        if(!rst)
            flag<=0;
        else
            flag <= state == S3;
    
 
//*************code***********//
endmodule
```