码迷,mamicode.com
首页 > 其他好文 > 详细

如何写好状态机

时间:2021-04-10 12:56:02      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:建模   标准   规律   语言   一段   ril   复用   current   资源   

状态机的基本概念
如何写好状态机

状态机的基本概念

状态机是一种思想方法

状态机特别适合描述那些有发生先后顺序,或者有逻辑规律的事情——这其实也就是状态机的本质,即对具有逻辑顺序时序规律的事件的一种描述方法。
一般状态机的建模有两种思路:从状态变量入手,即先根据逻辑顺序或者时序规律划分状态,然后再从状态入手,逐个分析;首先明确电路的输出关系,这些输出相当于状态的输出,然后回溯各个输入的状态。
状态机不仅是一种描述电路的工具,更是一种方法,在HDL中写起来一般有特定的方式,比较规律,有章可循。

状态机的基本要素和分类

装填及有三种基本要素:输入、输出、状态。
根据状态是否与输入相关,分为摩尔型(Moore)和米莉型(Mealy)。
1.摩尔型指的是输出仅仅和当前所属的状态相关,输入只决定状态的转移关系,注意并非是没有输入(当然有的状态机确实可以没有输入,例如计数器)。
2.米莉型指的是输出不仅与当前的状态相关,更与状态的输入条件密切相关。

状态机的基本描述方式

状态机主要有三种描述方式:状态转移图,状态转移表,HDL语言描述。
1.状态转移图,这也是在学习数字电路中经常使用到的东西,有一些工具支持直接使用状态转移图进行输入。
2.状态转移列表,经常被用来作为化简的工具,但是注意,我们并不是常常需要化简,主要的矛盾往往在于稳定、安全
3.HDL语言描述状态机。

如何写好状态机

什么是好的状态机描述

1.FSM要安全,稳定性高:这是首要标准,安全稳定指的是FSM不会进入未知态,即使进入了未知态,也能自动地恢复到已知态。
2.FSM的速度要满足频率要求
3.FSM的面积要满足设计要求
4.FSM要清晰、易于维护。
以上四条的要求优先级是逐次递减的,必须优先考虑前面的标准。

状态机的常用语法

  1. reg/wire:一般肯定会用到的寄存器和线网类型变量
  2. parameter:参数,通常用于定义状态名称的编码,增强代码的可维护性和可读性。
  3. always块:在描述状态转移,输出等场景经常使用
  4. case/endcase:经常用于描述次态和当前状态的转移关系。为了提高安全性,避免走向死循环,一般需要有默认转移状态default:来保证不会陷入死循环。
  5. task/endtask:通常用于将不同状态对应的输出进行封装。

推荐的状态机描述方法

状态机的写法主要有三种:

  1. 将整个状态机写到一个always模块里,这种方法存在大量的冗余代码,而且把组合逻辑和时序逻辑放到一个块里面,这不利于代码的维护和综合。这一方法也称为一段式状态机,是不推荐的写法。
  2. 将状态机分为两个部分,一个部分描述同步的状态转移,另一个部分描述组合逻辑的状态转移条件,输出采用组合逻辑输出。这里就把组合逻辑和时序逻辑分开,有利于综合工具进行综合。这也称为两段式写法。
  3. 采用三个模块,同2相比,增加了一个同步输出模块,有利于改善电路的时序性能。这也称为三段式写法。
    但是注意:三段式写法未必就一定优于两段式写法,因为三段式写法实际上是把输出的组合逻辑后面加了一个寄存器作时序同步,从路径上说使得状态转移判断的组合逻辑和输出的组合逻辑(控制采用的是NS(next_state)正好是状态转移判断的输出)连接了起来,这实际上使得整个FSM的组合逻辑很可能变成关键路径。而两段式因为其输出采用的是组合逻辑输出,控制条件是CS(current state),从而通过状态转移的同步电路将两个组合逻辑分开了,至于输出同步问题可以在输出的组合逻辑之后再加入一个寄存器进行时序的同步。

这一部分的内容写起来比较抽象,建议结合书本的相关例子反复研读揣摩,并且做一些习题积累经验为好。

状态机设计的其他技巧

  1. FSM的编码:对于状态的编码有许多种方式,有的直接使用二进制编码,有的使用格雷码,有的使用独热码(one-hot code),即每个状态只有一位为1。独热码的好处在于处理非常快,但是小号很多资源存储。
  2. 初始化状态:对于数字电路来说,往往开机时所处的状态是不可知的,必须进行一次reset操作。增加默认状态和初始化状态能提高FSM的鲁棒性。
  3. FSM状态编码定义:状态编码可以使用parameter关键字而不应该使用`define,后者是编译指令,具有全局功能,会限制大模块中其他状态机状态的定义。
  4. FSM输出:对于一般的米利型状态机,使用”?“来判断就差不多了,如果输出逻辑较为复杂,推荐使用task/endtask将输出逻辑封装起来,也便于复用。
  5. 阻塞和非阻塞赋值:同之前谈过的一样,时序逻辑一定要使用非阻塞,组合逻辑一定要使用阻塞,否则容易出现数据冒险和竞争。

这一章看似内容不多,但是主要不是可以写出来的东西,都是需要实际锻炼揣摩的设计经验。

主要内容和示例来源:《轻松称为设计高手 Verilog HDL实用精解》;北京航空航天大学出版社;
推荐练习网站:https://hdlbits.01xz.net/wiki

如何写好状态机

标签:建模   标准   规律   语言   一段   ril   复用   current   资源   

原文地址:https://www.cnblogs.com/modered-study/p/14637429.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!