![58885282bc4a783fde6c41e0787faedb.png](https://i-blog.csdnimg.cn/blog_migrate/09807c6fa0cba0a7c724993ac2dd5d25.jpeg)
一、什么是有限状态机
有限状态机(简称状态机)相当于一个控制器,它将一项功能的完成分解为若干步,每一步对应于二进制的一个状态,通过预先设计的顺序在各状态之间进行转换,状态转换的过程就是实现逻辑功能的过程。
二、为什么使用状态机
使用状态机有以下好处:
1、有限状态机克服了纯硬件数字系统顺序方式控制不灵活的缺点。
2、设计方案相对固定,结构模式简单,可定义符号化枚举类型的状态。
3、状态机的HDL描述层次分明,结构清晰,易读易懂。
4、状态机容易构成性能良好的同步时序逻辑模块。
5、在高速运算和控制方面,状态机更有其巨大的优势。基于有限状态机技术设计的控制器其工作速度大大优于CPU。
6、就可靠性而言,状态机的优势也是十分明显的。基于有限状态机技术设计的控制器其可靠性也优于CPU
三、状态机的一般结构
FSM用来解决一般时序逻辑电路问题,包括
1、同步/异步时序逻辑
2、状态寄存器
–当前状态(现态)寄存器
3、组合逻辑电路
–下一状态(次态)组合逻辑
–输出组合逻辑
![cb238bba8f638bac99306e813f223e4d.png](https://i-blog.csdnimg.cn/blog_migrate/e70177a7bc648595a4c509b55a0d7591.jpeg)
四、常用的状态机
1、Moore型:输出信号仅与现态相关
![da99d10d1f17f9a7c74d05816c091e8a.png](https://i-blog.csdnimg.cn/blog_migrate/2062f306a7803912a54bf8a3056e3d34.jpeg)
2、Mealy型:输出信号与现态和输入相关
![fd1c16a45193af8c0de9d6372ed6e83e.png](https://i-blog.csdnimg.cn/blog_migrate/af7d7050349ea12e2df9466861c54711.jpeg)
3、mealy 状态机example
![7c1ad72182bb7eb461798fc294cd954e.png](https://i-blog.csdnimg.cn/blog_migrate/c9deef19ab6ecbca926f2325a679d18b.jpeg)
mealy 状态机example
4、moore 状态机example
![7341b48e695c48c8f0a0dcfd5354a19f.png](https://i-blog.csdnimg.cn/blog_migrate/fb01b8274dfd8be31c664d30295eb77b.jpeg)
moore 状态机example
五、状态机常用编码
1、二进制编码。是用N位二进制数,表示M个工作状态,当然必须满足2N大于等于M。
2、独热码编码方案。用N位二进制数表示N个状态,每一位编码对应一个触发器,状态机中的每个状态都由其中一个触发器的状态来表示。
Parameter Idle = 4’b1000,
Start = 4’b0100,
Stop = 4’b0010,
Clear = 4’b0001;
3、gray-code。每次状态跳转只有1bit发生变化。
二进制编码、gray-code 编码使用最少的触发器,较多的组合逻辑。而one-hot编码反之。由于CPLD 更多的提供组合逻辑资源,而FPGA 更多的提供触发器资源,所以CPLD多使用gray-code,而FPGA多使用one-hot 编码。另一方面,对于小型设计使用gray-code和binary 编码更有效,而大型状态机使用one-hot 更高效。
六、FSM 描述风格
用Verilog 语言描述有限状态机可使用多种风格,不同的风格会极大地影响电路性能。通常有3种描述方式:一段式、二段式和三段式。
一段式FSM把组合逻辑和时序逻辑用同一个时序always块描述,其输出是寄存器输出,无毛刺。但是这种方式会产生多余的触发器,代码难于修改和调试,应该尽量避免使用。
二段式FSM大多用于描述Mealy状态机和组合输出的Moore状态机,时序always块描述当前状态逻辑,组合逻辑always块描述次态逻辑并给输出赋值。这种方式结构清晰,综合后的面积和时间性能好。但组合逻辑输出往往会有毛刺,当输出向量作为时钟信号时,这些毛刺会对电路产生致命的影响。
三段式FSM大多用于同步Mealy状态机,两个时序always块分别用来描述现态逻辑和对输出赋值,组合always块用于产生下一状态。这种方式的状态机也是寄存器输出,输出无毛刺,并且代码比单always块清晰易读,但是面积大于二段式FSM。随着芯片资源和速度的提高,目前这种方式得到了广泛应用,但资源有限的话推荐二段式FSM。
![4829df26274c3f68b73a579bdc897091.png](https://i-blog.csdnimg.cn/blog_migrate/836a12b07f2c7ba10820eb6e1a847d01.jpeg)
三段式FSM 例子
状态机设计是FPGA设计中常用的设计,希望对FPGA初学者有所帮助。