FPGA之状态机学习

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

 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.rhkb.cn/news/293868.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java封装最佳实践:打造高内聚、低耦合的优雅代码~

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章专栏&#xff1a;javaSE的修炼之路 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、封装 1.1 封装的概念 面向对象程序三大…

从0到1利用express搭建后端服务

目录 1 架构的选择2 环境搭建3 安装express4 创建启动文件5 express的核心功能6 加入日志记录功能7 日志记录的好处本节代码总结 不知不觉学习低代码已经进入第四个年头了&#xff0c;既然低代码很好&#xff0c;为什么突然又自己架构起后端了呢&#xff1f;我有一句话叫低代码…

【数据结构】优先级队列——堆

&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;个人主页&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; &#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;数据结构专栏&#x1f388;&#x1f388;&#x1f388;&…

数码管时钟--LABVIEW编程

一、程序的前面板 1.获取系统时钟&#xff0c;年月日&#xff0c;时分秒&#xff0c;用14个数码管显示。 2.闹钟设定小时和分钟。 二、程序的后面板 三、程序运行图 四、程序源码 源程序可以在百度网盘自行下载&#xff0c;地址链接见下方。 链接&#xff1a;https://pan.b…

开源,微信小程序-超级计算器T3000 简介

笔者于四年前自学微信小程序开发&#xff0c;这个超级计算器T3000就是当时的练习作品。超级计算器T3000的功能有很多&#xff0c;其中的核心技术是矩阵计算&#xff0c;使用的工具库是math.js&#xff0c;其次是复杂运算和分式运算。关于math.js的使用&#xff0c;可以参考另一…

如何在极狐GitLab 配置 邮件功能

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了在极狐GitLab 用户…

图片标注编辑平台搭建系列教程(4)——fabric几何定制渲染

背景 标注的几何&#xff0c;有时需要一些定制化的渲染样式&#xff0c;例如&#xff0c;线中间展示箭头&#xff0c;表示方向。本期教程教大家如何实现fabric几何定制化渲染。 带箭头的线 fabric提供了一些原生的几何&#xff0c;例如Point、Polyline、Polygon。同时提供了…

LangChain入门:2.OpenAPI调用ChatGPT模型

引言 在本文中&#xff0c;我们将带您深入探索如何通过OpenAPI与ChatGPT模型进行高效交互&#xff0c;实现智能文本问答功能。通过LangChain库的实践&#xff0c;您将学习构建一个能够与用户进行自然语言对话的系统的关键步骤。 准备步骤 在动手编码之前&#xff0c;请确保您…

Collection与数据结构链表与LinkedList(三):链表精选OJ例题(下)

1. 分割链表 OJ链接 class Solution {public ListNode partition(ListNode head, int x) {if(head null){return null;//空链表的情况}ListNode cur head;ListNode formerhead null;ListNode formerend null;ListNode latterhead null;ListNode latterend null;//定义…

Beans模块之工厂模块DisposableBean

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

宝塔面板操作一个服务器域名部署多个网站

此处记录IP一样&#xff0c;端口不一样的操作方式&#xff1a; 宝塔面板操作&#xff1a; 1、创建第一个网站&#xff1a; 网站名用IP地址&#xff0c;默认80端口。 创建好后&#xff0c;直接IP访问就可以了。看到自带的默认首页 2、接下来部署第二个网站&#xff1a; 仍然是…

docker-compose mysql

使用docker-compose 部署 MySQL&#xff08;所有版本通用&#xff09; 一、拉取MySQL镜像 我这里使用的是MySQL8.0.18&#xff0c;可以自行选择需要的版本。 docker pull mysql:8.0.18二、创建挂载目录 mkdir -p /data/mysql8/log mkdir -p /data/mysql8/data mkdir -p /dat…

IC-随便记

1、移远通信---通信模组 物联网解决方案供应商&#xff0c;可提供完备的IoT产品和服务&#xff0c;涵盖蜂窝模组(5G/4G/3G/2G/LPWA)、车载前装模组、智能模组&#xff08;5G/4G/边缘计算&#xff09;、短距离通信模组(Wi-Fi&BT)、GNSS定位模组、卫星通信模组、天线等硬件产…

阿里云CentOS7安装MySQL8

创建目录 [rootnode1 ~]# mkdir /usr/local/mysql [rootnode1 ~]# cd /usr/local/mysql/ 下载安装包 到MySQL官网查看需要下载的版本&#xff0c;并获取到下载地址 https://downloads.mysql.com/archives/community/下载 [rootnode1 mysql]# wget https://downloads.mysql…

Linux - 第三节

改变用户类型 su 仅单纯的进行身份变化 依旧处于普通用户里面 su - 进行重新登录更改身份 退出用exit / ctrld su 用户名 改成成其他身份 对一条命令进行提权 sudo command r:可读 w:可写 x:可执行 -:对应的权限位置&#xff0c;没有权限 去掉所有权限 chmod u…

java日志技术——Logback日志框架安装及概述

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! 日志 什么是日志 程序中的日志&#xff0c;通常就是一个文件&#xff0c;里面记录的是程序运行过程中的各种信息&#xff0c;通过日志可以进行操作分析&#xff0c;bug定位等 记录日志的方案 程…

嵌入式系统基础知识(一):嵌入式系统是什么?

一.定义 根据IEEE&#xff08;国际电气和电子工程师协会&#xff09;的定义&#xff0c;嵌入式系统是“控制、监视或者辅助设备、机器和车间运行的装置”。这主要是从应用上加以定义的&#xff0c;从中可看出嵌入式系统是软件和硬件的综合体&#xff0c;还可以涵盖机械等附属装…

云渲染实用工具:3ds max怎么改低版本?

3ds Max是建模领域广泛采用的专业软件&#xff0c;它通过定期更新来不断增强功能和提升性能。但这些频繁的更新有时会导致一些插件暂时无法与新版本完全兼容。为了解决这个问题&#xff0c;设计师们可以采用一个简单有效的方法&#xff0c;那就是将较新版本的3ds Max文件进行版…

Java常见限流用法介绍和实现

目录 一、现象 二、工具 ​​​​​​1、AtomicInteger,AtomicLong 原子类操作 ​​​​​​2、RedisLua ​​​​​​3、Google Guava的RateLimiter 1&#xff09; 使用 2&#xff09; Demo 3&#xff09; 优化demo 4、阿里开源的Sentinel 三、算法 1、计数限流 &…

python练习二

# Demo85def pai_xu(ls_test):#创建一个列表排序函数命名为pai_xu# 对创建的函数进行注释"""这是一个关于列表正序/倒序排列的函数:param ls_test: 需要排序的列表:return:"""ls1 [int(ls_test[i]) for i in range(len(ls_test))]#对input输入的…