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

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

3天内不再提示

使用枚举类型表示状态机进入死循环

冬至子 来源:芯光灿烂 作者:Tianya 2023-11-07 17:46 次阅读

在定义状态机中的状态时,除了可以使用宏(define)或者参数(parameter)声明定义外,还可以使用枚举类型,但是如果对于枚举类型使用不正确的话,极易出现编译仿真均没有报错,但是仿真时状态机跳转异常的情况.

本文将针对这种情况进行示例说明并给出解决方法.

1 数据类型

Verilog中所有的变量和线网都是4值数据类型,但在SystemVerilog中,对信号类型和数据类型进行了详细的区分,其中信号类型保持与Verilog一样,主要分为变量和线网类型,但是数据类型分为了2值类型(0和1)和4值类型(0,1,x和z),对信号的数据类型进行了扩展,但是保持了线网类型原有的数据类型,在默认状态下,4值数据类型的默认值为x,2值类型的默认值为0.同时SystemVerilog结合C语言的特性,引入了其他一些类型,例如枚举类型等,通过多种类型的引入,极大地丰富了SystemVerilog进行程序设计的灵活性.

图片

2 枚举类型

用户可以通过枚举类型定义特定的常量值的集合.

格式:

图片

使用方式如下:

图片

枚举常量代表该枚举类型的变量的可能取值的列表,编译系统为每个枚举常量指定一个数值,缺省状态下这个数值从0开始,且数据类型为int,即2值型的整型.

3 问题描述

对下述代码进行仿真时,状态跳转执行异常,核心代码如下:

图片

当上述状态机运行时,状态机将一直处于WAIT状态,状态执行异常.

4 问题分析

这里需要注意到,枚举常量列表中的枚举常量在缺省状态下,枚举常量的数值是从0开始递增.且2值数据类型变量的初始值为0.所以在此例中,state_e和nstate_e的初始状态都为0,即WAIT.当复位撤销后,state_e和nstate_e都为WAIT,那么组合逻辑部分always@(state_e)的敏感信号列表中的state_e将一直保持在WAIT状态,所以该部分组合逻辑将不会被执行,从而导致nstate_e状态不会被更新,因此,状态既不能推进,将一直保持在初始的WAIT状态.

5 解决方法

出现上述问题主要是因为代码中组合逻辑部分的敏感信号列表中的变量没有发生变化,从而没有出发进程的执行导致的,因此,解决方法主要是实现组合逻辑部分的有效执行,实现nstate_e的变化.

5.1 使用always_comb结构

always_comb在仿真开始的0时刻会自动调用一次,从而可以实现nstate_e状态的更新,将组合结构中的always@(state_e)替换为always_comb即可.

5.2 将枚举变量的数据类型指定为4值类型,如下所示:

图片

