可综合的有限状态机(2)

可综合的有限状态机(2)

  • 1.0状态机类型
  • 2.0逻辑分类
  • 3.0编码类型
  • 4.0FSM编码目标
  • 5.0FSM 编码风格
  • 6.0编码准则
    • 6.1使默认值接下来等于所有X的赋值
  • 7.0 二段式的范例
    • 7.1 简单10状态FSM设计
    • 7.2 复杂10状态FSM设计
  • 8.0 onehot 状态机编码
    • 8.1 10状态简单onehot状态机编码
  • 9.0 三段式编码范例
    • 9.1 10状态简单FSM设计
    • 9.2 10 状态复杂状态机设计
  • 10.0总结

1.0状态机类型

用于描述FSM类型的常见分类是Mealy和Moore状态机。

2.0逻辑分类

组合始终块总是用于编码组合逻辑功能的块,并使用阻塞赋值进行严格编码。
组合总是阻塞具有组合敏感性列表,没有“posedge”或“negedge”Verilog关键字的敏感性列表。
顺序始终块始终是用于编码时钟或顺序逻辑的块,始终使用非阻塞赋值进行编码。
顺序始终块具有基于边缘的敏感列表。

3.0编码类型

用于描述FSM的状态编码的常见分类是二进制(或高度编码)和Onehot。
二进制编码的FSM设计仅需要尽可能多的触发器来唯一地编码状态机中的状态数。所需的触发器的实际数量等于FSM中状态数量的log-base-2的上限。
单一FSM设计需要设计中的每个状态的触发器,并且在单一FSM设计中一次仅设置一个触发器(表示当前状态的触发器)。
对于具有9-16个状态的状态机,
二进制FSM仅需要4个触发器,而onehot FSM需要触发器用于设计中的每个状态(9-16个触发器)。
可综合的有限状态机(2)_第1张图片
FPGA供应商经常建议使用单一状态编码方式,因为FPGA中的触发器很多,并且实现单一FSM设计所需的组合逻辑通常比大多数二进制编码样式小。由于FPGA性能通常与FPGA设计的组合逻辑大小相关,因此单个FSM通常比具有更大组合逻辑块的二进制编码FSM运行得更快[8]。

4.0FSM编码目标

•应轻松修改FSM编码样式以更改状态编码和FSM样式。
•编码风格应紧凑。
•编码风格应易于编码和理解。
•编码风格应便于调试。
•编码风格应产生有效的综合结果。

本文将研究三种不同的FSM设计。
第一种是简单的4态FSM设计,标记为fsm_cc4,带有一个输出。
第二种是10状态FSM设计,标记为fsm_cc7,只有几个过渡弧和一个输出。
第三种是另一种10状态FSM设计,标记为fsm_cc8,具有多个过渡弧和三个输出。

5.0FSM 编码风格

状态机有三种描述方式:一段式状态机、两段式状态机、三段式状态机。
1)一段式状态机是指用一个always模块进行编写,组合逻辑与时序逻辑混合,不利于约束和综合.
2)二段式状态机是指一个always语句来实现时序逻辑,另外一个always语句来实现组合逻辑,提高了代码的可读性,易于维护。
可综合的有限状态机(2)_第2张图片
3)三段式状态机是指第一个always语句实现同步状态跳转;第二个always语句实现组合逻辑;第三个always语句实现同步输出。
可综合的有限状态机(2)_第3张图片
三段式状态机与两段式状态机的区别:两段式直接采用组合逻辑输出,而三段式则通过在组合逻辑后再增加一级寄存器来实现时序逻辑输出。这样做的好处是可以有效地滤去组合逻辑输出的毛刺,同时可以有效地进行时序计算与约束,另外对于总线形式的输出信号来说,容易使总线数据对其,从而减小总线数据间的偏移,减小接收端数据采样出错的频率。
在Clifford的相关论文里,他指出比较推荐使用二段式进行状态机的编码。
如下所示:

可综合的有限状态机(2)_第4张图片
Example 1 - fsm_cc4 design - two always block style - 37 lines of code

6.0编码准则

