本帖最后由 hotcool 于 2022-10-24 18:14 编辑
好的状态机设计
同步设计中一个非常强大的武器是状态机(万物皆可状态机)。结合组合逻辑和许多寄存器,状态机能够根据其输入和当前状态做出决策。状态机的行为是完全同步的,所有决策都是在时钟转换时做出的。状态机有两种传统形式:Mealy状态机和Moore状态机。这些状态机的特性如图2所示。
Moore状态机是两种状态机中较简单的一种。输出只是当前输入的函数。Mealy状态机的输出是当前状态加上输入的函数。这个额外的路径提供了更多的灵活性,但可能会使对机器的理解复杂化。
Moore状态机/Mealy状态机有什么问题?显示了状态机的Mealy和Moore形式的输出都是当前状态的组合解码,在Mealy形式中是输入的组合解码。虽然这在原则上是好的,但这里有陷阱等着粗心的人。
状态机的输出可能包括以下类型的功能:
锁存使能(低或高脉冲打开或关闭锁存)
三态使能(在片内或片外总线上打开和关闭驱动程序的信号)
寄存器启用(启用同步时钟寄存器)
其他一般控制信号,如计数器启用、标志等。
大多数这些信号都有一个共同的特点——毛刺在任何时候都是绝对不可接受的。当状态寄存器和Mealy或Moore状态机的输入转换时,组合逻辑可能由于门传播延迟的变化而产生毛刺。这些短暂的毛刺很可能包含足够的能量来打开锁存器、时钟寄存器,以造成非常严重的影响。
格雷码不能解决问题吗?
格雷码是一个非常好的设计,因为其每次转化都只有一个bit的变化,这很好地避免了毛刺对状态机转换带来的影响,看起来格雷码似乎与状态机是绝配。但是不要忘了,格雷码每次只有1bit变化的特性是有条件限制的--即转化只能发生在相邻两位。比如从6跳转到7,或者反之,这样的转化格雷码会只有1bit的变化,但是从6到8则格雷码的变化就不止1bit了。现在的设计越来越复杂,状态机的状态通常都是几十上百,且不同状态之间的跳转及其复杂,这使得不相邻数字状态之间的跳转已成为常态!这无疑让格雷码作用大打折扣!
一个更好的状态机设计
展示了一个状态机的更好设计。通过增加一个寄存器到输出端,来保证状态机的输出不会有毛刺,在此建议所有的状态机都使用寄存器作为输出端。
|