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

    文章

    1018

    浏览量

    83751
  • Verilog
    +关注

    关注

    28

    文章

    1351

    浏览量

    110105
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136855
  • 状态机
    +关注

    关注

    2

    文章

    492

    浏览量

    27541
收藏 人收藏

    评论

    相关推荐

    Verilog状态机+设计实例

    的是有限状态机(Finite-State Machine,FSM),简称为状态机表示在有限个状态以及这些状态之间的转移和动作等行为的数学模
    的头像 发表于 02-12 19:07 4153次阅读
    Verilog<b class='flag-5'>状态机</b>+设计实例

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

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

    FPGA/CPLD状态机稳定性研究

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

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

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

    有限状态机有什么类型

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

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

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

    状态机举例

    状态机举例 你可以指定状态寄存器和状态机状态。以下是一个有四种状态的普通状态机。 // Th
    发表于 03-28 15:18 987次阅读

    状态机原理及用法

    状态机原理及用法状态机原理及用法状态机原理及用法
    发表于 03-15 15:25 0次下载

    状态机概述 如何理解状态机

    本篇文章包括状态机的基本概述以及通过简单的实例理解状态机
    的头像 发表于 01-02 18:03 1w次阅读
    <b class='flag-5'>状态机</b>概述  如何理解<b class='flag-5'>状态机</b>

    为什么单片的主程序是死循环

    任何一个可用程序都必然是死循环程序,这不仅仅是指单片程序。因为任何微处理器系统一旦开机,系统都在处理内部事件和外设响应,这个过程是一个循环过程,除非关机才能结束这个死循环程序。因此,
    发表于 07-15 17:38 5367次阅读

    单片死循环有什么作用

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

    FPGA:状态机简述

    本文目录 前言 状态机简介 状态机分类 Mealy 型状态机 Moore 型状态机 状态机描述 一段式
    的头像 发表于 11-05 17:58 7405次阅读
    FPGA:<b class='flag-5'>状态机</b>简述

    什么是状态机状态机5要素

    玩单片还可以,各个外设也都会驱动,但是如果让你完整的写一套代码时,却无逻辑与框架可言。这说明编程还处于比较低的水平,你需要学会一种好的编程框架或者一种编程思想!比如模块化编程、状态机编程、分层思想
    的头像 发表于 07-27 11:23 2w次阅读
    什么是<b class='flag-5'>状态机</b>?<b class='flag-5'>状态机</b>5要素

    Verilog状态机类型

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

    什么是状态机状态机的种类与实现

    状态机,又称有限状态机(Finite State Machine,FSM)或米利状态机(Mealy Machine),是一种描述系统状态变化的模型。在芯片设计中,
    的头像 发表于 10-19 10:27 9581次阅读