FPGA之状态机学习

news2024/10/5 17:21:03

        作为一名逻辑工程师,掌握和应用状态机设计是必不可少的。能够灵活的应用状态机是对逻辑工程师最基本的要求,状态机设计的好坏能够直接影响到设计系统的稳定性,所以学会状态机是非常的重要。

 1.状态机的概念

状态机通过不同的状态迁移来完成特定的逻辑操作。状态机主要内容包括以下几个方面:

(1)状态机是用来描述系统逻辑功能的一种方式;

(2)定义了系统所处的不同状态;

(3)描述了系统状态转化的条件及转换过程;

(4)刻画了系统状态和输入输出之间的关系。

状态机可以通过文字、状态转移图、状态转移表等方式进行描述,最后以Verilog或者VHDL进行程序编写,最后实现对应的电路逻辑功能。

举个简单的生活实例来对状态机的概念说明一下,例如我每天的生活为例,如表-1所示。

表-1

时间

对应的事件

7:00到7:30

起床洗漱

7:30到8:00

在家吃早饭

8:00到9:00

坐地铁去上班

9:00到12:00

在公司工作

12:00点到13:00

吃午饭、休息

13:00到18:00

在公司工作

18:00到19:00

坐地铁回家

19:00到21:00

在家看电视、玩游戏

21:30到22:00

洗漱

22:00以后

睡觉

如表-1所示,每一个时间段就相当于状态机中的一个状态,在每个对应的状态里,就做对应的事情,这就叫做状态机。在逻辑设计,逻辑工程师通过采用状态机的设计方法,能够将一个复杂的逻辑事件变得简单容易。

2.状态机的分类

状态机主要分为两种,一种是Mealy状态机,另一种是Moore状态机。A.Mealy状态机:时序逻辑的输出不但取决于状态还取决于输入,如图所示。

  B.Moore状态机:时序逻辑的输出仅仅取决于上一时刻的状态,而与当前时刻的输入无关,如图所示。

 在实际设计中,Mealy类型的状态机是用的最多的,Moore类型虽然清晰明了,但是状态太多,不适合大型状态机的设计。

3.状态机的设计步骤

状态机的设计步骤主要分为以下4个步骤:

A.逻辑抽象:得出状态转换图:就是把给出的一个实际问题表示为时序逻辑函数。可以用状态转换表来描述,也可以用状态转换图来描述。

B.状态化简:如果在状态转换图中出现这样两个状态:它们在相同的输入下转换到同一个状态中,并得到相同的输出,或称它们为等价状态。显然等价状态是重复的,可以合并为一个(电路的状态越少,存储电路也就越简单)。

C.状态分配:状态分配又称状态编码。通常有很多编码方法,编码方案选择得当,设计的电路简单,反之,选得不好,则设计的电路就会复杂许多;(binary_code/gray_code/one_hot_code/.ect)。

D.用逻辑描述语言进行行为描述建模(行为级)。

4.状态机的描述方式

状态机的描述方式有很多种,但是最常用的主要有3中,分别是一段式(always)、两段式(2 always)、三段式(3 always)。

A.单always块把组合逻辑和时序逻辑用同一个时序always块描述,其输出是寄存器输出,无毛刺;但是这种方式可能会产生多余的触发器,代码难于修改和调试,应该尽量避免使用。

B.双always块大多用于描述Mealy状态机和组合输出的Moore状态机。

时序always块描述当前状态逻辑,组合逻辑always块描述次态逻辑并给输出赋值。

这种方式结构清晰,综合后的面积和时间性能好。但组合逻辑输出往往会有毛刺,当输出向量作为时钟信号时,这些毛刺会对电路产生致命的影响。

C.三always块大多用于同步Mealy状态机。

两个时序always块分别用来描述现态逻辑和对输出赋值,组合always块用于产生下一状态。

时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息。

这种方式的状态机也是寄存器输出,输出无毛刺,并且代码比单always块清晰易读,但是面积大于双always块。随着芯片资源和速度的提高,目前这种方式得到了广泛应用。

5.举例

下面分别用三种状态机的描述方式实现流水灯的功能。A.一段式状态机实现流水灯功能

 一段式代码内容如下图所示:

在代码中,每当cnt_num计数到7时,led_out的亮灯的位置变化,state跳转,计数器清零,通过循环的方式实现流水灯的功能。

仿真结果: 

B.两段式状态机实现流水灯功能

  两段式的代码如下图所示:

  在两段式状态机的代码中,cnt_num计数器必须单独使用一个always,不能添加到两段式中;两段式的第一段必须是时序逻辑,实现将next_state赋值给current_state;第二段是组合逻辑,实现在当前的current_state下,当cnt_num等于7时,输出对应的led_out以及next_state。

 

 

