Verilong语言状态机 设计指导
### Verilog语言状态机设计指导 #### 一、状态机基础知识及分类 状态机(Finite State Machine, FSM)是一种常用的设计方法,广泛应用于数字电路设计领域。它通过一系列定义好的状态来描述系统的运行过程,每个状态都有明确的行为或输出。状态机在处理时序逻辑问题时具有很高的效率和清晰度,尤其是对于复杂的时序逻辑设计。 根据输出信号是否依赖于输入信号,状态机主要分为两大类: 1. **米里型状态机**:输出不仅取决于当前状态,还依赖于当前输入信号。 2. **摩尔型状态机**:输出仅由当前状态决定,与输入信号无关。 状态机的核心组成部分包括: - **输入**:系统外部输入信号,可能包含复位信号。 - **状态**:系统可能处于的不同状态,包括初始状态、正常工作状态等。 - **状态转移条件**:规定何时从一个状态转移到另一个状态的规则。 - **状态的输出条件**:在不同状态下,系统的行为或输出。 #### 二、状态机的设计方法与技巧 在Verilog语言中,状态机的设计方法和技巧多种多样,但可以归纳为以下两种基本方法: 1. **单模块法**:将状态转移、状态操作以及判断逻辑都放在同一个模块(如`always`块)中实现。 2. **双模块法**:将状态转移逻辑与状态操作逻辑分开,使用两个不同的`always`块来实现。 **双模块法**通常被认为是更好的设计方式,原因如下: - **同步时序和组合逻辑分离**:将状态转移逻辑(同步时序部分)与状态操作逻辑(组合逻辑部分)分离,便于理解和维护。 - **利于综合器优化**:这种方式更有利于综合工具进行代码优化。 - **便于添加时序约束**:使得添加时序约束更为直观和简单。 - **利于布局布线**:有助于实现更加高效的物理设计。 #### 三、状态机编码风格的选择 状态机的设计中,编码方式的选择也非常重要,常见的编码方式包括: - **二进制编码(Binary)**:使用较少的触发器资源,但组合逻辑较为复杂。 - **格雷码(Gray)**:相比于二进制编码减少了相邻状态之间的翻转次数,适用于中等规模设计。 - **独热码(One-hot)**:每个状态占用一个触发器,大大简化了状态转移逻辑,但触发器资源消耗较多。 **编码选择建议**: - 在CPLD设计中,通常选择格雷码编码,因为CPLD提供较多的组合逻辑资源。 - 在FPGA设计中,推荐使用独热码,因为FPGA提供了大量的触发器资源。 - 对于小型设计,使用格雷码或二进制编码更合适;而对于大型状态机,则独热码更为高效。 - Synplicity的文档推荐:24个状态以上使用格雷码;5~24个状态使用独热码;4个状态以内使用二进制码。 #### 四、设计注意要点 1. **避免生成锁存器**:确保状态机具备初始化(reset)状态和默认(default)状态。初始化状态用于系统启动时的状态设定,而默认状态则确保状态机能够在任何情况下都能正确地恢复到一个安全状态。 2. **健壮性**:状态机应具备“自恢复”功能,即在转移条件不满足或状态发生突变时,能够自动回到安全状态。在Verilog中,可以通过在`case`语句中添加`default`分支来实现这一点。 #### 五、编码实例与综合设置 在实际编码过程中,可以通过以下方式来设置状态机的编码风格: - **Verilog**:通过`synthesis`属性来指定编码方式,例如: ```verilog reg [2:0] state; // synthesis syn_encoding = "onehot" ``` - **VHDL**:通过属性设置来指定编码方式,例如: ```vhdl attribute TYPE_ENCODING_style of typename : type is ONEHOT; ``` 在使用Synplify进行综合时,可以选择“FSM compile”选项,即使使用二进制编码表示状态机,综合器也会自动将其综合为独热码形式。 状态机的设计不仅涉及到状态机的基本概念和分类,还需要考虑具体的设计方法、编码方式的选择以及编码中的注意事项。掌握这些基础知识和技巧对于设计高效且健壮的状态机至关重要。
- balldamon2012-03-03前边几页是中文的设计经验介绍,后边都是英文文献《The Fundamentals of Efficient Synthesizable Finite State Machine Design using NC-Verilog and BuildGates》,对于初学者来说还是不错的资料,代码不多,但都是verilog的规范化设计。
- 粉丝: 2
- 资源: 7
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助