SoC设计之状态机(FSM)

1.概述

有限状态机(Finite-State Machine,FSM),又成为有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。在当今的电子世界,基本所有的器件都是串行的,所以作为控制单元或者是可编程单元的SoC需要进行并行转串行与外界进行通信、控制等,而有限状态机以其简单实用、结构清晰而恰如其分的充当着这个角色。

有限状态机是由寄存器组和组合逻辑构成的硬件时序电路,其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态,究竟转向哪一状态还是留在原状态不但取决于各个输入值,还取决于当前所在状态。

2.分类

   状态机有两种类型,它们根据每种状态机生成的输出类型进行分类。
   第一个是Moore状态机,其中输出仅是当前状态的函数,

   第二个是Mealy状态机,其中一个或多个输出是当前状态和一个或多个输入的函数。

 

除了根据状态机各自的输出生成类型对状态机进行分类之外,状态机通常还通过每个状态机采用的状态编码进行分类。 一些更常见的状态编码方式包括

                1、Gray(格雷码)码状态机

                2、one-ho码(独热码)状态机

                3、二进制码状态机

                有限状态机编码时采用格雷码和采用独热码的选择:

                 格雷码:相邻之间只变1bit,编码密度高。
                 独热码:任何状态只有1bit为1,其余皆为0,编码密度低。
                 比如说,表示4个状态,那么状态机寄存器采用格雷码编码只需要2bit:00(S0),01(S1),11(S2),10(S3);
                 采用独热码需要4bit:0001(S0),0010(S1),0100(S2),1000(S3)。所以很明显采用格雷码可以省2bit寄存器。
                 难理解的是,为什么独热码更节省组合逻辑:
                 其实很简单,
                 例一:
                   假如我们要在代码中判断状态机是否处于某状态S1,
                   对于格雷码的状态机来说,代码是这样的:assign S1 = (STATUS==2'b01);
                   对于独热码来说,代码是这样的就行:assign S1=STATUS[1];
                   所以独热码的译码非常简单。
                 例二:
                   考虑最简单的跳变,当A为1时,状态机会从S0跳到S1:。
                  采用格雷码写:
                   STATUS[1:0] <= (STATUS==2'h00) & A ? 2'h01 : 2'h00;
                 采用独热码写:
                 STATUS[1] <= STATUS[0] & A;

                  有人怀疑这里的逻辑,认为只check独热码的一个bit有问题。当然是没问题的,0110,0011等编码属于不care的编                        码,在卡诺图化简中,不care的编码可以与其余的有效编码合并化简。实际上综合器也会这么做,所以独热码非常容                    易化简。假如说S0跳到S1条件为A;S1跳到S2条件为B;S2跳到S3条件为C;S3跳到S0条件为D;那么整个状态机                      化简之后代码就是:
                   STATUS[0] <= STATUS[3] & D;
                   STATUS[1] <= STATUS[0] & A;
                   STATUS[2] <= STATUS[1] & B;
                   STATUS[3] <= STATUS[2] & C;

                    总结一下:
                   独热码适合写条件复杂但是状态少的状态机;
                   格雷码适合写条件不复杂但是状态多的状态机。

               独热码 使用的触发器较多,但可减少实现状态机的组合逻辑数目,减少复杂性,提高系统的速度,即工作时钟频率可                  以做到最高。格雷码是使用最小数目的触发器来编码状态机,但形成的组合逻辑比较复杂。
              使用独热码编码时,会出现很多未使用的状态,而使用二进制编码和格雷码编码时,如果状态机的状态数不是2的指                      数 次方时,也会出现未使用状态。
             格雷码每个相邻的状态切换只有一个bit的信号跳变,适用于异步握手的情况,比如异步FIFO的指针计数。

使用图2所示的Moore FSM状态图,本文将详细介绍高度编码的二进制,独热码和独热码的零空闲状态机的可综合Verilog编码样式。  图2给出了状态机的三种编码样式的编码示例。

 

  FSM Verilog模块原则:使每个状态机成为单独的Verilog模块。
   将每个状态机与其他综合逻辑分开可以简化状态机定义,修改和调试的任务。 还有许多EDA工具可协助FSM的设计和文档编制,但通常,只有在FSM与其他逻辑代码不混合的情况下,它们才可以正常工作。
   状态分配准则:使用带有符号状态名称的参数进行状态分配。
   定义和使用符号状态名称使Verilog代码更具可读性,并在必要时简化了重新定义状态的任务。 例1-3显示了针对图2中的FSM状态图的参数定义。

 

 

两个always块状态机可以用多种方式对可综合状态机进行编码。 两个always块和一个always块状态机是两种最常见,易于理解和有效的方法。
   1.时序always进行状态转换

二段式状态机将状态分为当前状态和此状态,其系统会自动将次状态更新到当前状态,其输入更新在次状态上,其决定系统的状态切换和输出。其输出和状态的切换在两个个always循环块中执行,

第一个always块决定系统状态标志的自动跳转,

第二个always块决定系统根据不同状态下的输入进行状态的跳转及输出。

 

 

 

 

 

两段式实例:

加上输出task的实例

 使用独热码的带有零空闲的实例:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值