仿真结果 

C.三段式状态机实现流水灯功能

  三段式状态机的代码如下图所示:

  第一段为时序逻辑,实现cuurent_state<=next_state;

  第二段为组合逻辑,根据跳转条件(cnt_num==3d7)实现next_state状态的跳转

   第三段为时序逻辑,在对应的状态中输出对应的led_out结果。

 仿真结果

 6. 三种FSM状态机比较

三种FSM描述方法比较

比较项目

一段式描述方法

两段式描述方法

三段式描述方法

推荐等级

不推荐

推荐

最优推荐

代码简洁程度

冗长

最简洁

简洁

always模块个数

1

2

3

是否利于时序约束

不利于

利于

利于

是否有组合逻辑输出

可以无组合逻辑输出

有组合逻辑输出

无组合逻辑输出

是否利于综合与布局布线

不利于

利于

利于

代码的可靠性与可维护性

最好

代码风格的规范性

低,任意度较大

格式化,规范

格式化,规范

7. 本章总结 

         使用状态机的描述方式来编写程序,能够将复杂的逻辑时序关系变得简单易懂,状态机是一种逻辑思想的体现。状态机的描述方式不只是本章节介绍的3中描述方式,只要能够将逻辑关系表述清楚的都可以认为是状态机。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1561479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络—TCP协议详解:特性、应用(1)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;マリンブルーの庭園—ずっと真夜中でいいのに。 0:34━━━━━━️&#x1f49f;──────── 3:34 &#x1f504; ◀️…

YOLOv8部署到C++上(综合版笔记)

这段时间由于项目的需要&#xff0c;需要将yolov8部署到C上以及跟相应的算法结合&#xff0c;花了我不少时间。 现阶段有考虑过使用onnx转Tensort&#xff0c;但是无法输出分类的结果&#xff0c;故放弃&#xff0c;有目标检测的小伙伴可以试试&#xff0c;接下来使用onnxrunt…

Qt打印系统库的日志 - QLoggingCategory

Qt的动态库通过源码可以可以看到含有大量的qCInfo 和 qCDebug 等大量的日志&#xff0c; 但是我们正常运行Qt程序&#xff0c;这些动态库或插件里面的日志是不会输出到我们的控制台里面的。 所以本章主要记录怎么输出这些日志出来。 一&#xff1a; 步骤 主要使用的是Qt的 函…

第十四届省赛大学B组(C/C++)岛屿个数

目录 题目链接&#xff1a;岛屿个数 解题思路&#xff1a; AC代码&#xff08;BFSDFS&#xff09;&#xff1a; 题目链接&#xff1a;岛屿个数 小蓝得到了一副大小为 MN 的格子地图&#xff0c;可以将其视作一个只包含字符 0&#xff08;代表海水&#xff09;和 1&#xff0…

机器人控制系统阶跃响应

机械臂控制系统的阶跃响应是指当给机械臂控制系统施加一个阶跃输入&#xff08;即输入量在短时间内从0跳变为某个定值&#xff09;时&#xff0c;机械臂的输出&#xff08;如位置、速度等&#xff09;随时间的变化情况。通过观察和分析阶跃响应&#xff0c;可以了解机械臂控制系…

Verilog语法之assign语句学习

assign语法主要是对组合逻辑的变量进行赋值的&#xff0c;就是把一个变量赋值给另一个变量&#xff0c;被复制的变量必须是wire类型的参数。 从仿真结果可以看出&#xff0c;data_in变量的值赋值给了data_out,assign语法就是赋值没有任何延迟&#xff0c;data_in是什么值&#…

OpenHarmony相机和媒体库-如何在ArkTS中调用相机拍照和录像。

介绍 此Demo展示如何在ArkTS中调用相机拍照和录像&#xff0c;以及如何使用媒体库接口进行媒体文件的增、删、改、查操作。 本示例用到了权限管理能力ohos.abilityAccessCtrl 相机模块能力接口ohos.multimedia.camera 图片处理接口ohos.multimedia.image 音视频相关媒体业…

蓝桥杯练习系统(算法训练)ALGO-962 积木大赛

资源限制 内存限制&#xff1a;128.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 THU幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦&#xff0c;大厦可以看成由n块宽度为1的…

使用IDEA中的 Find Usages

使用IDEA中的 Find Usages &#xff0c;能够查看某个方法、变量&#xff0c;在哪个地方进行了引用。 在上述的图片中&#xff0c;我选中了一个方法&#xff0c;右键选择 Find Usages &#xff0c;点击之后即可看到此方法&#xff0c;究竟被几个地方进行引用。

