FPGA状态机三段式状态机和四段式的区别

他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)下次自动登录
现在的位置:
& 综合 & 正文
三段式状态机
[CPLD/FPGA]
状态机的组成其实比较简单,要素大致有三个:输入,输出,还有状态。
状态机描述时关键是要描述清楚前面提高的几个状态机的要素,即如何进行状态转移;每个状态的输出是什么;状态转移是否和输入条件相关等。
有人习惯将整个状态机写到一个always模块里面,在该模块中同时描述了状态转移,又描述状态的输入和输出。这种写法一般被称为一段式FSM描述方法;
还有一种写法是用2个always模块,其中一个always模块采用同步时序描述状态转移;另一个采用组合逻辑判断状态转移描述状态转移规律,这种写法
被称为两段式FSM描述;还有一种是在两段式基础之上发展出来的,这种写法使用3个always模块,一个always模块采用同步时序描述状态转移;第
二个采用组合逻辑判断状态转移条件,描述状态转移规律,第三个always模块使用同步时序电路描述每个状态的输出,这种写法成为三段式。
一般推荐后两种方法,也就是两段式和三段式。其原因为:FSM和其他设计一样,最好使用同步时序,以便提高设计的稳定性,消除毛刺。状态转移部分一般是同
步时序电路而状态的转移条件的判断是组合逻辑,之所以两段式比一段式更为合理,就在于它将时序逻辑和组合逻辑分别放到不同的always程序快中实现,这
样一来便于理解和阅读,二来利于综合器又换代码,更有利于用户添加合适的时序约束条件,利于布局布线器实现设计。
在两段式中,当前状态的输出是用组合逻辑实现的,这样的实现是有产生毛刺的可能性的,而且不利于约束。同样的原因,某些需要引入输出反馈的设计中,两段式会引入组合逻辑的反馈,使综合失败,这是要极力避免的。
三段式与两段式相比,关键在于根据状态转移规律,在上一状态根据输入条件判断当前状态的输出,从而在不出入额外的时钟节拍的前提下,实现了寄存器输出。
一个三段式的状态机大致如下:
module state (nrst,clk,sig1,sig2,out1,out2);input nrst,input sig1,sig2;output out1,out2;reg out1,out2;reg [2:0] NS,CS;parameter [2:0]
IDLE = 3'b000,
= 3'b010;//第一段,状态转换always @(posedge clk or negedge nrst)if(!nrst)
CS&= IDLE;else
CS&= NS;//第二段,组合逻辑判断always @(nrst or CS or sig1 or sig2)begin
NS = 3'//给出默认值
IDLE: beginif (sig1......) NS = IDLE;else NS = S1;end
beginif(.........)
NS = S1;else NS =
.....endcaseend//第三段,FSM输出always @(posedge clk or negedge nrst)if (!nrst)
{out1,out2}&= 2'b00;elsebegin
{out1,out2}&= 2'b00;
IDLE:......
S1:endcaseendendmodule
两段式其实就是将上述的第二段,第三段合一。
三段式写法可概括为如下图:
注意:一三段之中用&=,第二段中用=。
&&&&推荐文章:
【上篇】【下篇】Verilog奇偶分频、一段式、两段式、三段式状态机_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Verilog奇偶分频、一段式、两段式、三段式状态机
&&Verilog奇偶分频、一段式、两段式、三段式状态机
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩8页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢用一段式建模FSM 的寄存器输出的时候,必须要综合考虑现态在何种状态转移条件下会进入哪些次态,然后在每个现态的case 分支下分别描述每个次态的输出,这显然不符合思维习惯;而三段式建模描述FSM 的状态机输出时,只需指定case 敏感表为次态寄存器,然后直接在每个次态的case 分支中描述该状态的输出即可,根本不用考虑状态转移条件。本例的FSM 很简单,如果设计的FSM 相对复杂,三段式的描述优势就会凸显出来。
另一方面,三段式描述方法与两段式描述相比,虽然代码结构复杂了一些,但是换来的优势是使FSM 做到了同步寄存器输出,消除了组合逻辑输出的不稳定与毛刺的隐患,而且更利于时序路径分组,一般来说在FPGA/CPLD 等可编程逻辑器件上的综合与布局布线效果更佳。
下面以&101&序列检测器的FSM来说明三段式FSM的写法:
1 `timescale 1ns / 1ps
3 /////////////////////////////////////////////////////////////////
5 // Company: csic
7 // Engineer: shengyi
9 // Create Date:
15:24:44 09/16/2010
11 // Design Name:
seqcheck_fsm3
13 // Module Name:
seqcheck_101
15 // Project Name:
seqcheck_fsm3
17 // Target Devices: V5 220t
19 // Tool versions: ise 10.1
21 // Description: 借'101'序列检测器程序说明FSM的三段式写法
23 // Dependencies:
25 // Revision:
27 // Revision 0.01 - File Created
29 // Additional Comments:
31 /////////////////////////////////////////////////////////////////
33 //3-paragraph method to describe FSM
35 //Describe sequential state transition in the 1st sequential always block
37 //State transition conditions in the 2nd combinational always block
39 //Describe the FSM out in the 3rd sequential always block
41 module seqcheck_101(
parameter IDLE=4'b'b0010,S2=4'b'b1000;
reg [3:0] current_state,next_
//第一部分说明初始状态,和current_state&=next_state
//每一个时钟沿产生一次可能的状态变化
always @(posedge clk)
current_state&=IDLE;
current_state&=next_
89 //第二部分,状态转移,产生下一状态的整合逻辑
always @(din or current_state)
next_state&=4'
case(current_state)
if(din==1'b1)
next_state&=S1;
next_state&=IDLE;
if(din==1'b1)
next_state&=S1;
next_state&=S2;
if(din==1'b1)
next_state&=S3;
next_state&=IDLE;
if(din==1'b1)
next_state&=S1;
next_state&=S2;
next_state&=4'
//第三段,产生输出
always @(posedge clk)
dout&=1'b0;
case(next_state)
IDLE:dout&=1'b0;
S1:dout&=1'b0;
S2:dout&=1'b0;
S3:dout&=1'b1;
default:dout&=1'
阅读(...) 评论()42被浏览4,603分享邀请回答61 条评论分享收藏感谢收起}

我要回帖

更多关于 三段式状态机 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信