在仿真开始时,因为枚举类型的数据类型为logic型,所以变量state_e和nstate_e的默认状态都为x态,那么在复位阶段state_e被初始化为WAIT时,组合逻辑部分的always@(state_e

中的敏感信号state_e状态从x态变化到了WAIT,即状态发生变化,触发组合逻辑部分进程的执行,nstate_e会被更新为LOAD,从而可以实现状态机的推进.

5.3 指定枚举常量的初始值

枚举列表中的枚举常量列表中的第一个常量,默认初始值为0-,其后常量数值依次递增,但是这个起始值也可以在枚举类型声明定义时指定为其他值,从而可以使2值型枚举变量的初始状态-与枚举变量列表中的常量起始值不一样,在复位阶段state_e被更新为非零值时,更新后的值与类型的默认值0不一样,从而也可以实现组合逻辑部分敏感信号列表中信号的变化,从而使组合逻辑中的nstate_e状态可以被更新,推进状态机的运行,示例如下:

图片

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

    关注

    14

    文章

    988

    浏览量

    83002
  • Verilog
    +关注

    关注

    28

    文章

    1327

    浏览量

    109319
  • C语言
    +关注

    关注

    180

    文章

    7534

    浏览量

    129013
  • 状态机
    +关注

    关注

    2

    文章

    486

    浏览量

    27188
收藏 人收藏

    评论

    相关推荐

    labview状态机基本类型顺序结构

    ,依然要判断急停,直到所有的FRAME都完成才能退出,在这个过程中,外层循环需要所有动作完成后才执行下一循环,对它改造一下,就可以形成顺序状态机结构.我曾经提到过,严格类型
    发表于 11-29 16:55

    LabVIEW程序设计模式研究和探讨(四)—状态机和事件结构结合

    问题  状态机模式的基本构成元素是while循环和case结构,而事件结构模式的基本构成元素是while循环和event结构,因此新的模式应该由while循环、case结构和event
    发表于 12-27 11:01

    FPGA/CPLD状态机稳定性研究

    Mealy状态机而言,由于其任何时刻的输出与输入有关,这种情况就更常见了.2 状态机设计方案比较2.1 采用枚举数据类型定义状态值在设计中定
    发表于 01-12 10:48

    状态机

    控制状态机控制状态机的初始化和状态转换的最佳方法是使用枚丽型输入控件。一般使用自定义类型的枚丽变量。使用子定义类型的枚丽变量可以是控件和实例
    发表于 02-13 12:39

    状态机 枚举类型的连接问题

    图为只连接选择空间一端当两端都连接枚举时就自动变成这样了
    发表于 05-13 20:44

    LabVIEW状态机模型可以带有多个循环吗?

    请问一下,LabVIEW状态机模型可以带有多个循环吗?一般的状态机例子都是一个循环和一个事件结构,以相应界面操作,我想要一种效果,除了主循环
    发表于 12-09 23:04

    简单的状态机枚举相结合的程序

    做的一个简单的状态机枚举相结合的程序,挺简单的。
    发表于 08-15 08:06

    labVIEW状态机在实战中的应用(基础)

    问题:1.一个While循环+事件结构 组成的状态机(最简单的)2.一个Whie循环+用户事件+事件结构3.队列消息+while循环+事件结构 组成的
    发表于 12-25 16:53

    LabVIEW事件状态机

    后右键的复制方式创建每个新分支,少出现连线的差错,同时也可以在每条线上备注用于区分。这种用到事件状态机比较合适用于传输每次状态下共享的或者改变的事件,数据以流的形式在每个状态传递。控制每个状态
    发表于 07-06 14:31

    有限状态机有什么类型

    在实际的应用中,根据有限状态机是否使用输入信号,设计人员经常将其分为Moore型有限状态机和Mealy型有限状态机两种类型
    发表于 04-06 09:00

    关于在状态机中使用选项卡的问题

    我想在状态机自动切换状态的前提下加入一个选项卡 让选项卡能够自动切换到状态机相应状态下的界面 然后我试过局部变量等方法 都是卡在这个枚举不同
    发表于 03-16 20:24

    状态机是什么?什么是消息触发类型状态机

    状态机可归纳为哪几个要素?状态机可分为哪几种?什么是消息触发类型状态机
    发表于 04-19 06:02

    什么是状态机状态机是如何编程的?

    什么是状态机状态机是如何编程的?
    发表于 10-20 07:43

    单片机的死循环有什么作用

    单片机是可编程器件,在使用时需要编写满足需求的程序。其C语言程序在各个端口、配置初始化完成后,会进入一个死循环,一般用while(1){;}的形式。初始化完成后,单片机就在死循环内一遍又一遍的执行程序逻辑。复位后,就从头开始,初
    发表于 08-09 17:01 5189次阅读
    单片机的<b class='flag-5'>死循环</b>有什么作用

    Verilog状态机类型

    有限状态机(Finite-State Machine,FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
    的头像 发表于 06-01 15:23 1328次阅读
    Verilog<b class='flag-5'>状态机</b>的<b class='flag-5'>类型</b>