|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于状态机(一段式、两段式、三段式)的学习
$ G0 M) d, Z1 o三种写法对比:0 n5 `7 M3 t0 ^$ \: Q
* Q! ?7 m5 Y' y3 _# V1 p
(1)一段式状态机不利于维护(简单状态机可以用);
. v) n$ Z) t& q( f* o3 b& O4 Y6 e3 s, ~
(2)两段式状态机是常见写法,时序逻辑进行状态切换,时序逻辑实现各个输入、输出以及状态判断,利于维护,不过组合逻辑容易出现毛刺等常见问题;
W: m2 E6 y F: O4 @ N$ p+ |! U8 T* w) h2 T
(3)三段式状态机推荐写法,代码易维护,时序逻辑输出解决了两段式写法种组合逻辑的毛刺问题,但是耗费资源多一些且第三段 always 如果判断条件是 cs 从输入到输出比一段式和两段式会延时一个时钟周期。! v/ D/ l5 @, J' _
- P0 O6 H/ G/ ]' q/ i) z. T( v注意:
8 E q- `0 v2 L( @" e0 R8 P A- f
! @. G! J) w+ I三段式并不是一定要写为3个always块,如果状态机更复杂,就不止3段了。; ?; M, x5 `2 X, K A
三段always模块中,第一个和第三个always模块是同步时序always模块,用非阻塞赋值(“ <= ”);第二个always模块是组合逻辑always模块,用阻塞赋值(“ = ”)。
" C& |9 H Q; V: n第二部分为组合逻辑always模块,为了抑制warning信息,对于always的敏感列表建议采用always@(*)的方式。7 a8 B: P) l4 p4 {! D9 ]4 g2 J
第二部分,组合逻辑always模块,里面判断条件一定要包含所有情况!可以用else保证包含完全。
& e' S' n/ n: N: q1 Q1 W第二部分,组合逻辑电平要维持超过一个clock,仿真时注意。
9 O9 @) q3 X. l9 M; W+ L/ W' [需要注意:第二部分case中的条件应该为当前态(cs)。4 @0 P4 K7 O) P1 ]
第三部分case中的条件为次态(ns)或者当前态(cs),根据需求,若为当前态(cs)则延时一个时钟周期。) `& m* m% s* S( ^, [
编码原则,binary和gray-code适用于触发器资源较少,组合电路资源丰富的情况(cpld),对于FPGA,适用one-hot code。这样不但充分利用FPGA丰富的触发器资源,还因为只需比较一个bit,速度快,组合电路简单。7 D0 Z9 { T' R$ ?# T6 [
1、好的状态机标准
5 Z( O# \. k/ z" x9 j好的状态机的标准很多,最重要的几个方面如下:6 y. ]/ Y2 c( P* C; T. _! Y O
第一,状态机要安全,是指FSM不会进入死循环,特别是不会进入非预知的状态,而且由于某些扰动进入非设计状态,也能很快的恢复到正常的状态循环中来。这里面有两层含义:其一要求该FSM的综合实现结果无毛刺等异常扰动;其二要求FSM要完备,即使受到异常扰动进入非设计状态,也能很快恢复到正常状态。
" }! U, ^1 v' |4 N第二,状态机的设计要满足设计的面积和速度的要求。; f0 {7 b. W) ^; I
第三,状态机的设计要清晰易懂、易维护。9 ~& L) N; {2 W9 J) D
& x9 i* b$ I' C, R/ }% u 2、状态机描述方法. o Z; j" k3 a
状态机描述时关键是要描述清楚几个状态机的要素,即如何进行状态转移,每个状态的输出是什么,状态转移的条件等。具体描述时方法各种各样,最常见的有三种描述方式: o! p9 g9 Y8 O9 u! b! ?% r7 M( L
(1)一段式:整个状态机写到一个always模块里面,在该模块中既描述状态转移,又描述状态的输入和输出;% k/ h( n, T- W5 B
(2)二段式:用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出;5 f3 A6 {8 n* ~5 x
(3)三段式:在两个always模块描述方法基础上,使用三个always模块,一个always模块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。
, P6 h- ?( U \% B" U, H
+ t* t, {) _% L2 U$ X3 J一般而言,推荐的FSM 描述方法是后两种。这是因为:FSM和其他设计一样,最好使用同步时序方式设计,以提高设计的稳定性,消除毛刺。状态机实现后,一般来说,状态转移部分是同步时序电路而状态的转移条件的判断是组合逻辑。' X- Q2 Z% h% }$ t, g
: d! F5 B5 w" X0 u2 I( O5 q第二种描述方法同第一种描述方法相比,将同步时序和组合逻辑分别放到不同的always模块中实现,这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。
; l; P, \$ W7 Y5 _ }在第二种方式的描述中,描述当前状态的输出用组合逻辑实现,组合逻辑很容易产生毛刺,而且不利于约束,不利于综合器和布局布线器实现高性能的设计。
4 s% _ F7 U8 b" A/ y第三种描述方式与第二种相比,关键在于根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而在不插入额外时钟节拍的前提下,实现了寄存器输出。
5 e) C1 Q/ Y- A! M T9 r" E1 ^ U. T
0 a. Y. E4 `; P: V6 H' K# ]
' @/ v s' b+ m" K$ ?0 S. L' Q
|
|