状态机设计中的关键技术

news2024/11/24 1:03:24

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。
🔥文章和代码已归档至【Github仓库:hardware-tutorial】,需要的朋友们自取。或者公众号【AIShareLab】回复 FPGA 也可获取。

文章目录

    • 状态编码
      • 格雷码
      • 独热码(one-hot编码)
    • 如何消除输出端产生的毛刺
      • 1.具有流水线输出的Mealy状态机
      • 2.在状态位里编码输出的Moore状态机
    • 如何使用One-hot编码方案设计状态机

状态编码

在使用Verilog HDL描述状态机时,通常用参数定义语句parameter指定状态编码。状态编码方案一般有三种:自然二进制编码、格雷(Gray)编码和独热码(one-hot编码)。对应于图所示的状态图的各种编码方案如表所示。

有限状态机的编码方案

状态机编码对状态机速度和面积关系重大

常用编码

  • 二进制码(binary)
  • 格雷码(Gray)
  • 独热码(one-hot)

二进制码与格雷码是压缩状态编码,使用最少的状态位进行编码。

二进制编码的优点是使用的状态向量最少,但从一个状态转换到相邻状态时,可能有多个比特位发生变化,瞬变次数多,易产生毛刺。

格雷码

特点是当前状态改变时,状态向量中仅一位发生变化,因此当系统的状态变化是基于异步的输入信号时,格雷编码能够避免进入错误的状态。

格雷码既可以消除状态转换时多状态信号传输延迟产生的毛刺,又可降低功耗。

独热码(one-hot编码)

N个状态使用N个触发器(FF)

  • 减少了状态寄存器之间的组合逻辑级数,因此提高了运行速度 ;
  • 触发器(FF)数量增加,组合逻辑电路减少;
  • 任何状态都可以直接添加/删除等修改而不会影响状态机的其余部分;
  • 由于译码简单,可提高速度,且易于修改。

独热码(one-hot编码)的特点是:状态数等于触发器(FF)的数目,冗余的触发器带来的好处是译码电路的简单化,因此它的速度非常快,此外由于FPGA器件内部触发器的数量是固定的且比较丰富,所以one-hot编码非常适合于FPGA设计。

独热码的缺点

  • 变化的状态位越多,组合输出稳定前所需的时间就越长,产生的毛刺就越多 ;
  • 多个寄存器可能受异步输入的影响,使得亚稳态发生的概率有所增加 ;

状态机复杂状态跳转的分支很多时,要合理的分配状态编码,保证每个状态跳转都仅有1位发生变化,这是很困难的事情。

不管使用哪种编码,状态机中的各个状态都应该使用符号常量,而不应该直接使用编码数值,赋予各状态有意义的名字对于设计的验证和代码的可读性都是有益的。

编码方法面积速度状态数量
Binary (顺序二进制)较好较差Log2(state N)
One-hot较差较好States Number
Gray较好较差Log2(state N)

如何消除输出端产生的毛刺

前面介绍的普通状态机由组合逻辑电路决定电路的输出.当组合逻辑较大时,若状态触发器的值发生变化或者输入信号发生变化,由于各信号在组合逻辑内部经过的路径不一样,就容易在输出端产生毛刺。

下面介绍两种常用消除毛刺的方法:

1.具有流水线输出的Mealy状态机

为了消除毛刺,可以在普通Mealy的输出逻辑后加一组输出寄存器,将寄存器的输出值作为输出向量,这种Mealy状态机的等效方框如图所示。

具有流水线输出的Mealy 状态机

2.在状态位里编码输出的Moore状态机

这种方法的指导思想是将状态寄存器和输出向量统一进行编码,即将状态位本身作为输出信号,其等效状态框图如下所示。

下面以图所示的状态图说明在状态位里编码输出的方法。图中,状态机共有三个状态:IDLE,START和WAIT,输入信号为:input_1,input_2,input_3,input_4。这些输入信号的不同逻辑组合就构成了状态之间跳转的条件。

该状态机需要控制两个输出信号:output_1和output_2。可以采用4bits的状态编码,其中高两位表示当前的状态,末尾两位控制output_1和output_2的输出。IDLE状态编码为4’b0000,START状态编码为4’b0101,WAIT状态编码为 4’b1011。

参考程序如下所示:

module  FSM1 (nRST, CP, input_1, input_2, input_3, input_4, output_1, output_2) ;
	input input_1, input_2, input_3, input_4; //定义输入变量
	input nRST, CP;
            output output_1, output_2 ; //定义输出变量
	wire output_1, output_2; 
	reg [ 3 : 0 ] Current_state, Next_state;
	//状态参量的定义,根据前面所述的全译码状态编码
parameter [ 3 : 0 ] IDLE = 4'b0000,  START = 4'b0101, WAIT = 4'b1011;
//The first always block, sequential state transition
always @(posedge CP or negedge nRST) 
    if (!nRST)        //当系统复位时,状态寄存器置为IDLE状态
        Current_state <= IDLE;  //设置初态(IDLE)
    else  //状态寄存器进行状态存储,将下一状态存储到状态寄存器成为当前状态
        Current_state <= Next_state;   
// The second always block, combinational condition judgment
always @(Current_state or input_1 or input_2 or input_3 or input_4)	
  case(Current_state) //根据当前状态和状态转换条件进行译码
     IDLE:
          if(input_1 && input_2)  Next_state = START;
          else  Next_state = IDLE;
     START:
          if(input_3)  Next_state = WAIT;
          else  Next_state = START;  
     WAIT:  
           if(input_4)  Next_state = IDLE;
           else Next_state = WAIT; 
     default:  Next_state = IDLE;
   endcase
//状态机的输出逻辑
assign  output_1 = Current_state[1]; 
assign  output_2 = Current_state[0];
endmodule

如何使用One-hot编码方案设计状态机

对状态机的各个状态赋予一组特定的二进制数称为状态编码。比较常用的有自然二进制码、格雷码和One-hot编码。自然二进制码和格雷码的编码方案使用的触发器较少,其编码效率较高,但负责根据当前状态和状态转换条件进行译码的组合电路会比较复杂,其逻辑规模也较大,使得次态逻辑在传输过程中需要经过多级逻辑,从而影响电路的工作速度。

One-hot编码方案使用n位状态触发器表示具有n个状态的状态机,每个状态与一个独立的触发器相对应,并且在任何时刻其中只有一个触发器有效(其值为1)。虽然这种方案会使用较多的触发器,但它的编码方式非常简单,可有效地简化组合电路,并换得工作可靠性和工作速度的提高。在大规模可编程逻辑器件如FPGA中,触发器数量较多而门逻辑相对较少,One-hot编码方案有时反而更有利于提高器件资源的利用率。

定义当前状态向量state为一个5-bits向量,末尾的两位表示状态机输出,state[2]为1表示状态IDLE,state[3]为1表示状态START,state[4]为1表示状态WAIT。

下面是基于One-Hot编码方式的状态机实现代码:

module  FSM2 (nRST, CP, input_1, input_2, input_3, input_4, output_1, output_2) ;
	input input_1, input_2, input_3, input_4; //定义输入变量
	input nRST, CP;
            output output_1, output_2 ; //定义输出变量
	wire output_1, output_2; 
	reg [ 4 : 0 ] state, Next_state;
    parameter [ 4 : 0 ] IDLE  = 5’b001_00, //状态参量,末尾两位表示对应的输出
         START = 5’b010_01,
         WAIT   = 5’b100_11;
 //状态对应在state中的表示位置,One-hot
parameter [2:0] IDLE_POS    = 3'd2,  // IDLE POSition
                            START_POS = 3'd3,  // START POSition
                            WAIT_POS   = 3'd4;  // WAIT POSition

always @(posedge CP or negedge nRST)     //状态存储
     if (!nRST)  state <= IDLE;
     else             state <= Next_state; 
always @(input_1 or input_2 or input_3 or input_4)//状态转移逻辑
    begin
        Next_state  =  IDLE; //设置初态
        case(1’b1)                   //One-Hot编码实现状态转移时,
           //每次取state的一位与1比较
        state[IDLE_POS]:
               if(input_1 && input_2)
                          Next_state = START;
               else     Next_state = IDLE;
        state[START_POS]:
               if(input_3)
                          Next_state = WAIT;
               else     Next_state = START;  
        state[WAIT_POS]:  
               if(input_4)
                        Next_state = IDLE;
              else    Next_state = WAIT; 
        default:   Next_state = IDLE;
     endcase
end
//状态机的输出逻辑
assign  output_1 = state[1];
assign  output_2 = state[0];
endmodule

