0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

三段式状态机编写问题及三段式状态机各部分功能分析

冬至子 来源:Bug记录 作者:woodfan 2023-06-20 10:35 次阅读

Verilog的江湖里,流传着一段,两段,三段式状态机的传说。它们各有优劣,本文就书写三段式状态机的错误原因进行探寻。

本文会涉及到Verilog的基本语法,需要一定的Verilog基础,包括对reg,always,状态机的一些认识,数字电路基础。

三段式状态机,将状态机分为三段,功能为状态转移,状态转移条件判断,输出逻辑等。

存在问题的“三段式状态机”代码如下:

1.jpg

程序比较简单,于是直接上板验证。

经过上板调试,发现问题存在于当empty为低时,rd_en并没有拉高。于是,我首先怀疑整个系统是不是一直处于复位状态。

经过查找,发现rst一直保持低电平,整个程序不在复位状态。这就很神奇了。

后来,经过提醒和仔细查找原因,才发现这个状态机写的其实存在问题。状态转移条件判断和状态转移都使用时序逻辑,两者并行运行,问题就凸显出来了。

举例说明,假设当前状态statenext_state都处于IDLE状态;

1.jpg

事实上,这么写,造成的问题是state相对其他信号可能会晚一节拍。状态机晚一节拍,可能会导致时序错乱。

而事实上,三段式状态机当然不是这么写的。

首先,三段式状态机由三部分(段)组成,前面也提到了,是状态转移,状态转移条件判断,输出逻辑等。

首先谈到状态转移,三段式状态机有state, next_state信号作为指示。两者在位宽,信号类型上一模一样,都是reg型变量。

状态转移很简单,大致如下:

1.jpg