Prometheus+grafana环境搭建rabbitmq(docker+二进制两种方式安装)(二)

搭建完Prometheusgrafana基础环境后参见&#xff1a;Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客&#xff0c;对我本地的一些常用法人服务进行一个监控。基本都可以根据官方文档完成搭建&#xff0c;因为docker和二进制方式安装各有优缺点。 d…

【论文复现|智能算法改进】动态透镜成像学习人工兔优化算法及应用

目录 1.算法原理2.改进点3.结果展示4.参考文献 1.算法原理 【智能算法】人工兔优化算法&#xff08;ARO&#xff09;原理及实现 2.改进点 非线性递减能量因子&#xff1a; A ( t ) ( A max ⁡ − A min ⁡ ) ( 1 − sin ⁡ ( ( t T ) n π 2 ) (1) \begin{aligned}A\left…

【独立开发前线】Vol.33 Afineparent:一个育儿课程独立站,利基市场疯狂变现

今天要给大家分享的案例是Afineparent网站&#xff0c;这是一个育儿主题的网站。 网址是&#xff1a;AFineParent Academy – AFP Homepage - A Fine Parent 这个网站专注于教你怎么成为一个好父母&#xff0c;有针对育儿方面的内容和课程。这是一个非常垂直的市场&#xff0c…

内存泄漏检查工具下载(vld)

前言&#xff1a;在我们向内存申请动态空间的时候&#xff0c;如果使用完之后不将申请的空间释放&#xff0c;就会造成内存泄漏的情况&#xff0c;但是一般情况下&#xff0c;我们是无法通过运行代码来知道是否造成了内存泄漏&#xff0c;所以vld就成为了检查内存是否泄漏的好帮…

php——分享一种扁平数据转树形数据的递归写法

简单的列表请求&#xff1a; /*商品分类列表请求方式&#xff1a;get请求参数&#xff1a;无*/public function lists(){if(!$this->request->isGet())$this->error(请求失败&#xff0c;请使用get请求);$res db(type)->select();!$res? $this->error(请求失败…

Net8 ABP VNext完美集成FreeSql、SqlSugar,实现聚合根增删改查,完全去掉EFCore

没有基础的&#xff0c;请参考上一篇 彩蛋到最后一张图里找 参考链接 结果直接上图&#xff0c;没有任何业务代码 启动后&#xff0c;已经有了基本的CRUD功能&#xff0c;还扩展了批量删除&#xff0c;与动态查询 动态查询截图&#xff0c;支持分页&#xff0c;排序 实现原理…

ClamAV:Linux服务器杀毒扫描工具

Clam AntiVirus&#xff08;ClamAV&#xff09;是免费而且开放源代码的防毒软件&#xff0c;软件与病毒码的更新皆由社群免费发布。ClamAV在命令行下运行&#xff0c;它不将杀毒作为主要功能&#xff0c;默认只能查出系统内的病毒&#xff0c;但是无法清除。需要用户自行对病毒…

AcWing刷题-游戏

游戏 DP l lambda: [int(x) for x in input().split()]n l()[0] w [0] while len(w) < n:w l()s [0] * (n 1) for i in range(1, n 1): s[i] s[i - 1] w[i]f [[0] * (n 1) for _ in range(n 1)]for i in range(1, n 1): f[i][i] w[i]for length in range(2, …

记Kubernetes(k8s)初始化报错:“Error getting node“ err=“node \“k8s-master\“ not found“

记Kubernetes&#xff08;k8s&#xff09;初始化报错&#xff1a;"Error getting node" err"node \"k8s-master\" not found" 1、报错详情2、问题排查3、尝试问题解决 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#…

2003-2022年分国家、分行业、各省对外直接投资流量/存量/OFDI流量/OFDI存量(三份数据合集)

2003-2022年分国家、分行业、各省对外直接投资流量/存量/OFDI流量/OFDI存量 1、时间&#xff1a;更新至2022年&#xff0c;具体时间如下&#xff1a; 2003-2022年各省对外直接投资存量、省对外直接投资流量、省OFDI流量、省OFDI存量数据 2003-2022年中国对外直接投资流量、O…

halcon图像膨胀

1、原理&#xff1a; 使用结构元素在图像上移动&#xff0c;如果结构元素中有任意一个像素和图像上的非零像素重叠&#xff0c;则保留此时结构元素中心所在位置&#xff0c;并将其像素值设置为非零。 2、halcon代码 其中圆形结构元素可设置半径&#xff0c;矩形结构元素设置…