One-hot编码特点:指定各个状态在状态编码中的表示位,采用参量定义方式指定One-hot状态编码;使用always语句描述状态寄存器的状态存储;使用敏感表和case语句描述状态转换逻辑,在case语句中只采用一位寄存器比较方式;使用assign语句描述状态编码控制的状态机输出。

参考文献:

  1. Verilog HDL与FPGA数字系统设计,罗杰,机械工业出版社,2015年04月
  2. Verilog HDL与CPLD/FPGA项目开发教程(第2版), 聂章龙, 机械工业出版社, 2015年12月
  3. Verilog HDL数字设计与综合(第2版), Samir Palnitkar著,夏宇闻等译, 电子工业出版社, 2015年08月
  4. Verilog HDL入门(第3版), J. BHASKER 著 夏宇闻甘伟 译, 北京航空航天大学出版社, 2019年03月

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

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

相关文章

IT行业寒冬,干测试从月薪18k降到了15k,“我”的路在何方

今天已经是2.10了&#xff0c;马上就是金3银4了&#xff0c;2023年才开始&#xff0c;是的&#xff0c;正值春天&#xff0c;想到了一首诗词自古逢秋悲寂寥&#xff0c;我言秋日胜春朝。晴空一鹤排云上&#xff0c;便引诗情到碧霄。秋天&#xff0c;意味着收获&#xff0c;也意…

【C语言】“指针类型”与“野指针”

文章目录一、指针是什么❔二、指针和指针类型1.指针-整数2.指针解引用三.野指针1.引起野指针的原因2.如果避免野指针完结一、指针是什么❔ 指针也就是 内存地址 &#xff0c;在计算机上我们访问数据需要通过内存地址来访问&#xff0c;在C语言中&#xff0c;指针变量是用来存放…

如何编写Python程序调用ChatGPT,只需3步

如何编写Python程序调用ChatGPT&#xff0c;只需3步 在ChatGPT官网进行注册&#xff0c;注册成功后就可以对ChatGPT进行提问&#xff0c;ChatGPT的注册流程参考这篇文章——手把手教你注册ChatGPT&#xff0c;亲测可用。 来看看ChatGPT&#xff0c;如何回答”ChatGPT是什么“…

Deepwalk深度游走算法

主要思想 Deepwalk是一种将随机游走和word2vec两种算法相结合的图结构数据的挖掘算法。该算法可以学习网络的隐藏信息&#xff0c;能够将图中的节点表示为一个包含潜在信息的向量&#xff0c; Deepwalk算法 该算法主要分为随机游走和生成表示向量两个部分&#xff0c;首先…

c++11 标准模板(STL)(std::multimap)(三)

