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

简析

状态机可以分为Moore状态机和Mealy状态机。

  • Moore状态机:输出只由当前状态决定
  • Mealy状态机:输出由当前状态和当前的输入共同决定。

三段式状态机是指当前状态切换、次态切换和输出更新分别由不同的块控制。
本题是一个Mealy状态机。在所有状态下,当输入data==0时,次态不变;当输入data==1时,次态顺序切换。

`timescale 1ns/1ns

module fsm1(
	input wire clk  ,
	input wire rst  ,
	input wire data ,
	output reg flag
);
//*************code***********//
    parameter S0=0, S1=1, S2=2, S3=3;
    reg [1:0] state, nstate;
    
    //当前状态切换
    always@(posedge clk or negedge rst) begin
        if(~rst)
            state <= S0;
        else
            state <= nstate;
    end
    
    //次态切换
   always@* begin
        if(~rst)
            nstate = S0;
        else
            case(state)
                S0     : nstate = data? S1: S0;
                S1     : nstate = data? S2: S1;
                S2     : nstate = data? S3: S2;
                S3     : nstate = data? S0: S3;
                default: nstate = S0;
            endcase
    end

  	//输出更新
    always@(posedge clk or negedge rst) begin
        if(~rst)
            flag <= 0;
        else
            case(state)
                S0     : flag <= 0;
                S1     : flag <= 0;
                S2     : flag <= 0;
                S3     : flag <= data;
                default: flag <= 0;
            endcase
    end
//*************code***********//
endmodule
Verilog篇题解 文章被收录于专栏

本人对牛客网verilog篇题目一些理解

全部评论
能不能把次态切换的<=改成=呢?其他都不变。比如【nstate <= data? S1: S0;】变为【nstate = data? S1: S0;】
点赞 回复 分享
发布于 2023-02-15 18:09 江苏
清晰明了的写法
点赞 回复 分享
发布于 2022-08-30 10:21 四川

相关推荐

点赞 评论 收藏
分享
评论
7
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务