状态机 格雷码

307 阅读4分钟

三种状态机及其优劣

状态机代码写法有一段式、二段式、三段式(一段式指的是在一段状态机中使用时序逻辑既描述状态的转移,也描述数据的输出;二段式指在第一段状态机中使用时序逻辑描述状态转移,在第二段状态机中使用组合逻辑描述数据的输出;三段式指在第一段状态机中采用时序逻辑描述状态转移,在第二段在状态机中采用组合逻辑判断状态转移条件描述状态转移规律,在第三段状态机中描述状态输出,可以用组合电路输出,也可以时序电路输出)。

优劣:(1)一段式状态机不利于维护(简单状态机可以用);     (2)两段式状态机是常见写法,时序逻辑进行状态切换,时序逻辑实现各个输入、输出以及状态判断,利于维护,不过组合逻辑容易出现毛刺等常见问题;     (3)三段式状态机推荐写法,代码易维护,时序逻辑输出解决了两段式写法种组合逻辑的毛刺问题,但是耗费资源多一些且第三段 always 如果判断条件是 cs 从输入到输出比一段式和两段式会延时一个时钟周期。

**Mealy**状态机:时序逻辑的输出不仅取决于当前状态,还与输入有关;

        Moore状态机:时序逻辑的输出只与当前状态有关。

一段式

只有一个always block,把所有的逻辑(输入、输出、状态)都在一个always block的时序逻辑中实现。这种写法看起来很简洁,但是不利于维护,如果状态复杂一些就很容易出错,不推荐这种方法

二段式:

有两个always block,把时序逻辑和组合逻辑分隔开来。

时序逻辑里进行当前状态和下一状态的切换, 组合逻辑实现状态输出

这种写法不仅便于阅读、理解、维护,而且利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。

在两段式描述中,当前状态的输出用组合逻辑实现,可能存在竞争和冒险,产生毛刺。

三段式:

有三个always block,一个时序逻辑采用同步时序的方式描述状态转移,一个采用组合逻辑的方式判断状态转移条件、描述状态转移规律,第三个模块使用同步时序的方式描述每个状态的输出。代码容易维护,时序逻辑的输出解决了两段式组合逻辑的毛刺问题,但是从资源消耗的角度上看,三段式的资源消耗多一些。

异步fifo使用格雷码的原因

由于异步fifo的读指针和写指针分别属于不同的时钟域,这样指针在进行同步的过程中容易出错,采用格雷码,相邻每位只有一位发生变化,这样在进行指针同步时候,就会产生同步正确。 即使同步出错,出错的结果也是写指针的跳变不变。 对于读空判断,最多导致fifo在不是真空的时候产生,而不会出现读空。 格雷码保证即使读写指针同步后出错,也不影响fifo功能的正确性。

跨时钟域的常用方法

1.单bit:两级触发器同步(高频采低频) 2.多bit:采用异步FIFO,异步双口RAM 3.加握手信号(低频采高频) 4.格雷码转换

单bit同步时钟域:从慢时钟域到快时钟域,两级触发器(延迟打拍)

单bit同步时钟域:从快时钟域到慢时钟域,引入异步握手机制,保证每个脉冲都同步成功,同步成功后再进行下一个脉冲。

多bit: 握手机制 异步fifo 双口ram

wire类型的变量用来连接结构化模块。缺省值是z(高阻状态)

产生锁存器的条件

所以在时序逻辑中,不完整的 if…else… 结构并不会生成锁存器,而组合逻辑中不完整的 if…else… 结构就会生成锁存器。

只有在组合逻辑中的case结构才有可能产生锁存器,而在时序逻辑电路中,即使case结构中的分支不完整,也不会产生锁存器,