alt

`timescale 1ns/1ns

module fsm1(
	input wire clk  ,
	input wire rst  ,
	input wire data ,
	output reg flag
);
//*************code***********//
    parameter S0 = 3'd0, S1 = 3'd1, S2 = 3'd2, S3 = 3'd3;
    reg [2:0] c_state;
    reg [2:0] n_state;
    always@(posedge clk or negedge rst) begin: part1
        if(~rst)
            c_state <= S0;
        else
            c_state <= n_state;
    end
    
    always@(*) begin: part2
        case(c_state)
            S0: n_state = (data == 1) ? S1:S0;
            S1: n_state = (data == 1) ? S2:S1;
            S2: n_state = (data == 1) ? S3:S2;
            S3: n_state = (data == 1) ? S0:S3;
            default: n_state = S0;
        endcase
    end
    
    always@(posedge clk or negedge rst) begin: part3
        if(~rst)
            flag <= 0;
        else if(c_state == S3 && n_state == S0)
            flag <= 1;
        else
            flag <= 0;
    end

//*************code***********//
endmodule