`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input data,
	input data_valid,
	output reg match
	);
  
  reg [4:0] cur_state;
  reg [4:0] nex_state;
  
  parameter IDLE = 5'b00_001,
            S0   = 5'b00_010,
			S1   = 5'b00_100,
            S2   = 5'b01_000,
			S3   = 5'b10_000;
  
  always@(posedge clk or negedge rst_n)begin
      if(!rst_n)
          cur_state <= IDLE           ;
      else
          cur_state <= nex_state      ;	  
  end
  
  always@(*)begin
     case(cur_state)
	    IDLE:begin 
		    if(data_valid == 1'b1)begin
			    if(data == 1'b0)
				    nex_state = S0    ;
				else
				    nex_state = IDLE  ;    
			end
			else begin
			    nex_state = IDLE;
			end
		end	
		S0:begin //data 序列:0
		    if(data_valid == 1'b1)begin
			    if(data == 1'b1)
				    nex_state = S1    ;
				else
				    nex_state = S0    ;    
			end
			else begin
			    nex_state = S0;
			end
		end	
		S1:begin //data 序列:01
		    if(data_valid == 1'b1)begin
			    if(data == 1'b1)
				    nex_state = S2    ;
				else 
				    nex_state = S0    ;    
			end
			else begin
			    nex_state = S1;
			end
		end	
		S2:begin //data 序列:011
		    if(data_valid == 1'b1)begin
			    if(data == 1'b0)
				    nex_state = S3    ;
				else
				    nex_state = IDLE  ;    
			end
			else begin
			    nex_state = S1        ;
			end
		end	
		S3:begin //data 序列:0110
		    if(data_valid == 1'b1)begin
			    if(data == 1'b0)
				    nex_state = S0    ;
				else
				    nex_state = IDLE  ;    
			end
			else begin
			    nex_state = IDLE      ;
			end
		end	
		default: nex_state = IDLE     ;
	 endcase
  end
  
  always@(posedge clk or negedge rst_n)begin
      if(!rst_n)
	      match <= 1'b0;
	  else begin
	      case(nex_state)
		      S3     : match <= 1'b1 ;
			  default: match <= 1'b0 ;
		  endcase
	  end
  end
endmodule