声明:以后便于打字 约定 状态转移表(State transition table)缩写为STT,状态转移图(State transition diagram)缩写为STD(这些缩写仅限于本系列,实际生活中不一定通用~)

 细心的童鞋们应该已经察觉到了,2.6的例子的实现根据编码的方式不同实现不是唯一的。我们在2.6中用的是二进制编码(Binary Encoding)。此外还有两种常用的编码根据实际情况不同也经常被用到。一个是One-Hot编码,另一个是One-Cold编码。那么什么是One-Hot和One-Cold呢?简单说,就是用每一个bit来代表一个状态。当该状态为True的时候,就把这个bit设为1的是One-hot,而One-Cold就是只有当此状态为False时设定该bit为1.

不多说,工学就要多看例子~。下面举一个 分频计数器(divide-by-N counter)的例子。分频计数器干什么用的?我先不说,大家看时序图。看看是不是能够明白它是做神马的。

2.7 FSM状态编码(State Encoding)_二进制。Y自然代表输出。(答案:不许偷看,一定要先想~~ 输出会在时钟的第3个周期开始上拉持续一个周期结束。--每到第三个周期就计一下数。这就是所谓的 divide-by-3 counter  也就是N=3)。那么下面大家尝试画一下状态转变图吧。(画图时重点是想好 这个系统什么在变,有几个状态)

2.7 FSM状态编码(State Encoding)_counter_02

有了图这个系统的状态关系就明确了。我们当然进入列表阶段咯。这里当然只需要两张表,一个状态转移表,和一个输出表。


2.7 FSM状态编码(State Encoding)_transition_032.7 FSM状态编码(State Encoding)_二进制_04  至此我们对系统需求的抽象部分搞定。接下来进入核心内容,这里我用两种编码方式实现这个系统。

2.7 FSM状态编码(State Encoding)_计数器_05这张表右边的编码就是二进制编码,左边是One-Hot。

a。下表是以二进制形式翻译的STT。

2.7 FSM状态编码(State Encoding)_系统总线_06

b。下表是以One Hot形式翻译的STT。

2.7 FSM状态编码(State Encoding)_系统总线_07

看到不同了吧,One hot我们需要3个bit来表达,而Binary我们只需要2个bit。貌似One hot需要较多的内存(当然就是FF了)。是的!自己写表达式吧(估计大家都懒得写了,口算都知道~)。

我直接给出实现

a。2.7 FSM状态编码(State Encoding)_counter_08注意图里的S1`前的逻辑门,乍一看貌似是多余的。是的从逻辑表达式上看的确是,但是别忘了我们之前说的时序分析的结论,我们加这么一个冗余逻辑元件避免了时序不同步问题!

b。

2.7 FSM状态编码(State Encoding)_计数器_09这里的和我们预想的一样,用了3块FF,Reset要把FF的初始状态设为001.

我们的One hot比较费内存。总结的说,我们如果有K个状态,One hot 编码要用K bits 而 Binary编码只需要 LogK(以2为底) bits,可以估算过如果某个系统总线宽是32位的话,One hot 要32bits,而Binary只要5bits。但是在需要高速度应答的时候,我们显而易见,Binary的时序相对比较难以控制,而One hot比较容易同步时序。不过根据具体设计情况,要灵活多变才能修炼成自己独到的见解~。大家继续努力~。