状态机详解(一段式、二段式、三段式)

article/2025/9/19 23:57:02

一、有限状态机FSM(Finite State Machine)

  • 组成元素

        输入、状态、状态转移条件、输出。

  • 可以分为两类

        Mealy状态机:时序逻辑的输出不仅取决于当前状态,还与输入有关;

        Moore状态机:时序逻辑的输出只与当前状态有关。

  • 描述方式

        ① 状态转移图:设计分析时使用,工具自动翻译的代码效率不高,适合规模小的设计;对于大规模设计,HDL更好;

        ② 状态转移表;

        ③ HDL描述。

  • 设计步骤

        ① 逻辑抽象,得到状态转移图:确定输入、输出、状态变量、画状态转移图;

        ② 状态简化,得到最简的状态转移图:合并等价状态(它们的输入相同,转换到的次态和输出也相同的两个或两个以上的状态);

        ③ 状态编码:binary、gray、one-hot编码方式;

        ④ 用HDL描述。

二、Coding Style

  • 一段式

        只有一个always block,把所有的逻辑(输入、输出、状态)都在一个always block的时序逻辑中实现。这种写法看起来很简洁,但是不利于维护,如果状态复杂一些就很容易出错,不推荐这种方法

        在简单的状态机可以使用。

  • 二段式

        有两个always block,把时序逻辑和组合逻辑分隔开来。时序逻辑里进行当前状态和下一状态的切换,组合逻辑实现各个输入、输出以及状态判断。这种写法不仅便于阅读、理解、维护,而且利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。在两段式描述中,当前状态的输出用组合逻辑实现,可能存在竞争和冒险,产生毛刺

        要求对状态机的输出用寄存器打一拍,但很多情况不允许插入寄存器节拍,此时使用三段式描述。其优势在于能够根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而不需要额外插入时钟节拍。

  • 三段式

        有三个always block,一个时序逻辑采用同步时序的方式描述状态转移,一个采用组合逻辑的方式判断状态转移条件、描述状态转移规律,第三个模块使用同步时序的方式描述每个状态的输出。代码容易维护,时序逻辑的输出解决了两段式组合逻辑的毛刺问题,但是从资源消耗的角度上看,三段式的资源消耗多一些。

        模板如下:

always @ ( posedge clk or negedge rst_n ) begin  if ( !rst_n )  CS <= IDLE;  else  CS <= NS;  end  always @*  begin  NS = 'b0;                   //初始化寄存器,避免生成latch  case (CS)                   //注意为CS  IDLE: begin  end;  S1: begin  end;  default:  NS = 'b0;           //与硬件电路一致  endcase  end  always @ (posedge clk or negedge rst_n) begin  if(!rst_n) begin  end  else begin case (CS/NS)        //这里有2种写法,推荐NS写法(moore型写法) ...  default: ;  endcase  end  end  

下面,举例说明:

        状态转换图如下所示:

  • 一段式:
    //时序逻辑电路always @(posedge clk or negedge rst_n)beginif(!rst_n)begincstate <= IDLE;cmd <= 3'b000;endelsecase(cstate)IDLE:if(wr_req)begincstate <= WR_S1;cmd <= 3'b001;endelse if(rd_req)begincstate <= RD_S1;cmd <= 3'b011;endelse begincstate <= IDLE;cmd <= 3'b000;endWR_S1:	begincstate <= WR_S2;cmd <= 3'b010;endWR_S2:	begincstate <= IDLE;cmd <= 3'b000;endRD_S1:if(wr_req)begincstate <= WR_S2;cmd <= 3'b010;endelse begincstate <= RD_S2;cmd <= 3'b100;endRD_S2:if(wr_req) begincstate <= WR_S1;cmd <= 3'b001;endelse begincstate <= IDLE;cmd <= 3'b000;enddefault:cstate <= IDLE;endcaseend

testbench如下: 

