alt

`timescale 1ns/1ns

module fsm2(
	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, S4 = 3'd4;
    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
        case(c_state)
            S0: begin
                n_state = data ? S1:S0;
                flag = 0;
            end
            S1: begin
                n_state = data ? S2:S1;
                flag = 0;
            end
            S2: begin
                n_state = data ? S3:S2;
                flag = 0;
            end
            S3: begin
                n_state = data ? S4:S3;
                flag = 0;
            end
            S4: begin
                n_state = data ? S1:S0;
                flag = 1;
            end
            default: begin
                n_state = S0;
                flag = 0;
            end
        endcase
    end

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