FPGA中状态机的稳定性
第一个:状态机输出信号填写问题,下面是我转载的一些能百度的到的东西。好像都比较正常。这里我还要强调的是,每个状态机的输出信号都需要全面。
举例:
always @ (posedge clk or negedge rst_n) 这里的状态机简单的描述,其实还有很多状态。
...//初始化 out3在s1 s2输出都是一样的,在状态跳转从s1跳到s2的
case(next_state) 时候out3会在s1处所存,所以就算在s2的地方不写一次out3 <= 1'b0 ;情况S1: 也是是输出0.对状态机要求高的话,需要这么写。
out1 <= 1'b1;
out2 <= 1'b0;
out3 <= 1'b0; //看这里
S2:
out2 <= 1'b0;
out2 <= 1'b1;
out3 <= 1'b0 ; //看这里
default:...
endcase
end
第二个:程序输出结构。看程序应该能懂,不需要太多解释吧。
举例:
always @ (posedge clk or negedge rst_n)
case (next_state)
S1:
out1 <= 1'b1; //看这里 所有的不受if控制的输出都要写到if的外面。
out2 <= 1'b0;
if (x)
out3 <= 1'b0;
else
out3 <=1'b1;
S2:
out2 <= 1'b0; //看这里
out2 <= 1'b1;
if (y)
out3 <= 1'b0;
else
out3 <=1'b1;
default:...
endcase
end
第三个。三段式(多段式)。简单描述就是将第三段的输出,在分为多段。
举例:(我不知道我这么写例子是否恰当,只能表达一个意思吧)
always @ (posedge clk or negedge rst_n)
case (next_state)
S1:
out1 <= 1'b1;
out2 <= 1'b0;
S2:
out2 <= 1'b0;
out2 <= 1'b1;
default:...
endcase
end
-------------------------------------------------------------------
always @ (posedge clk or negedge rst_n)
case (next_state)
S1:
if (x)
out3 <= 1'b0;
else
out3 <=1'b1;
S2:
if (y)
out3 <= 1'b0;
else
out3 <=1'b1;
default:...
endcase
end
第四个。状态机的拆分,讲连续变化的状态机,从大的状态机里面拿出来。我只能这么说,没办法举例子了。这里涉及的编程思想也比较多了,没法描述但是要有这个思想。
第五个。独热码好像有时候也不够稳定。你可以使用fifo来做状态缓存。当然这里只是理论概念,因为我还没写过,三段式,独热码,程序拆分后,还是不稳定的程序。但是如果以上内容你都做了,速度和稳定性还不够,你可以考虑的。主要的想法是这样的,fifo在多时钟域都可以良好的切换,就说明它的亚稳态现象很低,为什么状态机不稳定,就是对状态采样的时候,出现的问题。所以,它应该能做到更好的效果。
本人能力有限,但努力奉献我的知识,希望各位朋友可以快速成长。
-----------------------------------百度上截取--------------------------------------------------------------
Verilog有限状态机三段式描述方法
PART1
1、好的状态机标准
好的状态机的标准很多,最重要的几个方面如下:
第一,状态机要安全,是指FSM不会进入死循环,特别是不会进入非预知的状态,而且由于某些扰动进入非设计状态,也能很快的恢复到正常的状态循环中来。这里面有两层含义:其一要求该FSM的综合实现结果无毛刺等异常扰动;其二要求FSM要完备,即使受到异常扰动进入非设计状态,也能很快恢复到正常状态。
第二,状态机的设计要满足设计的面积和速度的要求。
第三,状态机的设计要清晰易懂、易维护。
2、状态机描述方法
状态机描述时关键是要描述清楚几个状态机的要素,即如何进行状态转移,每个状态的输出是什么,状态转移的条件等。具体描述时方法各种各样,最常见的有三种描述方式:
(1)一段式:整个状态机写到一个always模块里面,在该模块中既描述状态转移,又描述状态的输入和输出;
(2)二段式:用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出;
(3)三段式:在两个always模块描述方法基础上,使用三个always模块,一个always模块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。
一般而言,推荐的FSM 描述方法是后两种。这是因为:FSM和其他设计一样,最好使用同步时序方式设计,以提高设计的稳定性,消除毛刺。状态机实现后,一般来说,状态转移部分是同步时序电路而状态的转移条件的判断是组合逻辑。
第二种描述方法同第一种描述方法相比,将同步时序和组合逻辑分别放到不同的always模块中实现,这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。
在第二种方式的描述中,描述当前状态的输出用组合逻辑实现,组合逻辑很容易产生毛刺,而且不利于约束,不利于综合器和布局布线器实现高性能的设计。
第三种描述方式与第二种相比,关键在于根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而在不插入额外时钟节拍的前提下,实现了寄存器输出。
PART2
时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息。
状态机采用VerilogHDL语言编码,建议分为三个always段完成。
三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器,然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件。
三段式描述方法虽然代码结构复杂了一些,但是换来的优势是:使FSM做到了同步寄存器输出,消除了组合逻辑输出的不稳定与毛刺的隐患,而且更利于时序路径分组,一般来说在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会生成触发器。
设计时注意方面:
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
4FSM中的case最好加上default,默认态可以设为初始态
5.尤其注意:
第二段的always(组合部分,赋值用=)里面判断条件一定要包含所有情况!可以用else保证包含完全。
6第二段always中,组合逻辑电平要维持超过一个clock,仿真时注意。
FPGA中状态机的稳定性相关推荐
- FPGA中状态机实现需要注意的地方
写状态机时需要注意的地方: 1.状态机的状态编码大概有三种:二进制编码,格雷码,独热码. 其中二进制编码就是000.001.010.011.100这类的逐渐加一 格雷码就是相邻两个 ...
- FPGA/CPLD状态机稳定性研究
摘要 在FPGA/CPLD设计中频繁使用的状态机,常出现一些稳定性问题,本文提出了一些解决方法,实验表明该方法有效地提高了综合效率. 随着大规模和超大规模FPGA/CPLD器件的诞生和发展,以HDL( ...
- 【 FPGA 】状态机,FPGA的灵魂
有关状态机的文章,事实上已经写过很多了,可是即使如此,真的懂了吗?真的能熟练应用吗?未必吧.这篇博文来源是<FPGA之道>,认真下看去收货颇丰! 借这个主题来梳理下状态机: 状态机简介 状 ...
- 【 FPGA 】状态机的模型之Moore型状态机
上篇博文:状态机,FPGA的灵魂,说到了状态机的基础知识,讲到了状态机的组成六要素,工作四要素. 这篇博文来讲状态机的模型之Moore状态机,从标题也能看出,状态机的知识并没有结束,后面还会提到Mea ...
- Verilog中状态机编码方式的选择:二进制编码(Binary)、格雷码(Gray-code)编码、独热码(One-hot)编码
一般的,在Verilog中最常用的编码方式有二进制编码(Binary).格雷码(Gray-code)编码.独热码(One-hot)编码. 二进制码和格雷码是压缩状态编码. 若使用格雷编码,则相邻状态转 ...
- 浅析SPI在FPGA中的应用
spi接口在FPGA中应用的要点 SPI(Serial Peripheral Interface)接口是一种同步串行通信接口,广泛应用于数字系统中,包括FPGA中.下面是SPI接口在FPGA中应用的要 ...
- verilog中状态机的三种编码方式的比较(二进制码、独热码、格雷码)
最近做了一个小项目,是关于状态机中三种编码方式的比较,总结了一下三种编码方式的不同,可以会在以后IC笔试面试过程中用到,简单记录一下三种编码方式的优缺点. 三种编码方式如下图所示:其中独热码只有一位为 ...
- FPGA中复位设计总结
复位 首先FPGA的复位,对于大部分设计而言,是很简单的.简单在于,只要按照固定方法:按键按下,复位有效一次,相关信号复位.这能解决大部分的问题.而对于其他大规模的复位设计,则需要对细节深究. 方式 ...
- FPGA中LVDS差分高速传输的实现
低压差分传送技术是基于低压差分信号(Low Volt-agc Differential signaling)的传送技术,从一个电路板系统内的高速信号传送到不同电路系统之间的快速数据传送都可以应用低压差 ...
最新文章
- Spring 面试问题 TOP 50
- 新型支架状电极允许人类思想操作计算机
- 《Adobe InDesign CS5中文版经典教程》—第1课1.7节使用上下文菜单
- opencv python 图片腐蚀和膨胀
- C# Socket案例(服务端与客户端)
- PHP+MySQL 跨服务器跨数据库数据拷贝系统
- 计算机积木游戏,乐高积木模拟器
- Spring Boot工程在IDEA中运行报错
- vue中axios的基本使用,天气查询案例
- gb2312和utf8 转换
- 【ANSYS SCDM】,软件介绍及基本操作
- 笔记本键盘进水失灵,禁用方法
- Activity子流程——调用子流程
- Word文档进入只读模式
- python实现对小说的文本分析(人物关系图,人物词云等)
- mm_struct(内存描述符)
- 数学管理联考-质数和合数
- Ubuntu20.04下安装显卡驱动
- 电机 输送机 机械手 提升机 发酵罐 减速机 破碎机
- 祈福、赏花、戏冰雪:春节北京公园将开展46项游园活动
热门文章
- 第三届福建省大学生智能车竞赛
- 服务器免密码传输文件,CentOS7,使用 scp 命令, ssh 连接方式,免密码传输文件到远程服务器,免密执行远程服务器上的 shell 脚本...
- android 拖动的view,Android实现随意拖动View效果
- python卸载opencv_怎么为python安装新版的opencv模块-百度经验
- java hello work_Java入门教程系列 – 第一个程序 “hello, world”
- tdk磁材手册_TDK的铁氧体磁铁(FB系列) - TDK Product Center.PDF
- initramfs 文件系统
- ubuntu 如何正确的更换更新源
- python多线程代码_Python多线程代码求改错
- 北京交通大学计算机科学与技术研究生导师,熊轲_北京交通大学研究生导师信息...