状况机规划规范
1. 运用一位有用的方法进行状况编码
状况机中状况编码主要有三种:接连编码(sequential encoding)、一位有用(one-hot encoding)方法编码以及不属于这两种的编码。例如,关于一个5个状况(State0~State4)的状况机,接连编码方法状况编码为:State0-000、State1-001、State2-010、State3-011、State4-100。一位有用方法为下为:State0-00001、State1-00010、State2-00100、State3-01000、State4-10000。关于自行界说的编码则不同很大,例如企图将状况机的状况位直接作为输出所需信号,这或许会增加规划难度。
运用一位有用编码方法使逻辑完结更简练,因为一个状况只需求用一位来指示,而为此增加的状况寄存器数目相关于整个规划来说能够疏忽。一位有用至少有两个意义:对每个状况位,该位为1对应仅有的状况,判别当时状况是否为该状况,只需判别该状况位是否为1;假如状况寄存器输入端该位为1,则下一状况将搬运为该状况,判别下一状况是否为该状况,只需判别表明下一状况的信号中该位是否为1。
2. 合理分配状况搬运条件
在状况搬运图中,每个状况都有对应的出线和入线,从不同状况经不同的搬运条件到该状况的入线数目不能太多。以选用与或逻辑的CPLD规划来剖析,假如这样的入线太多则将会需求较多的乘积项及或逻辑,这就需求更多级的逻辑级联来完结,然后增加了寄存器间的推迟;关于FPGA则需求多级查找表来完结相应的逻辑,同样会增加推迟。状况机的运用模型如图1所示。
状况机规划的剖析方法
状况机规划的剖析方法能够分为两种:一种是流程处理剖析,即剖析数据怎么分步处理,将相应处理的过程顺次定为不同状况,该方法能够剖析十分杂乱的状况机,类似于编写一个软件程序的剖析,典型规划如读写操作和数据包字节剖析;另一种方法是要害条件剖析,即依据参阅信号的逻辑条件来确认相应的状况,这样的参阅信号如空或满指示、开端或完毕、握手应对信号等。这两种剖析方法并没有严厉的边界,在实践的状况机规划剖析时往往是这两种方法结合运用。下面别离阐明这两种剖析方法。
1. 流程处理剖析
例如,在一个读取ZBT SRAM中数据包的规划中,要依据读出的数据中EOP(End of Packet)信号是否为1来决议一个包的读操作是否完毕,因为读取数据的拖延,这样就会从ZBT SRAM中多读取数据,为此能够规划一个信号VAL_out来过滤掉多读的数据。
依据数据抵达的先后及占用的时钟周期数,能够规划如图2所示的状况机(本文设定:文字阐明及插图中当时状况表明为s_State[n:0],为状况寄存器的输出;下一状况next_State[n:0],为状况寄存器的输入;信号之间的逻辑关系选用Verilog言语(或C言语)中的符号表明;#R表明需求经过一级寄存器,输出信号对应寄存器的输出端)。该状况机首要判别是否现已抵达包尾,假如是,则顺次进入6个等候状况,等候状况下的数据无效,6个等候状况完毕后将正常处理数据。
2. 要害条件剖析
图3为一个路由器线卡高速数据包分发处理的框图,较高速率的数据包经过分发模块以包为单位送往两个较低速率数据通路(即写入FIFO1或FIFO2)。
关于分发模块规划,要害参阅信号是EOP及快满信号AF1、AF2,参阅EOP能够完结每次处理一个包,参阅AF1、AF2信号能够决议相应的包该往哪个FIFO中写入。分发算法为:FIFO1未满(AF1=0),数据包将写入FIFO1;假如FIFO1将满且FIFO2未满(AF1=1,且AF2=0),则下一数据包将写入FIFO2;假如FIFO1、FIFO2都将满(AF1=1且AF2=1),则进入丢包状况。状况机描绘如图4所示:UseFifo1状况下数据包将写入FIFO1,UseFifo2状况下数据包将写入FIFO2,丢包状况下数据包被丢掉,供给丢包计数使能DropCountEnable。
状况机的进一步优化
1. 运用一位有用编码方法
如前所述,状况机的作业频率跟状况机中各个状况对应的不同搬运条件的入线数目有关。假如到一个状况的搬运条件相同但入线数十分多,其逻辑完结很或许并不杂乱。在一位有用编码方法下,关于某个状况,假如其他一切状况经相同的搬运条件到该状况,那么其逻辑完结能够很好地化简。
例4:一位有用编码方法下状况位s_State[n:0]中, s_State[1] | s_State[2] | … | s_State[n]=1与 s_State[0]=1等价,那么 next_State[0]=(s_State[0]S) | (s_State[1]T) | (s_State[2]T) | … | (s_State[n]) 能够化简为:
next_State[0]=(s_State[0]S) | ((~s_State[0])T),右端输入信号数目大大削减。
2. 运用寄存器的使能信号
大都FPGA或CPLD寄存器供给使能端,假如一切的状况机搬运有必要至少满意某个条件,那么这个条件能够经过使能信号衔接完结,然后能够下降寄存器输入端的逻辑杂乱度。如上例中不同状况间搬运有必要以EOP为1作为条件,因此能够将该信号作为使能信号来规划。
3. 结合所选FPGA或CPLD内部逻辑单元结构编写代码
以Xilinx FPGA为例,一个单元内2个4输入查找表及相关装备逻辑能够完结5个信号输入的最杂乱的逻辑,或8~9个信号的简略逻辑(例如全与或许全或),延时为一级查找表及装备逻辑延时;假如将相邻单元的4个4输入查找表输出衔接到一个4输入查找表,那么能够完结最杂乱的6输入逻辑,此刻需求两级查找表延时及相关装备逻辑延时。更杂乱的逻辑需求更多的级连来完结。针对高速状况机的状况,能够尽量将状况寄存器输入端的逻辑来历操控在7个信号以内,然后自主操控查找表的级连级数,进步规划的作业频率。
4. 经过修正状况机
假如一个状况机达不到作业频率要求,则有必要依据延时最大途径修正规划,一般的方法有:改动状况设置,增加新状况或删去某些状况,简化搬运条件及单个状况衔接的搬运数目;修正搬运条件设置,包含改动搬运条件的组合,以及将杂乱的逻辑改为分级经寄存器输出由寄存器信号再构成的逻辑,后者将会改动信号时序,因此或许需求改动状况设置。
5. 运用并行逻辑
许多状况下要参阅的要害信号或许十分多,假如参阅这些要害信号直接规划状况机所得到的成果或许很杂乱,单个状况的出线或入线将会十分多,因此将下降作业频率。能够考虑经过规划并行逻辑来供给状况机的要害信号以及所需的中心成果,状况机担任保护并行逻辑以及发生数据处理的流程。并行逻辑应分级规划,级间为寄存器,然后削减寄存器到寄存器的延时。
图5为一个运用并行逻辑的状况机,该规划用于运用单一数据总线将FIFO1~4中的数据发送到4个数据通路上去,该规划中并行逻辑发生每次操作时的通路及FIFO挑选成果,状况机担任操控每次操作的流程:在“Idle”状况下,假如FIFO1~4中有数据包供读取,则进入“Schedule”状况;取得调度成果后“Schedule”经过一个“Wait”状况,然后进入“ReadData”状况读取数据,一起开端计数,计数抵达所指定数值或许读到数据包尾时进入闲暇状况“Idle”,顺次循环下去。
流水线规划
流水线(Pipelining)规划是将一个时钟周期内履行的逻辑操作分红几步较小的操作,并在较高速时钟下完结。图6a中逻辑被分为图6b中三小部分,假如它的Tpd为T,则该电路最高时钟频率为1/T,而在图6b中假定每部分的Tpd为T/3,则其时钟频率可进步到本来的3倍,因此单位时间内的数据流量能够到达本来的三倍。价值是输出信号相关于输入滞后3个周期,时序有所改动(图6b中输出信号的总延时与图6a中相同,但数据吞吐量进步了),一起增加了寄存器资源,而FPGA具有丰厚的寄存器资源。
本文所着重的经过削减寄存器间的逻辑延时来进步状况机的作业频率,与流水线规划的起点相同,不同的是流水线所着重的是数据处理时的数据通路优化,而本文所着重的是状况机中操控逻辑的优化。