定义于头文件 <map> template< class Key, class T, class Compare std::less<Key>, class Allocator std::allocator<std::pair<const Key, T> > > class multimap;(1)namespace pmr { template <class Key, class T…

SCI论文阅读-使用基于图像的机器学习模型对FTIR光谱进行功能组识别

期刊&#xff1a; Analytical Chemistry中科院最新分区&#xff08;2022年12月最新版&#xff09;&#xff1a;1区(TOP)影响因子&#xff08;2021-2022&#xff09;&#xff1a;8.008第一作者&#xff1a;Abigail A. Enders通讯作者&#xff1a;Heather C. Allen 原文链接&…

自己家用的电脑可以架设游戏吗

自己家用的电脑可以架设游戏吗家用电脑怎么用来做服务器呢&#xff1f;我是艾西&#xff0c;今天我跟大家详细的说家用电脑可以当服务器使用吗&#xff1f;咱们先把家用电脑不足的点列出来就清楚了一、外网端口映射以前的宽带大多数是adsl拨号&#xff0c;再搭配一个TP路由器&a…

SQL语句训练

好文推荐&#xff1a; 21个MySQL表设计的经验准则 后端程序员必备&#xff1a;书写高质量SQL的30条建议 我们为什么要分库分表&#xff1f; 从0.742秒到0.006秒&#xff0c;MySQL百万数据深分页优化实战 2020年MySQL数据库50面试题目含答案 MyBatis 表连接查询写法|三种对…

深度学习实战(11):使用多层感知器分类器对手写数字进行分类

使用多层感知器分类器对手写数字进行分类 1.简介 1.1 什么是多层感知器&#xff08;MLP&#xff09;&#xff1f; MLP 是一种监督机器学习 (ML) 算法&#xff0c;属于前馈人工神经网络 [1] 类。该算法本质上是在数据上进行训练以学习函数。给定一组特征和一个目标变量&#x…

2021年新公开工业控制系统严重漏洞汇总

声明 本文是学习ITOT一体化工业信息安全态势报告&#xff08;2019&#xff09;. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 工业互联网安全威胁 2021年新公开工业控制系统严重漏洞 缓冲区溢出漏洞 缓冲区溢出&#xff08;buffer overflow&…

什么是自动化测试?自动化测试现状怎么样?

什么是自动化测试&#xff1a;其实自动化测试&#xff0c;就是让我们写一段程序去测试另一段程序是否正常的过程&#xff0c;自动化测试可以更加省力的替代一部分的手动操作。 现在自动化测试的现状&#xff0c;也是所有学习者关心的&#xff0c;但现在国内公司主要是以功能测…

算法设计 - 前缀和 差分数列

一维数组前缀和的概念 前缀和的概念很简单&#xff0c;我们用一维数组的前缀和来举例&#xff0c;有如下一维数组&#xff1a; arr [1, 2, 3, 4, 5] 该数组的前缀和数组如下 preSum [1, 3, 6, 10, 15] 关系如下&#xff1a; preSum[0] arr[0]preSum[1] arr[0] arr[1]pre…

Codeforces Round #851 (Div. 2) A — C

Codeforces Round #851 A. One and Two 题目描述 给定一个序列a中的每个元素都是1或2。找出整数k是否存在&#xff0c;以满足以题目所给条件。 题目分析 1对乘积没有贡献&#xff0c;只需要注意2的个数即可&#xff0c;偶数个2即可满足条件&#xff0c;记录第cnt/2个2的位…

集成nanocaptcha库生成登录验证码

背景 需要实现一个验证码登录的功能需求。这个需求挺简单的&#xff0c;主要实现验证码图片生成给前端&#xff0c;然后&#xff0c;在登录接口比对验证码即可。刚拿到这个需求&#xff0c;好久没有搞过登录这一块了&#xff0c;所以&#xff0c;查了一下相关验证码的知识。下…

cv2--特征点特征提取(Sift,Orb,Surf)

cv2–特征点特征提取&#xff08;Sift&#xff0c;Orb&#xff0c;Surf&#xff09; 文章目录cv2--特征点特征提取&#xff08;Sift&#xff0c;Orb&#xff0c;Surf&#xff09;1. 关键点和关键点描述子2. Sift2.1 检测的步骤2.2 同时计算关键点kp和描述子des3. Surf4. Orb5. …

61 UseSerialGc的新生代回收调试

前言 呵呵 很久之前看到这样的两篇文章 [讨论] HotSpot VM Serial GC的一个问题 新生代回收调试的一些心得 在第一篇帖子中 R大 详细的讲述了 cheney 算法, 以及自己编写的 cheney 算法, 以及 DefNewGeneration 的具体的一些细节, 以及 和现有的例子的对比 另外还有一些…

leaflet 加载topojson数据,显示图形(代码示例047)

第047个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载topojson文件,将图形显示在地图上。TopoJSON文件格式是geoJSON的一种扩展,它可以对地理空间拓扑进行编码。TopoJSON文件包含数据属性和地理空间的属性。 直接复制下面的 vue+openlayers源代码,操作…

C语言入门(什么是C语言,C语言的编程机制以及一些基础计算机概念)

目录 一.什么是C语言 1.面向对象&#xff1a; 2.面向过程&#xff1a; 二.C语言特点 三.C语言开发时间 四.环境搭建 1.代码编辑器 2.C编译器 五.C语言标准 六.计算机补充知识 1.计算机构成 2.CPU工作 3.编译器 七.编写程序步骤 八.源文件&#xff0c;目标文件&a…

SpringBoot 三大开发工具,你都用过么?

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

Sentinel服务熔断功能(sentinel整合ribbon+openFeign+fallback)

目录 1、Sentinel服务熔断功能 一、Ribbon系列 &#xff08;一&#xff09;提供者9003/9004 &#xff08;二&#xff09;消费者84 二、OpenFeign系列 三、熔断框架比较 2、规则持久化 1、Sentinel服务熔断功能 一、Ribbon系列 &#xff08;一&#xff09;提供者9003/9004 …