其中,IDLE是预先定义的常量,使用localparamparameter定义即可,或者可以使用`define定义宏变量参数,然后放在一个通用的参数模块文件里,供项目里所有文件调用,后续再详细讲解这块吧。

这块的内容,仅仅是将next_state的值打一拍,通过了一个寄存器,意义何在呢,要结合状态转移条件判断一起看。

状态转移条件判断代码大致如下:

1.jpg

这块的内容主要是做next_state值变更的条件判断,结合功能来说,就是做状态值的更新。

那可能有人会问:

  • always @ (*) 是什么意思

简单来说,always @ ( ) 意为每时每刻都在运行,也就是组合逻辑,你也可以使用always @ (state, a, b)方式来代替always @ ( )。但是,假如always列表里的信号不全,可能造成的影响又是什么呢?

  • reg类型为什么放在组合逻辑里面做

reg型变量最后综合的电路也可能是组合逻辑,也不是说always块一定综合出时序逻辑,主要还是跟敏感列表有关,其次always里只能使用reg型变量

  • 为什么你的if没有补全else

对于时序逻辑来说,没有补全else,default等不会生成锁存器;对于组合逻辑来说,没有else,default确实可能生成锁存器,但是锁存器生成的原因是因为设计代码中要求组合逻辑去保持或者说记忆住某个值,这本该是时序逻辑该干的事,组合逻辑干不了,所以生成锁存器;而本段代码,第一行代码就相当于已经为所有无法进入if条件的情况增加了默认情况,就是赋值为state的状态。

这两块内容都跟状态转移有关,第二块进行条件判断,而判断不仅要根据外部信号,也要根据自身所在的状态,所以第一块进行状态值的更新。

那么这么做的好处是什么呢?跟一段式状态机相比,将状态转移与判断和输出逻辑分开写,方便后续的调试。

因为在调试阶段,查找问题时会去查找问题所在的状态,然后再比对代码中该状态的判断条件,没有错误再比对该条件下问题信号的输出逻辑,调试更为方便。

那么第三段的输出逻辑,代码大致如下:

1.jpg

首先,输出逻辑这段并不是要求只用一个always写完所有的输出逻辑;其次,使用时序逻辑输出,更利于信号的时序分析和时序收敛。

当然,一段式状态机也并不是一无是处,很多时候,在一些逻辑简单,功能简单的场景下,我也愿意使用一段式状态机。两段式状态机用的比较少,感觉像是一段式和三段式状态机的过渡状态,有点鸡肋的感觉。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 锁存器
    +关注

    关注

    8

    文章

    904

    浏览量

    41434
  • 时序逻辑电路

    关注

    2

    文章

    94

    浏览量

    16525
  • 状态机
    +关注

    关注

    2

    文章

    492

    浏览量

    27465
  • Verilog语言
    +关注

    关注

    0

    文章

    113

    浏览量

    8209
收藏 人收藏

    评论

    相关推荐

    普通三段式充电原理

    普通三段式充电原理   普通三段式铅酸蓄电池充电器,充电过程如下: ① 恒流充电阶段,充电器充电电流保持恒定,充入
    发表于 11-16 14:24 2.8w次阅读

    【Z-turn Board试用体验】有限状态机三段式描述方法(转载)

    ;(2)二段式:用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述
    发表于 05-25 20:33

    彻底搞懂状态机(一段式、两段式三段式)!一个实例,种方法对比看!!!(程序)

    三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器,然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件。
    发表于 06-27 22:13

    关于三段式状态机的疑惑,希望有人来为我解答。(新手求罩)

    本人在学习verilog 与状态机时发现有如下疑惑,希望有人能为我解答。如下,是一部分三段式状态机的代码:always@(posedge clk or negedge rst_n)be
    发表于 11-21 10:57

    三段式过电流保护的模型

    我通过SIMULINK建立三段式过电流保护的模型,如下所示,但是仿真难结果不对,请大神指点一下哪里错了。
    发表于 06-30 17:23

    Verilog三段式状态机描述及模版

    个always完成。三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器, 然后直接在每个次态的case分支中描述该状态
    发表于 07-03 10:13

    Verilog三段式状态机描述及模版

    个always完成。三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器, 然后直接在每个次态的case分支中描述该状态
    发表于 07-09 01:55

    三段式和四段式耳机的引脚定义

      耳机插座在我们日常生活中是比较常见的一种电子元件,其耳机插座的类型规格也区分有四段式耳机插座、三段式耳机插座等。三段式和四段式耳机的引脚定义如下:    四
    发表于 12-25 15:26

    Verilog三段式状态机描述(转载)

    时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息。 状态机采用VerilogHDL语言编码,建议分为
    发表于 02-09 09:42 1117次阅读

    关于使用FPGA三段式状态机点好处,你有什么看法?

    三段式描述状态机的好处,国内外各位大牛都已经说的很多了,大致可归为以下点:
    发表于 08-17 11:43 1.6w次阅读
    关于使用FPGA<b class='flag-5'>三段式</b><b class='flag-5'>状态机</b>的<b class='flag-5'>三</b>点好处,你有什么看法?

    基于FPGA实现状态机的设计

    状态机种描述方式:一段式状态机、两段式状态机三段式
    的头像 发表于 08-29 06:09 2803次阅读
    基于FPGA实现<b class='flag-5'>状态机</b>的设计

    三段式充电器的主要参数有哪些

    下面以36V/lOAh蓄电池所用的三段式充电器为例,说明三段式充电器的主要参数。
    发表于 04-05 16:49 5716次阅读
    <b class='flag-5'>三段式</b>充电器的主要参数有哪些

    FPGA三段式描述状态机的好处

    先谈谈第二点关于思维习惯。我发现有些人会有这样一种习惯,先用一段式状态机实现功能,仿真ok后,再将其转成三段式,他们对这种开发方式的解释是一段式
    发表于 07-14 14:59 1428次阅读

    状态机的一段式、二段式三段式的区别

    本篇文章描述状态机的一段式、二段式三段式区别.
    的头像 发表于 08-21 09:25 8027次阅读
    <b class='flag-5'>状态机</b>的一<b class='flag-5'>段式</b>、二<b class='flag-5'>段式</b>、<b class='flag-5'>三段式</b>的区别

    三段式距离保护和三段式电流保护原理是相同的,它们有哪些区别?

    上也有着相似之处。但是它们在实际应用中存在一些差异,下面我们将逐一分析它们的区别。 一、基本原理: 1. 三段式距离保护 三段式距离保护是一种基于测量线路电压和电流来进行保护的保护方式,其原理基于开路电压的测量。当
    的头像 发表于 09-18 09:57 5174次阅读