•参数用于定义状态编码,而不是Verilog`define宏定义构造。
创建参数定义后,在整个设计的其余部分使用参数,而不是状态编码。这意味着如果工程师想要尝试不同的状态编码,则只需要修改参数值,而其余的Verilog代码保持不变。

•在参数分配后,对当前状态和下一个状态进行声明。

•使用非阻塞赋值对时序始终快进行编码。

•组合始终块敏感性列表应包含输入信号和变量。

•使用阻塞赋值对组合始终块进行编码。

•组合始终块在always块的顶部有一个默认的对下一个状态赋值(详见6.1)

•在编写case语句之前进行默认输出分配(这消除了锁存并减少了在case语句中编写其余
输出所需的代码量,并在case语句中突出显示了各个输出更改的状态)。

•在输出分配不是始终块顶部分配的默认值的状态下,输出分配仅针对每个状态进行一次。

•FSM状态图中的每个转换弧都有一个if语句,else-if-statement或else语句。 FSM状态图中状态之间的转换弧数应等于组合始终块中的if-else-type语句的数量。

•为便于扫描和调试,所有下一个分配都放在一列中,而不是按照RTL代码的轮廓查找下一个分配。

6.1使默认值接下来等于所有X的赋值

在始终块敏感性列表之后的行上放置默认的下一状态分配是非常有效的编码样式。此默认分配由case语句中的下一状态分配更新。通常使用三种类型的默认下一状态分配:(1)next设置为所有X,
(2)next设置为预定的恢复状态,例如IDLE,
(3)next设置为国家登记册的价值。

通过对X进行默认的下一个状态分配,如果在case语句中没有明确分配所有状态转换,则预合成仿真模型将导致状态机输出变为未知。这是一种调试状态机设计的有用技术,而且X将被综合工具视为“不关心”。
有些设计需要分配到已知状态而不是分配X.例子包括:
卫星应用,医疗应用,使用FSM触发器作为诊断扫描链的一部分的设计,以及使用形式验证工具进行等效检查的一些设计。
进行IDLE或全0的默认下一状态分配通常满足这些设计要求,并且使初始默认分配可能比编写case语句中的所有显式下一状态转换分配更容易。

7.0 二段式的范例

7.1 简单10状态FSM设计

可综合的有限状态机(2)_第5张图片

7.2 复杂10状态FSM设计

可综合的有限状态机(2)_第6张图片
可综合的有限状态机(2)_第7张图片

8.0 onehot 状态机编码

可以使用逆情况语句对高效(小而快)onehot状态机进行编码;
case语句,其中每个case项是一个计算结果为true或false的表达式。
重新考虑第5节中所示的fsm_cc4设计。必须对第5节的两个始终块编码样式进行八次编码修改,以实现有效的onehot FSM编码样式。
理解这些变化的关键是要意识到参数不再代表状态编码,它们现在代表状态向量的索引,现在正在对状态或下一状态向量中的单个位进行比较和赋值。 注意case语句现在如何与onehot状态位进行1位比较。
可综合的有限状态机(2)_第8张图片

8.1 10状态简单onehot状态机编码

可综合的有限状态机(2)_第9张图片
8.2 10状态复杂状态机编码
可综合的有限状态机(2)_第10张图片
可综合的有限状态机(2)_第11张图片

9.0 三段式编码范例

三段式状态机与两段式状态机的区别:两段式直接采用组合逻辑输出,而三段式则通过在组合逻辑后再增加一级寄存器来实现时序逻辑输出。这样做的好处是可以有效地滤去租个逻辑输出的毛刺,同时可以有效地进行时序计算与约束,另外对于总线形式的输出信号来说,容易使总线数据对其,从而减小总线数据间的偏移,减小接收端数据采样出错的频率。
可综合的有限状态机(2)_第12张图片

9.1 10状态简单FSM设计

可综合的有限状态机(2)_第13张图片
在这里插入图片描述

9.2 10 状态复杂状态机设计

可综合的有限状态机(2)_第14张图片
可综合的有限状态机(2)_第15张图片
在这里插入图片描述

10.0总结

对前面几种编码方式比较
可综合的有限状态机(2)_第16张图片

你可能感兴趣的:(Verilog)