题解 | #根据状态转移写状态机-二段式#

根据状态转移写状态机-二段式

https://www.nowcoder.com/practice/5b2ff27610d04993ae92374d51bfc2e6

`timescale 1ns/1ns

module fsm2(
	input wire clk  ,
	input wire rst  ,
	input wire data ,
	output reg flag
);

//*************code***********//
    localparam    S0 = 5'b0_0001;
    localparam    S1 = 5'b0_0010;
    localparam    S2 = 5'b0_0100;
    localparam    S3 = 5'b0_1000;
    localparam    S4 = 5'b1_0000;
    
    reg    [4:0]    cur_state;
    reg    [4:0]    nex_state;
    
    always@(posedge clk or negedge rst)
    begin
        if(!rst)
            cur_state <= S0;
        else
            cur_state <= nex_state;
    end
    
    always@(*)        //两段式状态机就是第二段的状态跳转以及输出是一起的,并且都是组合逻辑
    begin
        if(!rst)
            begin
                nex_state = S0;
                flag = 1'b0;
            end
        else
            begin
                case(cur_state)    //由状态转移图和波形图可以看到s4状态无论输入什么它都是直接跳转,只不过是跳转的状态不同而已,观察输出可知,其是在进入s4状态就输出1,和输入无关,并且是立马输出,之前的那个题是进入s3状态后要判断输入来进行输出,所以存在一个延时
                    S0    :    begin    //这个题中一进入s4状态就立马输出,也就是输出和输入无关,这个是一种状态机类型,其输出没有延时,所以在三段式状态机中也可以写,nex型对应s0和s1,其中s1需要判断当前状态,而cur型需要在s3时就判断,若是输入为1,则状态跳转,并且输出1,因为在s4状态时输出和输入无关,所以这个直接由状态来控制输出,就是说s4的状态控制输出
                            flag = 1'b0;
                            if(data)
                                nex_state = S1;
                            else
                                nex_state = S0;
                        end
                    S1    :    begin
                            flag = 1'b0;
                            if(data)
                                nex_state = S2;
                            else
                                nex_state = S1; 
                        end
                    S2    :    begin
                            flag = 1'b0;
                            if(data)
                                nex_state = S3;
                            else
                                nex_state = S2;
                        end
                    S3    :    begin
                            flag = 1'b0;
                            if(data)
                                nex_state = S4;
                            else
                                nex_state = S3;
                        end
                    S4    :    begin
                            if(data)
                                begin
                                    nex_state = S1;
                                    flag = 1'b1;
                                end
                            else
                                begin
                                    nex_state = S0;
                                    flag = 1'b1;
                                end
                        end
                    default    :    begin
                        nex_state = S0;
                        flag = 1'b0;
                    end
                endcase
            end
    end

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

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务