FPGA——三段式状态机(1)
状态机全称是有限状态机(Finite State Machine、FSM),是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。状态机可根据控制信号完成预定的状态转换,由组合逻辑电路和寄存器组成,可由状态转换表或状态转换图描述。
输出只和当前状态有关而与输入无关成为Moore型状态机,输出和当前状态、输入都有关称为Mealy型状态机。
1、状态机标准
好的状态机的标准很多,最重要的几个方面如下:
第一,状态机要安全,是指FSM不会进入死循环,特别是不会进入非预知的状态,而且由于某些扰动进入非设计状态,也能很快的恢复到正常的状态循环中来。这里面有两层含义:其一要求该FSM的综合实现结果无毛刺等异常扰动;其二要求FSM要完备,即使受到异常扰动进入非设计状态,也能很快恢复到正常状态。
第二,状态机的设计要满足设计的面积和速度的要求。
第三,状态机的设计要清晰易懂、易维护。
2、状态机描述方法
状态机描述时关键是要描述清楚几个状态机的要素,即如何进行状态转移,每个状态的输出是什么,状态转移的条件等。具体描述时方法各种各样,最常见的有三种描述方式。
2.1 一段式状态机
将整个状态机写到 1 个 always 模块里面,在该模块中即描述状态转移,又描述状态的输入和输出,这种写法一般被称为一段式 FSM 描述方法。
缺点:A、不符合时序和组合逻辑分开描述的代码风格;B、不利于修改、维护;C、不利于附加约束;D、不利于综合器和布局布线器对设计的优化;E、代码冗长。
2.2 两段式状态机
用 2 个always 模块描述状态机,其中一个 always 模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律,这种写法被称为两段式 FSM 描述方法。
缺点:其输出一般使用组合逻辑描述,而组合逻辑易产生毛刺等不稳定因素。
2.3 三段式状态机
在两段式描述方法基础上,使用 3 个 always 模块,一个 always模块采用同步时序描述状态转移;第二个采用组合逻辑判断状态转移条件,描述状态转移规律;第三个 always 模块描述状态输出(可以用组合电路输出,也可以用时序电路输出)。三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器,然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件。
优点:A、FSM做到了同步寄存器输出;B、消除了组合逻辑输出的不稳定与毛刺的隐患;C、更利于时序路径分组;D、在FPGA/CPLD等可编程逻辑器件上的综合与布局布线效果更佳。
实例:
//第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器
always @ (posedge clk or negedge rst_n) //异步复位
if(!rst_n)
current_state <= IDLE;
else
current_state <= next_state; //注意,使用的是非阻塞赋值
//第二个进程,组合逻辑always模块,描述状态转移条件判断
always @ (current_state) //电平触发
begin
next_state = x; //要初始化,使得系统复位后能进入正确的状态
case(current_state)
S1: if(...)
next_state = S2; //阻塞赋值
...
endcase
end
//第三个进程,同步时序always模块,格式化描述次态寄存器输出
always @ (posedge clk or negedge rst_n)
...//初始化
case(next_state)
S1:
out1 <= 1'b1; //注意是非阻塞逻辑
S2:
out2 <= 1'b1;
default:... //default的作用是免除综合工具综合出锁存器
endcase
end
两段式有限状态机与三段式有限状态机的区别
FSM将时序部分(状态转移部分)和组合部分(判断状态转移条件和产生输出)分开,写为两个always语句,即为两段式有限状态机。
将组合部分中的判断状态转移条件和产生输入再分开写,则为三段式有限状态机。
区别:
二段式在组合逻辑特别复杂时适用,但要注意需在后面加一个触发器以消除组合逻辑对输出产生的毛刺。三段式没有这个问题,由于第三个always会生成触发器。
3、状态机的种类
状态机分摩尔(Moore)型有限状态机与米利(Mealy)型有限状态机。
3.1 摩尔(Moore)型有限状态机
Moore有限状态机输出只与当前状态有关,与输入信号的当前值无关。在时钟脉冲的有效边沿作用后的有限个门延后,输出达到稳定值。从时序上看,Moore状态机属于同步输出状态机。Moore有限状态机最重要的特点就是将输入与输出信号隔离开来。
3.2 米利(Mealy)型有限状态机
Mealy状态机的输出是现态和所有输入的函数,随输入变化而随时发生变化。从时序上看,Mealy状态机属于异步输出状态机,它不依赖于时钟。
4、注意
1.编码原则
binary和gray-code适用于触发器资源较少,组合电路资源丰富的情况(CPLD),对于FPGA,适用one-hot code。这样不但充分利用FPGA丰富的触发器资源,还因为只需比较一个bit,速度快,组合电路简单。
2.FSM初始化问题
GSR(Gobal Set/Reset)只是在加电时清零所有的reg和片内ram,并不保证FSM能进入初始化状态,要利用GSR,方案是适用one-hot code with zero idle,即初始状态编码为全零。已可以适用异步复位rst
3.FSM输出可以适用task
4.FSM中的case最好加上default,默认态可以设为初始态
5.尤其注意:
第二段的always(组合部分,赋值用=)里面判断条件一定要包含所有情况!可以用else保证包含完全。
6第二段always中,组合逻辑电平要维持超过一个clock,仿真时注意。
FPGA——三段式状态机(1)相关推荐
- fpga时序逻辑(三段式状态机模板、rom实现、边沿检测)
目录 VL21 根据状态转移表实现时序电路 VL22 根据状态转移图实现时序电路 VL23 ROM的简单实现 VL24 边沿检测 VL21 根据状态转移表实现时序电路 题目分析: 1.使用三段式状态机 ...
- 三段式状态机_Verilog实战篇(5)——FIFO amp; 状态机
今天的暑期培训课依旧是由邸志雄老师主讲:FIFO基本原理及状态机的编写和应用. 下面先说一下FIFO: 一.FIFO 常见参数主要有: 1. FIFO的宽度:即 FIFO 一次读写操作的数 ...
- 三段式状态机_FPGA笔试题——序列检测(FSM状态机)
FSM有限状态机,是FPGA和数字IC相关岗位必须要掌握的知识点,在笔试和面试中都非常常见. (1)了解状态机:什么是摩尔型状态机,什么是米利型状态机,两者的区别是什么?一段式.二段式.三段式状态机的 ...
- DSP嵌入式C语言状态机,三段式状态机描述及模版
三段式状态机描述及模版 [复制链接] 本帖最后由 Aguilera 于 2018-11-10 20:23 编辑 时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为 ...
- 三段式状态机-FSM
三段式代码多,但是有时钟同步,延时少,组合逻辑跟时序逻辑分开并行出错少. (1)同步状态转移 (2)当前状态判断接下来的状态 (3)动作输出 如果程序复杂可以不止三个always .always ...
- 一段式、两段式以及三段式状态机(FSM)设计实例
一段式.二段式以及三段式状态机(FSM)设计实例 状态机(FSM)分类 状态转移的三种编码方式 一段式.两段式状态机(FSM)区别 vivado与modelsim联调显示状态机 设计实例 状态转移图 ...
- 基于verilog的三段式状态机
三段式状态机的优势:三段式描述方法与一段式和两段式状态机描述相比,虽然代码结构复杂了一些,但是换来的优势是使FSM(Finite State Machine)做到了同步寄存器输出,消除了组合逻辑输出的 ...
- 小梅哥三段式状态机按键消抖改写
小梅哥三段式状态机按键消抖改写 小梅哥资料中按键消抖部分是用一段式.二段式状态机写的.我用三段式状态机改写了一下,仿真和板载测试通过. 代码记录如下: module key_filter1(input ...
- 重迭式三段式状态机序列检测器-检测10110110
重迭式三段式状态机序列检测器-检测10110110 要求:序列检测器 clk input clock input rst_n input asynchronous reset, low active ...
- SJA1000 CAN总线verilog写的SJA1000 CAN总线控制器。 程序使用三段式状态机,对于语句均有箱子的中文注释
SJA1000 CAN总线verilog写的SJA1000 CAN总线控制器. 程序使用三段式状态机,对于语句均有箱子的中文注释,同时还有相关的文档说明. 可直接拿来使用,同时适合新手学习规范写作代码 ...
最新文章
- smo算法matlab实现
- ExtJS 4.2 第一个程序
- 洛谷 P1082 同余方程(同余exgcd)
- 底层实现红黑树_stl map底层之红黑树插入步骤详解与代码实现 | 学步园
- selenium java 滚动条_java+selenium使用JS、键盘滑动滚动条
- 计算机二级c语言公共基础题,计算机二级C语言笔试公共基础知识课后习题及答案...
- python文本进度条代码解释_python动态文本进度条的实例代码
- linux创建名称为学号的文件,Linux操作系统下用户管理及文件管理.doc
- 如何处理IE首页被篡改的问题
- wordpress 通过域名无法访问_使用WordPress搭建自己的内容发布平台
- php asp网站本地调试,php/asp网站程序本地调试工具
- 2019java后端面试集合篇最值得收藏的(一)
- Opencv之高效函数convertTo
- rational rose的下载和安装教程
- 建立城市安防系统 打造更安全智慧城市
- 推荐个边玩边学编程的游戏
- 码农在使用人脸识别开发套件中的硬件主板如何调用底层接口步骤
- 计算机一级word的知识点,计算机一级word操作知识点
- Franka Emika 机械臂在ROS下控制
- 解决在开发中修改tomcat的配置文件后,在ecplise启动tomcat后修改的配置文件会自动还原问题