`timescale 1ns/1ns

module sequence_test2(
	input wire clk  ,
	input wire rst  ,
	input wire data ,
	output reg flag
);
//*************code***********//
/*三段式*/
parameter idle=0,s0=1,s1=2,s2=3,s3=4;
reg[2:0]cs,ns;
reg flag_reg;
always@(posedge clk or negedge rst)begin
	if(!rst) cs<=idle;
	else     cs<=ns;
end
always@(*)begin
	if(!rst)ns=idle;
	else begin
		case(cs)
		idle:ns=data?s0:idle;
		s0:ns=data?s0:s1;
		s1:ns=data?s2:idle;
		s2:ns=data?s3:s1;
		s3:ns=data?s0:s1;
		default:ns=idle;
		endcase
	end
end
always@(posedge clk or negedge rst)begin
	if(!rst)begin
		flag_reg<=0;
	end
	else begin
		case(ns)
		idle: flag_reg<=0;
		s0:   flag_reg<=0;
		s1:	  flag_reg<=0;
		s2:   flag_reg<=0;
		s3:   flag_reg<=1;
		default:flag_reg<=0;
	endcase
	end
end
always@(posedge clk or negedge rst)begin
	if(!rst) flag<=0;
	else     flag<=flag_reg;
end
//*************code***********//
endmodule