状态机设计 by foreveryoung V2.0

更新时间:2023-06-15 10:24:18 阅读: 评论:0

状态机设计V2.0 by foreveryoung
前言:
很久以前发了篇《状态机设计by foreveryoung》,这阵子有空重新修订了一下,少许补充和删减了些内容,相对老版,调理应该更加清晰点。
细心的人可能注意到,目录是从第二章开始的,且没有做链接。因为这是我笔记中的一篇,也懒得改了,想来也不会太影响阅读:)。
2011.5.31 上海foreveryoung
雪的歌交流QQ群:123035845/91968656
目录:
手工编织包包2. 状态机设计
2.1 状态机分类
2.2 有限状态机的状态编码
信贷是什么2.3 推荐的状态机描述方法
2.3.1 FSM的时序优化——输出逻辑优化和响应速度
2.3.2 状态机的描述方法
2.3.3 有限状态机FSM编码方式和书写规范
2.3.4 状态机建模样板
2. 状态机设计
2.1 状态机分类法海结局
如果时序逻辑的输出不但取决于状态还取决于输入,称为Mealy状态机。如果输入变化,这类状态机的输出可能在一个时钟周期的中间跟着改变。
而有些时序逻辑电路的输出只取决于当前状态,这样的电路就称为Moore 状态机。这类状态机输出和输入成隔离状态:输出将在剩余的时钟周期内保持稳定(为一个常数),即使输入在时钟周期内变化。
适合新手开的车2.2 有限状态机的状态编码
最厉害的压小人方法常用的编码有三种:二进制编码、Gray码、one-hot编码。另外,还可以自定义编码,比如在高速设计中以状态编码作为输出。
一.二进制编码
顺序二进制编码,即将状态依次编码为顺序的二进制数。顺序二进制编码是最紧密的编码,优点在于它使用的状态向量位数最少。例如对于6个状态的状态机,只需要3位二进制数来进行编码,因此只需
要3个触发器来实现,节约了逻辑资源(在实际应用中,往往需要较多组合逻辑对状态向量进行解码以产生输出,因此实际节约资源的效果并不明显)。
在上面的例子中,3位二进制数总共有8种可能的编码模式,其中6种用来表示有效状态,剩下的2种是无效编码。
有人认为顺序二进制编码还有一个好处。当芯片受到粒子辐射或者由于异步输入等问题可能会造成状态跳转失常。如果失常中状态机跳转到无效的编码状态则可能会出现死机,除非复位否则永远无法回到IDLE状态。而因为顺序二进制
编码最紧密,所以无效编码最少。失常时有更大的概率跳转到的有效状态,并最终回到IDLE状态。
这种预想的好处并不会发生在实际中。首先,失常的跳转到有效状态并不意味着能够最终回到IDLE状态。例如在某个有效状态,状态机循环等待某输入信号,并作出应答。如果状态机失常的跳转到该状态,同样会陷入死等,因为输入信号并不会到来。其次,失常的跳转到有效状态,意味着可能在不正确的时机产生输出,这样会将故障传播到其他模块。在很多应用中人们宁愿死机不输出任何信号也不愿意输出错误的信号。
可见使用顺序二进制编码并不能使得状态机具有所想象的容错能力。
二.Gray码
Gray码在发生状态跳转时,状态向量只有一位发生变化。理论上说Gray状态机在状态跳转时不会有任何毛刺。但是实际上综合后的状态机是否还有这个好处也很难说。Gray码状态机设计中最大的问题是,在状态机很复杂状态跳转的分支很多时,要合理的分配状态编码保证每个状态跳转都仅有1位发生变化,这是很困难的事情。
三.one-hot编码
虽然独热码多用了触发器,但所用组合电路可省一些,因而使电路的速度和可靠性有显著提高,而总的单元数并无显著增加。同时独热码在状态跃迁时仅需要改变状态变量的某一位,在一定程度上简化了比较逻辑,从而减少了毛刺产生的概率。同时采用独热编码后有了多余的状态,就有了一些不可达到的状态。为此,在ca语句的最后需要增加default分支项。
one-hot编码有很多变体。比如将IDLE状态编码为0,其他状态按照正常的one-hot编码。即对于除IDLE外的每个给定状态,对应的状态向量只有一位置1,其他位置0。这种变体的好处是在复位时可简单的将状态向量的各个触发器清0。
另一种常见的变体称为"almost one-hot"编码。假设状态机有功能几乎相同的两组状态(例如,处理对
某设备的读访问和写访问),可以使用1个状态位来指示状态机当前正处在两组状态中的哪一组,而剩下的状态位采用普通的one-hot 编码(例如一组状态为4'b0001, 4'b0010, 4'b0100,另一组为4'b1001, 4'b1010, 4'b1100)。因此要对给定状态进行完整的解码需要考察两个状态位。这种机制具有使用纯one-hot编码的大多数好处,但逻辑更小。
one-hot状态机有一个缺点,它的状态每次发生跳转,很多状态位都会发生变化。首先,状态机的输出往往是由状态位组合生成的。同时变化的状态位越多,组合输出稳定前所需的时间就越长,产生的毛刺就越多。如果该输出不经同步就直接连接到寄存器的时钟、使能、或锁存器的使能等控制端口,将很容易导致数据的破坏(正统解决方案是加一级寄存器来同步状态机的输出,该方案可能会产生一个周期的延迟,而且如果该输出稳定前所需的时间过长还是会违背寄存器的建立时间)。其次,对于有异步输入的系统,在时钟沿到来时有多个状态位发生变化,即有多个寄存器可能受异步输入的影响,使得亚稳态发生的概率有所增加(虽然这并不是one-hot编码的问题,根本的解决方案还是避免异步输入)。
四.总结
孕妇能吃橄榄油吗从设计大小的角度来看,在小设计中可以考虑使用Gray码或one-hot。大设
计中,由于现在技术进步几乎不用考虑逻辑资源不够的问题,可以考虑使用one-hot编码以提高速度。
至于顺序二进制编码,一般不予考虑。但是要达到最佳性能,需要使用更高级的编码算法,针对给定的状态机进行分析。
从FPGA/CPLD的角度来看,由于CPLD提供更多的组合逻辑资源,而FPGA 提供更多的触发器资源,所以CPLD多使用Gray码,而FPGA多使用one-hot 编码。
synplicity推荐在24个状态以上会用格雷码,在5~24个状态会用独热码,在4个状态以内用二进制码。
我微笑着走向生活五.自定义编码
在设计高速电路时,常常有必要使状态机的输出与时钟几乎完全同步。有一个办法是把状态变量(也可能是状态变量中的几位)直接用作输出,称为输出编码的状态指定。属于Moore状态机。但这种方法也有缺点,就是开关的维持时间必须与状态维持的时间一致,需要增加状态才能实现。
设计高速状态机还有一种方法,在输出逻辑G后面再加一组与时钟同步的寄存器输出流水线寄存器,让G所有的输出信号在下一个时钟跳变沿时同时存入寄存器组,即完全同步地输出,把这种输出称为流水线化的输出。
注:以下内容翻译自《Coding And Scripting Techniques For FSM Designs With Synthesis-Optimized, Glitch-Free Outputs》。
以状态编码作为输出的步骤:
(1)确定状态机中输出(output)个数x和状态(state)个数y,并制作一张(y+1)*(x+1)的表。查看每个状态的输出是否有一样,如果有,则需要对状态(state)多加一位以区分他们。三个一样的输出加两位,以此类推。例:

本文发布于:2023-06-15 10:24:18,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1039478.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:FC游戏列表
标签:状态   状态机   输出
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图