找回密码
 注册
关于网站域名变更的通知
查看: 1089|回复: 1
打印 上一主题 下一主题

基于状态机(一段式、两段式、三段式)的学习

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-12 13:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
基于状态机(一段式、两段式、三段式)的学习
$ T( V2 K$ q  a$ Q
三种写法对比:
: c* l0 s4 ^3 N/ d! P( V! c+ @( R  N4 f
    (1)一段式状态机不利于维护(简单状态机可以用);
& Z8 J! M  @5 N
- H4 F% X+ \/ o; \! W! z    (2)两段式状态机是常见写法,时序逻辑进行状态切换,时序逻辑实现各个输入、输出以及状态判断,利于维护,不过组合逻辑容易出现毛刺等常见问题;/ ?  ~* o3 |. o+ O2 A

8 `  F) s( `% u6 z    (3)三段式状态机推荐写法,代码易维护,时序逻辑输出解决了两段式写法种组合逻辑的毛刺问题,但是耗费资源多一些且第三段 always 如果判断条件是 cs 从输入到输出比一段式和两段式会延时一个时钟周期。# t2 g6 R# `* ^$ q$ }, z/ g

8 J% c. Q& A1 H3 {注意:
9 D3 A; x$ T$ b" L
6 ?5 [' M- Z" b3 [% V7 q7 n8 ?三段式并不是一定要写为3个always块,如果状态机更复杂,就不止3段了。! M( h! K) d7 ], y) ?; ?
三段always模块中,第一个和第三个always模块是同步时序always模块,用非阻塞赋值(“ <= ”);第二个always模块是组合逻辑always模块,用阻塞赋值(“ = ”)。! @- L( O$ t5 b9 d" E: X, q
第二部分为组合逻辑always模块,为了抑制warning信息,对于always的敏感列表建议采用always@(*)的方式。8 U2 d6 f9 q3 D
第二部分,组合逻辑always模块,里面判断条件一定要包含所有情况!可以用else保证包含完全。' c# K3 E% O- j. R" g
第二部分,组合逻辑电平要维持超过一个clock,仿真时注意。
2 a! W1 ]% S1 o* n需要注意:第二部分case中的条件应该为当前态(cs)。
5 y' A, g, l* u) {; h, q第三部分case中的条件为次态(ns)或者当前态(cs),根据需求,若为当前态(cs)则延时一个时钟周期。6 F8 n; l. \, `7 L, J
编码原则,binary和gray-code适用于触发器资源较少,组合电路资源丰富的情况(cpld),对于FPGA,适用one-hot code。这样不但充分利用FPGA丰富的触发器资源,还因为只需比较一个bit,速度快,组合电路简单。+ j2 ~( i" e  q1 B4 A$ j) r; w
     1、好的状态机标准! x/ p7 K. @) ^7 K& k
好的状态机的标准很多,最重要的几个方面如下:
7 s2 s  R2 |* A第一,状态机要安全,是指FSM不会进入死循环,特别是不会进入非预知的状态,而且由于某些扰动进入非设计状态,也能很快的恢复到正常的状态循环中来。这里面有两层含义:其一要求该FSM的综合实现结果无毛刺等异常扰动;其二要求FSM要完备,即使受到异常扰动进入非设计状态,也能很快恢复到正常状态。3 j7 u: a+ \+ ~& Y
第二,状态机的设计要满足设计的面积和速度的要求。: R6 Z; V2 b8 a+ m% G
第三,状态机的设计要清晰易懂、易维护。) \/ M* ]* I/ p
# v- y3 f1 j3 f- |' P5 g; A
  2、状态机描述方法: O( `. C) y1 v+ B
状态机描述时关键是要描述清楚几个状态机的要素,即如何进行状态转移,每个状态的输出是什么,状态转移的条件等。具体描述时方法各种各样,最常见的有三种描述方式:
' r8 p1 M8 C% g9 y/ D2 o(1)一段式:整个状态机写到一个always模块里面,在该模块中既描述状态转移,又描述状态的输入和输出;1 M) p3 C9 M! G+ V5 b  u7 U1 |6 _, `
(2)二段式:用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出;- G* n* D- d) a( S# F) k# |
(3)三段式:在两个always模块描述方法基础上,使用三个always模块,一个always模块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。$ q0 z/ a. [( Z' h
3 h; M% |( W& ]( Q2 ^: O
一般而言,推荐的FSM 描述方法是后两种。这是因为:FSM和其他设计一样,最好使用同步时序方式设计,以提高设计的稳定性,消除毛刺。状态机实现后,一般来说,状态转移部分是同步时序电路而状态的转移条件的判断是组合逻辑。
8 N# o! h. G) y( Y$ e% F+ q& }4 v3 g, u: L; W  X9 T" }
第二种描述方法同第一种描述方法相比,将同步时序和组合逻辑分别放到不同的always模块中实现,这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。
# N4 r, r6 W* R3 E在第二种方式的描述中,描述当前状态的输出用组合逻辑实现,组合逻辑很容易产生毛刺,而且不利于约束,不利于综合器和布局布线器实现高性能的设计。/ v- m( b; h. L" I" J
第三种描述方式与第二种相比,关键在于根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而在不插入额外时钟节拍的前提下,实现了寄存器输出。; u( i  j1 h+ v! ^

( t& ~3 s; G, ^. S7 L" ]% Z! n7 C0 K5 u- o& B0 n7 F
% K7 p2 v9 ]3 ]+ T

该用户从未签到

2#
发表于 2019-3-12 14:53 | 只看该作者
这个划分的细啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-28 13:11 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表