结合前辈的写法,写的三段式状态机,第三段采用时序always

reg [1:0] curr_state;
reg [1:0] next_state;
// one step
always @ (posedge clk or negedge rst_n)
    begin
        if( ~rst_n ) begin
            curr_state <= 2'b00;
            next_state <= 2'b00;
        end 
        else begin
            curr_state <= next_state;
        end 
    end 
 
// two step
always @ (*)
    begin
        case(curr_state)
            2'b00 : next_state = (A == 1'b1) ? 2'b11 : 2'b01;
            2'b01 : next_state = (A == 1'b1) ? 2'b00 : 2'b10;
            2'b10 : next_state = (A == 1'b1) ? 2'b01 : 2'b11;
            2'b11 : next_state = (A == 1'b1) ? 2'b10 : 2'b00;
            default : next_state = 2'b00;
        endcase
    end
//three
reg out_buffer;
always @ (posedge clk or negedge rst_n)
    begin
        if( ~rst_n ) begin
            out_buffer<=0;
        end 
        else if(A==0) begin
            out_buffer<=(curr_state=='b10)?1:0;
            //out_buffer<=(next_state=='b11)?1:0;  //修改V2.0,这个条件也可以,感觉更好理解
        end
        else begin
            out_buffer<=(curr_state=='b00)?1:0;
            //out_buffer<=(next_state=='b11)?1:0;   //V2.0
        end
    end
assign Y=out_buffer;