`timescale 1 ns/ 100 psmodule fsm1_vlg_tst();reg clk;reg rd_req;reg rst_n;reg wr_req;                                             wire [2:0]  cmd;wire [2:0]  cstate;fsm1 i1 (   .clk(clk),.cmd(cmd),.cstate(cstate),.rd_req(rd_req),.rst_n(rst_n),.wr_req(wr_req));always #10 clk = ~clk;initial                                                beginclk = 0;rst_n = 1;wr_req = 0;rd_req = 0;#2 rst_n = 0;#10 rst_n = 1;repeat(100)begin#20 wr_req = {$random}%2;rd_req = {$random}%2;end#100 $stop;end                                                    endmodule

功能仿真波形图:

 三段式:

always block①:时序逻辑

//1st always block, sequential logic, store current state
always @(posedge clk or negedge rst_n)if(!rst_n)cstate <= IDLE;elsecstate <= nstate;

always block②:组合逻辑 

//2nd always block, combinational logic, decide next state
always @(cstate or wr_req or rd_req)beginnstate = 3'b0;case(cstate)IDLE:if(wr_req)nstate = WR_S1;else if(rd_req)nstate = RD_S1;elsenstate = IDLE;WR_S1:nstate = WR_S2;WR_S2:nstate = IDLE;RD_S1:if(wr_req)nstate = WR_S2;elsenstate = RD_S2;RD_S2:if(wr_req)nstate = WR_S1;elsenstate = IDLE;default:nstate = 3'b0;endcaseend
  •  注意

        always @(敏感电平信号)需要列举完全,可以用“@*”或者“@(*)”代替;

       初始值设置避免组合逻辑条件不全生成latch,但不一定符合设计。

        case(表达式)中的表达式为“cstate”,即现态

        阻塞赋值“=”;

        default项必须设置,与实际电路一致。

always block③:时序逻辑 

//3rd always block, FSM sequential output

  • Mealy型写法
always @(posedge clk or negedge rst_n)if(!rst_n)cmd <= 3'b000;elsecase(cstate)IDLE:if(wr_req)cmd <= 3'b001;else if(rd_req)cmd <= 3'b011;elsecmd <= 3'b000;WR_S1:cmd <= 3'b010;WR_S2:cmd <= 3'b000;RD_S1:if(wr_req)cmd <= 3'b010;elsecmd <= 3'b100;RD_S2:if(wr_req)cmd <= 3'b001;elsecmd <= 3'b000;default:;endcase
  • 注意

        case(表达式)中的表达式为“cstate”,即现态

        非阻塞赋值“<=”; 

        default项必须设置。

  • Moore型写法
always @(posedge clk or negedge rst_n)if(!rst_n)cmd <= 3'b000;elsecase(nstate)IDLE:	cmd <= 3'b000;WR_S1:	cmd <= 3'b001;WR_S2:	cmd <= 3'b010;RD_S1:	cmd <= 3'b011;RD_S2:	cmd <= 3'b100;default:;endcaseendmodule
  • 注意

        case(表达式)中的表达式为“nstate”,即次态,这里使用nextstate和state的区别在于,当状态跳转时,基于nextstate的输   出是立刻变化的,而基于state输出会延迟一个周期,其他情况都一样,应该根据自己的时序要求,选择用nextstate还是state。

        非阻塞赋值“<=”; 

        default项必须设置。

参考状态机详解,以及三段式状态机的思维陷阱。


http://chatgpt.dhexx.cn/article/B6yIWaOk.shtml

相关文章

三段式状态机理解浅析

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/weixin_43070186/article/details/82085463 关于FSM的写法按照always块的个数来划分可以分为一段式…

彻底搞懂状态机(一段式、两段式、三段式)

转自&#xff1a;https://blog.csdn.net/wordwarwordwar/article/details/78509445 实例&#xff1a;FSM实现10010串的检测 状态转移图&#xff1a;初始状态S0&#xff0c;a 0,z 0.如果检测到1&#xff0c;跳转到S1。 下一状态S1&#xff0c;a 1,z 0.如果检测到0&#xff…

Verilog:三段式状态机(数字钟)

状态机在FPGA的设计中是至关重要的&#xff0c;使用的频率也很高&#xff0c;废话不多说在这里介绍一下三段式状态机如何设计。 设计状态机首先要清楚状态有几种&#xff0c;状态转移图是怎样的&#xff0c;各个状态的输出是怎样的。了解了这三样之后就可以开始设计实验所需要的…

三段式有限状态机

一段式、二段式、三段式状态机是按照书写FSM时使用的always块数目进行划分的&#xff0c;一般而言对于简单的状态机&#xff0c;可以使用一段式&#xff0c;其代码量以及使用资源都最少&#xff0c;但如果状态机较复杂&#xff0c;一段式状态机会对代码维护产生很大的不便&…

状态机,从细节出发(一段式、两段式、三段式,moore型、mealy型)

目录 前言 一、状态机要素 二、状态机描述方法 1、一段式描述方法 2、两段式描述方法 3、三段式描述方法 三、关系 1、一段式与三段式 2、两段式与三段式 3、三种FSM描述方法比较表 四、状态机的种类 1、Moore型状态机 2、Mealy型状态机 3、注意点 五、举例 1、…

时间复杂度与空间复杂度分析(递归与非递归比较)

时间复杂度&#xff1a; 一般情况下&#xff0c;算法中基本操作重复的次数就是问题规模n的某个函数f&#xff08;n&#xff09;&#xff0c;进而分析f&#xff08;n&#xff09;随n的变化情况并确定T&#xff08;n&#xff09;的数量级。这里用‘o’来表示数量级&#xff0c;给…

数据结构:时间复杂度空间复杂度(递归)

转载文章 时间复杂度&#xff1a; 一般情况下&#xff0c;算法中基本操作重复执行的次数是问题规模n的某个函数f(n)&#xff0c;进而分析f(n)随n的变化情况并确定T(n)的数量级。这里用"O"来表示数量级&#xff0c;给出算法的时间复杂度。 T(n)O(f(n)); 它表示随着问…

递归理解以及时间复杂度计算

一.复杂度分析&#xff1a; 可以理解为递归的深度就是空间复杂度&#xff0c;时间复杂度就是O(T*depth),其中&#xff34;是每个递归函数的时间复杂度&#xff0c;depth是递归深度&#xff0e; #空间复杂度O(1) def sum1_(n):res 0for i in range(n1):resireturn res#递归 空…

递归的时间与空间复杂度

一、 递归的时间复杂度 递归算法的时间复杂度 递归次数 \times 每次递归的时间复杂度。 递归次数&#xff1a;可以通过画递归树&#xff0c;数递归树的节点数&#xff0c;得到递归次数。 二、递归的空间复杂度 递归算法的空间复杂度 递归深度 \times 每次入栈的空间…

【转】Tomcat相关面试题,看这一篇就够了!

转自公众号&#xff1a;Java思维导图 Tomcat相关的面试题出场的几率并不高&#xff0c;正是因为如此&#xff0c;很多人忽略了对Tomcat相关技能的掌握。下面这篇文章整理了Tocmat相关的系统架构&#xff0c;介绍了Server、Service、Connector、Container之间的关系&#xff0c…

10道Mybatis经典面试题,赶快上车吧!⚡⚡⚡⚡

1.Mybatis中#{}和${}的区别是什么&#xff1f; 1.1 #{}方式能够很大程度防止sql注入&#xff08;安全&#xff09;&#xff1b; ${}方式无法防止Sql注入。 1.2 在JDBC能使用占位符的地方&#xff0c;最好优先使用#{}&#xff1b; 在JDBC不支持使用占位符的地方&#xff0c;就…

mybatis面试题 一

一、MyBatis工作原理&#xff1f; 1、 创建SqlSessionFactory 2、 通过SqlSessionFactory创建SqlSession 3、 通过sqlsession执行数据库操作 4、 调用session.commit()提交事务 5、 调用session.close()关闭会话 1&#xff09;读取 MyBatis 配置文件&#xff1a;mybatis-c…

Java面试题Tomcat的优化经验

来源&#xff1a;传智论坛 Tomcat作为Web服务器&#xff0c;它的处理性能直接关系到用户体验&#xff0c;下面是几种常见的优化措施&#xff1a; 一、掉对web.xml的监视&#xff0c;把jsp提前编辑成Servlet。有富余物理内存的情况&#xff0c;加大tomcat使用的jvm的内存 二、服…

Tomcat相关面试题,看这篇就够了!保证能让面试官颤抖!

Tomcat相关的面试题出场的几率并不高&#xff0c;正式因为如此&#xff0c;很多人忽略了对Tomcat相关技能的掌握&#xff0c;下面这一篇文章最早发布在知识星球&#xff0c;整理了Tomcat相关的系统架构&#xff0c;介绍了Server、Service、Connector、Container之间的关系&…

【Tomcat专题】简单认识一下Tomcat总体架构

文章目录 什么是Tomcat&#xff1f;Tomcat的主要工作Tomcat总体架构连接器容器 请求定位流程 什么是Tomcat&#xff1f; 在Tomcat官方网站上是这样介绍的。 The Apache Tomcat software is an open source implementation of the Jakarta Servlet, Jakarta Server Pages, Jaka…

四张图带你了解Tomcat系统架构--让面试官颤抖的Tomcat回答系列!

俗话说&#xff0c;站在巨人的肩膀上看世界&#xff0c;一般学习的时候也是先总览一下整体&#xff0c;然后逐个部分个个击破&#xff0c;最后形成思路&#xff0c;了解具体细节&#xff0c;Tomcat的结构很复杂&#xff0c;但是 Tomcat 非常的模块化&#xff0c;找到了 Tomcat最…

Tomcat常见面试题

1、tomcat有哪些组件&#xff1f; 2、tomcat有哪些Connector&#xff1f; http ajp 3、tomcat的Valve的作用是什么&#xff1f; 给每一个虚拟主机定义访问日志 4、servlet的生命周期&#xff1f; Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过…

【金三银四】Tomcat面试题(2021最新版)

目录 前言 1、Tomcat的缺省端口是多少&#xff0c;怎么修改&#xff1f; 2、tomcat 有哪几种Connector 运行模式(优化)&#xff1f; 3、Tomcat有几种部署方式&#xff1f; 4、tomcat容器是如何创建servlet类实例&#xff1f;用到了什么原理&#xff1f; 5.tomcat 如何优化…

Tomcat面试题(2020最新版)

文章目录 Tomcat是什么&#xff1f;Tomcat的缺省端口是多少&#xff0c;怎么修改tomcat 有哪几种Connector 运行模式(优化)&#xff1f;Tomcat有几种部署方式&#xff1f;tomcat容器是如何创建servlet类实例&#xff1f;用到了什么原理&#xff1f;Tomcat工作模式Tomcat顶层架构…

「面试必背」Tomcat面试题(收藏)

「面试必背」Tomcat面试题&#xff08;建议收藏&#xff09; 2022-04-27 16:31java柚子茶 前言 在工作中&#xff0c;作为 Java 开发的程序员&#xff0c;Tomcat 服务器是大家常用的&#xff0c;也是很多公司现在正在用的。但是&#xff0c;在系统并发量比较大的情况下&…