`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
	);
	reg [9:0]cur_state;
	reg [9:0]nex_state;

	parameter IDLE=9'b00_0000_0001;
	parameter s0=9'b00_0000_0010;
	parameter s1=9'b00_0000_0100;
	parameter s2=9'b00_0000_1000;
	parameter s3=9'b00_0001_0000;
	parameter s4=9'b00_0010_0000;
	parameter s5=9'b00_0100_0000;
	parameter s6=9'b00_1000_0000;
	parameter s7=9'b01_0000_0000;
	parameter s8=9'b10_0000_0000;

	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)begin
			cur_state<=IDLE;
		end
		else begin
			cur_state<=nex_state;
		end
	end

	always@(*)begin
		case(cur_state)
		IDLE:nex_state=(a==1'b0)?s0:IDLE;
		s0:nex_state=(a==1'b1)?s1:s0;
		s1:nex_state=(a==1'b1)?s2:s0;
		s2:nex_state=s3;
		s3:nex_state=s4;
		s4:nex_state=s5;
		s5:nex_state=(a==1'b1)?s6:s0;
		s6:nex_state=(a==1'b1)?s7:s0;
		s7:nex_state=(a==1'b0)?s8:s0;
		s8:nex_state=(a==1'b1)?IDLE:s0;
		endcase
	end

	//由图可见,match的输出比a要慢一拍,所以应该使用时序逻辑电路判断
	//因为在always块中要使用reg类型,且题目已经给出的定义output match是reg类型
	//所以在不改动原先代码的前提下,应在always中使用match,然后用assign在always块外对另一个match_wire进行工作
	//等于always单纯是用来打一拍的延后赋值
	wire match_wire;
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)begin
			match<=0;
		end
		else begin
			match<=match_wire;
		end
	end

	assign match_wire=(cur_state==s8)?1:0;
  
endmodule