网站首页 > 基础教程 正文
一、什么是有限状态机
有限状态机(简称状态机)相当于一个控制器,它将一项功能的完成分解为若干步,每一步对应于二进制的一个状态,通过预先设计的顺序在各状态之间进行转换,状态转换的过程就是实现逻辑功能的过程。
二、为什么使用状态机
使用状态机有以下好处:
1、有限状态机克服了纯硬件数字系统顺序方式控制不灵活的缺点。
2、设计方案相对固定,结构模式简单,可定义符号化枚举类型的状态。
3、状态机的HDL描述层次分明,结构清晰,易读易懂。
4、状态机容易构成性能良好的同步时序逻辑模块。
5、在高速运算和控制方面,状态机更有其巨大的优势。基于有限状态机技术设计的控制器其工作速度大大优于CPU。
6、就可靠性而言,状态机的优势也是十分明显的。基于有限状态机技术设计的控制器其可靠性也优于CPU
三、状态机的一般结构
FSM用来解决一般时序逻辑电路问题,包括
1、同步/异步时序逻辑
2、状态寄存器
–当前状态(现态)寄存器
3、组合逻辑电路
–下一状态(次态)组合逻辑
–输出组合逻辑
四、常用的状态机
1、Moore型:输出信号仅与现态相关
2、Mealy型:输出信号与现态和输入相关
3、mealy 状态机example
4、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。
状态机设计是FPGA设计中常用的设计,希望对FPGA初学者有所帮助。
猜你喜欢
- 2024-10-31 硬件描述语言 硬件描述语言verilog
- 2024-10-31 verilog快速入门之例五 verilog从入门到精通
- 2024-10-31 verilog实例(五) verilog技巧
- 2024-10-31 大规模数模混合电路建模验证分析:理论,方法,工具
- 2024-10-31 国内芯片人才培养问题凸显,IC修真院到底在教什么?
- 2024-10-31 Hello FPGA! Verilog的语法1 fpga hello world
- 2024-10-31 终于讲清楚了,看完这篇你也可以设计CPU了
- 2024-10-31 verilog实例(四) verilog程序实例
- 2024-10-31 你真的理解Verilog 中的module吗?
- 2024-10-31 「课程上新5.9折」Verilog基础与典型数字电路的设计
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- 单例 (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)