请教,fpga状态机跑飞飞和跑死,如何解决

状态机 精讲 - CSDN博客
状态机 精讲
& &一直以来都是在用两段式状态机,觉得挺好用的,也挺顺手的。但是今天看了特权的博客觉得自己还真是井底的啦蛤蟆呀。
参考了网上的一些前辈blog和自己搜集到的资料,整理了一下读书笔记,虽然内容基本上都是别人写的,但是整理起来也好累 & = =
1. 有限状态机FSM(Finite State Machine)
组成元素:输入、状态、状态转移条件、输出;
可以分为两类:
Mealy状态机:时序逻辑的输出不仅取决于当前状态,还与输入有关;
Moore状态机:时序逻辑的输出只与当前状态有关;
描述方式:
① 状态转移图:设计分析时使用,工具自动翻译的代码效率不高,适合规模小的设计;对于大规模设计,HDL更好;
② 状态转移表;
③ HDL描述;
设计步骤:
① 逻辑抽象,得到状态转移图:确定输入、输出、状态变量、画状态转移图;
② 状态简化,得到最简的状态转移图:合并等价状态;
③ 状态编码:binary、gray、one-hot编码方式;
④ 用HDL描述;
2. Coding Style
状态机一般有三种写法,他们在速度、面积、代码可维护性等各个方面互有优劣。
一段式:只有一个always block,把所有的逻辑(输入、输出、状态)都在一个always block中实现;这种写法看起来很简洁,但是不利于维护。如果状态复杂一些就很容易出错。不推荐这种方法,但是在简单的状态机可以使用。
二段式:有两个always block,把时序逻辑和组合逻辑分隔开来。时序逻辑里进行当前状态和下一状态的切换,组合逻辑实现各个输入、输出以及状态判断。这种写法不仅便于阅读、理解、维护,而且利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。在两段式描述中,当前状态的输出用组合逻辑实现,可能存在竞争和冒险,产生毛刺。则要求对状态机的输出用寄存器打一拍,但很多情况不允许插入寄存器节拍,此时使用三段式描述。其优势在于能够根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而不需要额外插入时钟节拍。
三段式:有三个always block,一个时序逻辑采用同步时序的方式描述状态转移,一个采用组合逻辑的方式判断状态转移条件、描述状态转移规律,第三个模块使用同步时序的方式描述每个状态的输出。代码容易维护,时序逻辑的输出解决了两段式组合逻辑的毛刺问题,但是从资源消耗的角度上看,三段式的资源消耗多一些,且输出比另外两种会延时一个时钟周期。
三段式模板:
在三段式描述中,在第二个 always block判断状态转移的case使用的是当前状态CS,而第三个 always block同步时序输出的case使用的下一状态NS在第二个always block中代码开头NS有初值x,
有两个作用:第一,仿真的时候可以很好的考察FSM的完备性,如果不完备,则进入任意状态,仿真的时候可以很快发现;第二,实现时综合器对x的处理时“don't care”,即任何没有定义的状态寄存器向量(CS)都会被忽略,综合器为其生成的电路最简洁,同时满足要求。在第二个always block的case语句的default分支
设置“default: NS = 'bx”与实际硬件电路相一致。如果将缺省状态设置为某一确定的状态(例如:设置&default: NS = S1&,行不行呢?尽管综合器产生的逻辑和设置“default:state='bx”时相同,但是状态机的Verilog HDL模型综合前和综合后的仿真结果会不一致。因为启动仿真器时,状态机所有的输入都不确定,因此立即进入default状态。如果通过设置将状态变量设为S1,但是实际硬件电路的状态机在通电之后,进入的状态是不确定的,很可能不是S1的状态,这样就会产生不必要的冲突。因此,还是设置“default:
NS = 'bx”与实际硬件电路相一致。
状态机中状态变量初始化赋值:如果所有的状态都使用到了,可以使用x,它可以让综合器删除不必要的译码电路,使生成的电路简洁,并与设计要求一致,另外调试的时候很方便;如果状态没有使用完,有多余的状态,则不能使用x,应该设置为IDLE或者0。这样做能使状态机若偶然进入多余状态后仍能在下一时钟跳变沿时返回正常工作状态,否则会引起死锁。
在第三个always block中,输出结果在case前有默认值。默认值最好为0,这样可以避免latch的产生,不仅减少了代码量,而且强调显示了case内哪个输出发生了变化
1. 编码方式
常用的编码有三种:Binary、Gray、One-Hot编码。
Binary、Gray-code编码使用最少的触发器,较多的组合逻辑。而One-Hot 编码反之。由于CPLD更多的提供组合逻辑资源,而FPGA更多的提供触发器资源,所以CPLD 多使用Gray-code,而FPGA 多使用One-Hot编码。另一方面,对于小型设计使用Gray-code和Binary编码更有效,而大型状态机使用One-Hot更高效。
看Synplicity的文档,推荐在24个状态以上会用格雷码,在5~24个状态会用独热码,在4个状态以内用二进制码,肯定独热码比二进制码在实现FSM部分会占更多资源,但是译码输出控制简单,所以如果状态不是太多,独热码较好。状态太少译码不会太复杂,二进制就可以了。状态太多,前面独热码所占资源太多,综合考虑就用格雷码了。(Xilinx ISE 默认的FSM encoding algorithm值为auto,编写简单的
状态机测试,Binary的编码会被工具自动优化为One-Hot编码)
各编码的优缺点:
二进制码采用最简单的递增的编码方式对状态进行编码,对于n个状态的状态机,共需要 log2(n)个触发器表示所有的状态。在状态很多的情况下,可以大大减少触发器的数量,对设计的面积有积极的作用。但是在状态跳转过程中,很可能出现多位同时变化的情况,容易在 next state的生成逻辑上产生毛刺。同时,输出也是所有状态位的译码,译码逻辑多数很复杂,往往成为整个设计的关键路径。
格雷码类似二进制编码,但是采用了格雷码的编码方式,每两个相邻的状态只有一位信号变化,避免了next state上毛刺的产生。同时两个相邻状态的输出译码变得简单了,避免了复杂组合逻辑的产生。但是格雷码的这些优点都是建立在状态跳转是顺序执行的基础上的。如果状态机有很多随机跳转和分支,格雷码的实际效果和二进制码相差无几,优势荡然无存。
当然在设计中还可以采用复杂的编码方式,通过对状态跳转的分析,设计一套编码来避免二进制编码的缺点。这种做法工作量很大,而且设计不具有可维护性,实际设计中并不可取。
最后剩下的就是独热码了,也就是One-Hot。One-Hot编码方式是当前设计中最常用的状态机编码方式。One-Hot 编码在一组 0 中只有一个 1,对一个 n 个状态的 FSM 设计,需要 n 个触发器。但是在任意两个状态之间跳转都只有两位状态位变化,不会产生非常复杂的组合逻辑。各个状态之间的译码也相对简单。
编写一个很简单的状态机测试Binary & One-Hot encoding &RTL Schematic,结果如下,One-Hot方式综合出来的电路更加简洁。
P.S.&还有一种编码为 indexed One-Hot 编码,但是这种方式中的第二个always block中如果状态机跑飞,则很难回到正常状态,需要额外的逻辑进行判断,即indexed one-hot编码 + 逻辑判断才是完整的安全编码。
2. 避免产生latch
好的状态机设计时要有错误自动恢复的能力,即当进入错误的状态时,能自动的重新进入循环,避免出现&跑飞“的现象。
消除 FSM中 latches的最简易方法是在执行case语句前对输出值进行初始化赋值。
对应于编码就是对 case,if-else 语句要特别注意,要写完备的条件判断语句。, 使用“case”语句的时候要用“default”建立默认状态,使用“if-else”语句时要将所有需要判断的条件列出后,用“else”建立默认状态。
Verilog设计中可以使用”full-case“ ”parallel-case“指令来实现消除输出锁存。(一般情况下尽量不要使用这两条指令,仅在onehot状态机中使用)所谓 Full Case 是指:FSM 的所有编码向量都可以与 case 结构的某个分支或 default 默认情况匹配起来。如果一个 FSM 的状态编码是8bit,则对应的256 个状态编码(全状态编码是 2^n个)都可以与case 的某个分支或者default 映射起来。所谓 Parallel Case 是指:在 case 结构中,每个
case 的判断条件表达式有且仅有唯一的 case 语句的分支与之对应,即两者关系是一一对应关系。
3. 增加输出寄存器消除毛刺
有两个方法实现FSM输出状态寄存,一是将状态变量编码,每个输出是编码后的状态变量中的一位;二是使用三个always模块,一个 always模块采用同步时序的方式描述状态转移,一个采用组合逻辑的方式判断状态转移条件,描述状态转换规律,第三个 always模块使用同步时序电路描述每个状态的输出,又称三段式写法。
状态变量编码(摘录自《Coding And Scripting Techniques For FSM Designs WithSynthesis-Optimized, Glitch-Free Outputs》)...
4. FSM初始化
一个完备的状态机(健壮性强)应该具备初始化(reset)状态和默认(default)状态。FPGA上电后,GSR信号拉高,对所有的寄存器、RAM等单元复位/置位,这时配置于FPGA的逻辑并未生效,所以不能保证正确的进入初始化状态。一种简单的方法是采用异步复位信号,当然也可以使用同步复位,要注意同步复位的逻辑设计。另一种方法是将默认的初始状态的编码设计为全0(带初始状态为全0的One-Ho编码),这样当GSR复位后,状态机自动进入初始状态。
5. 参数定义使用parameter
因为`define宏定义方式在编译时自动替换整个设计中所有的宏,而parameter仅仅定义模块内部的参数,不会与其他模块的参数混淆。
6. Full-Case和Parallel-Case综合属性
Full Case:FSM的所有编码向量都与case结构的某个分支或default匹配起来。例如,一个FSM的状态编码是8'b,则有2^8=256种编码方式,都要与case的某一分支或default对应起来。不完整的case语句会产生latch。
parallel case:在case结构中,每个case的判断条件表达式有且仅有唯一的case分支与之对应。不平行的case可能会产生priority encode。
目前,知名的综合器如Synplify Pro等工具都支持这些综合属性。合理使用可以增强设计的安全性,改善状态机的译码逻辑,但是不当使用会占用大量的逻辑资源,恶化FSM的时序表现。Altera不推荐使用这两条约束语句,而应当在代码中满足这两条规则(Xilinx ISE默认的属性也为none)。综合考虑,仅在One-Hot编码中使用。
7. FSM的时序优化——输出逻辑优化和响应速度
输出采用寄存器驱动可以优化FSM的时序性能
影响一个时序电路运行速度的主要因素是两个寄存器之间的组合逻辑路径的长度,越长的组合逻辑路径,其时序性能越差。一个电路中的最长组合逻辑路径决定了这个电路最高运行速率,该路径就是这个电路的关键路径(critical path)。所以,切断最长的组合逻辑路径可以提高局部电路的运行速度,切断多个较长的组合逻辑路径可以提高整体电路的运行速度。切断组合逻辑路径的工具就是寄存器。所以,添加寄存器可以提高电路的性能,但是会增加资源的消耗,这也是速度(speed)和面积(area)互为矛盾的原因。
在考虑FSM的时序问题时,不能独立的考虑FSM本身,需要综合考虑FSM模块和下游模块构成的电路。在FSM不采用输出寄存时,在FSM模块和下游模块的接口处,是两部分组合逻辑直接相连。关键路径由两部分组合逻辑构成;在FSM采用输出寄存时,两个模块的组合逻辑被分隔成两部分,可能的关键路径被切断了。同步寄存器输出和组合逻辑输出就是采用资源优化还是速度优化的问题。组合逻辑表面上会提高电路的速度,看似节省了资源而且提高了速度,其实不然(对FPGA结构来说,节省寄存器不等于节省LE;对同步设计来说,异步输出速度上的优势是可以忽略的)。
输出采用寄存器驱动会降低输出队输入信号变化的响应速度?
到底应不应该采用FSM输出寄存器?是否必须在时序性能和响应速度之间做出取舍?在同步设计中,答案是必须牺牲一定的响应速度以换取更佳的时序性能,只考虑响应速度会带来潜在的时序性能损失。
在考虑FSM的响应速度时,不能独立的考虑FSM本身,需要综合考虑FSM模块和上、下游模块构成的电路。采用输出寄存器的电路可以运行在更高的时钟频率下,所引入的响应时延与更高的运行频率相比是可以牺牲的。
组合逻辑的实现——硬连线(hardwired)和微编码(microcoded)
参考资料:
1. foreveryoung 《状态机设计》
2. freeny &blog《Verilog HDL学习心得》&/freeny/archive//2447612.html
3. Clifford E. Cummings 《State Machine Coding Styles for Synthesis》
& &《The Fundamentals of Efficient Synthesizable Finite State Machine Design using NC-Verilog and BuildGates》
4. 《设计与验证——Verilog HDL》王诚 &EDA先锋工作室。
5. 《Verilog HDL程序设计与实践》 云创工作室。
本文已收录于以下专栏:
相关文章推荐
途牛原创|Android 中有限状态机的设计和应用
途牛无线中心 匡仁锦
有限状态机思想溯源
有限状态机的基本概念和编程思想
Android StateMachine 源代码解...
最近又碰到一个线上录单的系统。善于个
状态机思路在单片机程序设计中的应用
状态机的概念
状态机是软件编程中的一个重要概念。比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。
有限状态机又简称FSM(Finite-State Machine的首字母缩写)。这个在离散数学里学过了,它是计算机领域中被广泛使用的数学概念。是表示有限个状态以及在这些状态之间的转移和动作等行为的数学...
状态机概念术语State Machine:状态机,驱动带有region、transition和event信息的状态集合。
State:一个状态模拟一个具体的情况,在这个情况发生的期间,会保持一些不变...
有限状态机(Finite State Machine或者Finite State Automata)是软件领域中一种重要的工具,很多东西的模型实际上就是有限状态机。
最近看了一些游戏编程AI的材...
在学习状态机的过程中,不可避免的有一些重要的概念或知识点不断出现,因此做一个大概的总结,加深
作为一个码农按俺的抽象能力确实不咋的,难道和我出身农家有关,所以我总把复杂和抽象的问题简单化,具体化,大白话,恐怕别人听不懂。今天我就把另一种技术也大白话吧!
一个应用的只所以能够串起来,动起来就要...
ASP.NET技术的学习顺序问题        前前后后收到过一些学生的来信,询问ASP.NET的学习顺序问题,在此就向打算系统学习ASP.NET技术的初学者谈谈我的建议。 如果你已经有较多的面向对象...
要求:一个握手的模块,输入信号分别为en,ack,all_输出信号是req,要求如下en高电平有效时可以输出req信号,然后等待ack信号,收到ack信号后会发出done信号,模块...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)你的位置:
请教,状态机跑飞和跑死,如何解决?
[i=s] 本帖最后由 qd0090 于
20:19 编辑
用的是xilinx的spatan 3a
发现有个状态机工作不正常:
1.当我用ont-hot编码的时候,用chipscope观察,出现全是0的现象,我在状态机的when others中也加了状态的回复,但是还是不行。
2.然后我换了gray编码,这次状态停到了“011”就不走了,而这个状态仅仅起到一个延迟作用,没有任何条件语句。
程序平时是没有问题的,大概运行300次左右就出现一次跑飞。用FPGA1年了,属于初学者,从来没有遇到过这种问题。
请教个位高手,如何解决?
以下是代码
p_reg2:process(S_Lclk,reset)
if (reset='0') then
state1<=0;
S_ccs<='Z';
S_ads_o<='Z';
S_blast_o<='Z';
S_wr_o<='Z';
S_la_o'Z');
S_command'Z');
S_command_en
if S_PCI_usero='0' then
S_ads_o<='1';
state1<=1;
S_ccs<='Z';
S_ads_o<='Z';
S_blast_o<='Z';
S_wr_o<='Z';
S_la_o'Z');
S_command'Z');
S_command_en
S_ccs<='0';
S_ads_o<='0';
S_wr_o<='0';
S_la_o<=G_C8;
S_ccs<='Z';
S_ads_o<='1';
S_blast_o<='0';
S_ccs<='Z';
if S_ready_i='0' then
S_command<=pci_
S_command_en<='0';
if S_PCI_usero='1' then
S_command_en<='1';
state1<=0;
S_blast_o<='Z';
S_wr_o<='Z';
state1<=0;
end process p_reg2;
这个进程的时钟是我用40M分频产生的(不是用DCM,就是写了个简单的分频代码,即如果上升沿A<=not A),
它即作为本进程的时钟,又作为外部PCI LOCAL总线的时钟。
其它的进程采用的是40M时钟
状态机编码类型是在ise的综合选项中选的。原创于西周而后沿袭至今的彩礼,虽然被一部分家长奉为圭臬,但越来越多的年轻人对结婚必须要彩礼不以为然。彩礼引发的社会矛盾越来越受到关注,结婚是自己的事,如人饮水冷暖自知,至于要不要彩礼或者要多少彩礼,因人而异,因财力而已,不可一概而论。
在此可输入您对该资料的评论~
(window.slotbydup = window.slotbydup || []).push({
id: '4540180',
container: s,
size: '250,200',
display: 'inlay-fix'
热门资料排行
添加成功至
资料评价:
所需积分:1VHDL状态机设计,最全面的VHDL状态机设计文章 - 电子工程世界网
VHDL状态机设计
在电子工程世界为您找到如下关于“VHDL状态机设计”的新闻
VHDL状态机设计资料下载
全面地介绍了VHDL硬件描述语言的基本知识和利用VHDL进行数字电路系统设计的方法。全书共分13章:第1-6章主要介绍VHDL语言的基本语法知识;第7-9章介绍利用VHDL设计组合逻辑电路和时序逻辑电路(包括状态机)的基本方法;第10、11章简单扼要地介绍了VHDL设计中的仿真和综合的内容;第12章介绍ALTERA公司的MAX+PLUSII开发工具的使用;第13章...
VHDL状态机设计,如何设计一个可以通用的状态机,如何保证状态机的可维护性和可扩展性。...
采样系统中采用DAC实现量程自动转换(829)9.39 基于VHDL语言的数字频率计设计(830)9.40 基于VHDL语言的数字频率计的设计(830)9.41 CPLD在SPWM变频调速系统控制中的应用(830)9.42 ISP技术在交通控制器中的应用(830)9.43 基于ISP技术的有限状态机控制系统设计(830)9.44 如何使用ISP技术产生任意波形(830)9.45 打印控制卡的FPGA外围...
时序仿真5.2.6 硬件测试与硬件实现5.3 DSP Builder层次化设计DSP Builder的子系统(SubSystem)5.4 DSP Builder的状态机设计5.4.1 FIFO控制状态机设计示例5.4.2 状态机设计流程5.5 自动设计流程和SignalTap II的用法5.5.1 安装SignalTap II Node模块5.5.2 系统仿真和硬件测试5.5.3 信号节点的资源利用...
14.3.3 逻辑位操作符模块
14.3.4 逻辑总线操作符模块
14.3.5 LUT模块
14.3.6 n-to-1多路选择器模块
14.4 状态机函数库
14.4.1 FIFO控制状态机设计示例
14.4.2 状态机设计流程
14.5 Storage库
14.5.1 延迟模块
14.5.2 Down Sampling和Up...
Verilog and VHDL状态机设计,英文pdf格式State machine design techniques for Verilog and VHDLAbstract : Designing a synchronous finite state Another way of organizing a state machine (FSM) is a common task for...
VHDL状态机设计,Verilog and VHDL状态机设计……...
&&& 为了能够更简洁严谨地描述MTM总线的主模块有限状态机的状态转换,同时减少FPGA芯片功耗,提高系统稳定性,文中在分析MTM总线结构和主模块有限状态机模型的基础上,基于VHDL语言采用&单进程&式对该有限状态机进行了设计,并在QuartusⅡ开发软件中实现了对语言代码的编译及程序的时序仿真和功能仿真;通过对仿真波形图的分析验证了该状态机设计...
VHDL状态机设计,非常全面,状态机设计……...
第7章_VHDL有限状态机设计...
VHDL状态机设计相关帖子
其它的进程采用的是40M时钟
状态机编码类型是在ise的综合选项中选的。
[ 本帖最后由 qd0090 于
20:19 编辑 ] 请教,状态机跑飞和跑死,如何解决? 另外,状态机工作在低频情况下,20MHz。 信息量太少了吧?不过其实也很好回答:状态机设计有问题!!! 已经贴上代码了,请指教!
摁了半天空格分层,但是好像没有,请讲究这看吧,呵呵
[ 本帖最后...
跳转,但是在数据输出状态时没有数据输出。复位后状态由0跳转到8的过程很快,也无数据输出。用示波器检测同样结果。请问各位,这样的情况是什么原因引起? 状态机设计碰到的问题 以前不懂,看贴总是不回,一直没提升等级和增加经验;现在我明白了,反正回贴可以升级,也可以赚经验,还可以下载文档,我就把这句话复制下来,遇贴就回,捞经验就闪。...
、要读取的字节数、地址信号等。PCI9054:先通过LHOLD申请本地总线的控制权,SOPC系统通过LHOLDA响应,使PCI9054.获得本地总线的控制权。PCI9054将PCI地址空间映射到本地地址空间,接着启动本地总线的DMA传输。
  该系统采用VHDL语言,实现了DMA读传输本地端的时序控制状态机设计。状态0为空闲状态(i-dle),若LHOLD信号被置1,则转到状态1,否则留在状态...
: 从PCI时序分析入手,重点阐述了PCI通用的状态机设计,说明了用VHDL语言来实现本PIC通信状态机的软件设计以及进行MaxPlusII验证的程序和方法。用该方法所设计的接口既可支持PCI常规传输,又可支持PCI猝发传输。
& & 关键词: PCI时序 CPLD器件 状态图 VHDL语言 PCI猝发传输
& & 用 CPLD设计所构成的CPI接口系统...
摘要: 从PCI时序分析入手,重点阐述了PCI通用的状态机设计,说明了用VHDL语言来实现本PIC通信状态机的软件设计以及进行MaxPlusII验证的程序和方法。用该方法所设计的接口既可支持PCI常规传输,又可支持PCI猝发传输。
关键词: PCI时序 CPLD器件 状态图 VHDL语言 PCI猝发传输
用CPLD设计所构成的CPI接口系统具有简洁、可靠等优点,是一种行之有效的设计途径...
VHDL状态机设计视频
你可能感兴趣的标签
热门资源推荐状态机跑飞的惨案 - xieyaohaha的博客 - CSDN博客
状态机跑飞的惨案
&& 调这个nrf24l01模块差不多半个月的时间了,期间真是千难万阻,困难重重啊!每每以为调通了时候,一测试,不是发送不行了就是接收不行了,或者是时间一长就莫名其妙地断开了,再也不能自动连接上!
我将发送和接收写在同一个模块里,通过模式切换信号来切换,一开始就是用使能了自动应答的方式来调试的,代码前前后后改写了个无数版本。最痛苦的是刚开始就使用Signaltap II来调试的,谁知signaltap II并不如官方宣传的那么好用,简直是个大坑,会对需要进行采集的信号产生莫名其妙的影响,就算用增量编译好像也改善不了!我调试时用它采集一个通知spi模块开始写数据的使能信号en_singnal,结果工作就不正常了,从采集到的信号上看是在一个状态里其他的赋&#20540;语句都成功了,唯独en_signal不成功,由于是新手,根本就没怀疑到是singaltap
ii的问题,还以为是射频模块会对FPGA芯片产生干扰,导致电路异常。
& & 不断的调,最后是在有些频道发送能成功,接收不成功;而在另一些频道接收能成功,发送不成功。真是一筹莫展啊!各种问题都想到了,包括状态机跑飞的情况!但还是疏忽了中断信号这个幕后的大boss,一切都是它在捣&#39740;。原以为只是在状态机里判断中断信号的电平而不是脉冲,所以不用寄存器打拍子进行同步应该是没问题的。结果问题就出在这,用寄存器试着打了三拍后再进行判断,问题解决了!
& & 哎,这种心情一言难尽啊!
我的热门文章

我要回帖

更多关于 c 状态机 的文章

 

随机推荐