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

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


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设计

在这里插入图片描述

7.2 复杂10状态FSM设计

在这里插入图片描述
在这里插入图片描述

8.0 onehot 状态机编码

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

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

在这里插入图片描述
8.2 10状态复杂状态机编码
在这里插入图片描述
在这里插入图片描述

9.0 三段式编码范例

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

9.1 10状态简单FSM设计

在这里插入图片描述
在这里插入图片描述

9.2 10 状态复杂状态机设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.0总结

对前面几种编码方式比较
在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA状态机项目是指使用FPGA(Field-Programmable Gate Array)来实现状态机功能的项目。状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。在FPGA状态机项目中,我们可以使用Verilog编程语言来描述和实现状态机的功能。 根据提供的引用内容,有限状态机主要分为两大类:Moore状态机和Mealy状态机。Moore状态机的输出只与状态有关而与输入无关,而Mealy状态机的输出不仅与状态有关而且与输入有关。在FPGA状态机项目中,我们可以根据具体需求选择适合的状态机类型。 在设计FPGA状态机项目时,我们需要进行以下步骤: 1. 确定项目需求和功能描述,例如启动准备状态、启动测试、停止测试、查询测试结果、显示测试结果等。 2. 根据需求和功能描述,设计状态机的状态转移图,即状态图。状态图可以用来描述状态之间的转移关系和相应的输入输出条件。 3. 使用Verilog编程语言来实现状态机的功能。根据状态图,我们可以定义状态寄存器和组合逻辑电路,以及相应的输入和输出信号。 4. 进行仿真和验证,确保状态机的功能和性能符合预期。 5. 将Verilog代码综合FPGA芯片中,并进行实际硬件验证和测试。 总结起来,FPGA状态机项目是通过使用FPGA来实现状态机功能的项目。在项目中,我们可以使用Verilog编程语言来描述和实现状态机的功能,并根据具体需求选择适合的状态机类型。通过仿真和验证,我们可以确保状态机的功能和性能符合预期。最后,将Verilog代码综合FPGA芯片中,进行实际硬件验证和测试。 #### 引用[.reference_title] - *1* *2* [FPGA状态机](https://blog.csdn.net/weixin_46129506/article/details/124596358)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [FPGA状态机简单测试](https://blog.csdn.net/m0_49297422/article/details/124569044)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值