|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于状态机(一段式、两段式、三段式)的学习 5 B. p* U& } E5 I- N1 A5 Y( j7 X
三种写法对比:
+ A9 l! V# ^; o1 c. h, e& f7 J3 L9 R4 M% Y3 A
(1)一段式状态机不利于维护(简单状态机可以用);
1 G1 `9 ]- C2 |' I: [# W
# M( I, z4 u" q0 U. a) R7 c1 Y7 _ (2)两段式状态机是常见写法,时序逻辑进行状态切换,时序逻辑实现各个输入、输出以及状态判断,利于维护,不过组合逻辑容易出现毛刺等常见问题;
9 T3 `; R# C+ H7 n; R
6 F, r, T C& y6 ~+ {: u* ~0 L (3)三段式状态机推荐写法,代码易维护,时序逻辑输出解决了两段式写法种组合逻辑的毛刺问题,但是耗费资源多一些且第三段 always 如果判断条件是 cs 从输入到输出比一段式和两段式会延时一个时钟周期。
p# @) n6 b3 L, T% g9 C& c: ^5 K
注意:
" [0 V1 A4 I9 \' ~
( ~6 A, y5 ~4 h: B% ]三段式并不是一定要写为3个always块,如果状态机更复杂,就不止3段了。
: E" h! z/ Q6 K3 a# V/ Q" Z: p2 V: L三段always模块中,第一个和第三个always模块是同步时序always模块,用非阻塞赋值(“ <= ”);第二个always模块是组合逻辑always模块,用阻塞赋值(“ = ”)。7 Y3 ~$ r! ], {2 c0 g5 M0 P
第二部分为组合逻辑always模块,为了抑制warning信息,对于always的敏感列表建议采用always@(*)的方式。1 f& o* b% W! [( O
第二部分,组合逻辑always模块,里面判断条件一定要包含所有情况!可以用else保证包含完全。& r3 h% U B$ b1 |3 n: Y
第二部分,组合逻辑电平要维持超过一个clock,仿真时注意。
0 |: H. G" e# K" ]需要注意:第二部分case中的条件应该为当前态(cs)。1 P! g+ Y) q) t) O$ {; [" V9 Z
第三部分case中的条件为次态(ns)或者当前态(cs),根据需求,若为当前态(cs)则延时一个时钟周期。3 V: D& `8 W6 a% B8 { C8 f
编码原则,binary和gray-code适用于触发器资源较少,组合电路资源丰富的情况(cpld),对于FPGA,适用one-hot code。这样不但充分利用FPGA丰富的触发器资源,还因为只需比较一个bit,速度快,组合电路简单。% U6 T# x; F8 K: d
1、好的状态机标准
; F, G( B7 y: T$ ~7 ?$ \7 s好的状态机的标准很多,最重要的几个方面如下:
& k, `, o& }3 R% z" E/ P1 N: A第一,状态机要安全,是指FSM不会进入死循环,特别是不会进入非预知的状态,而且由于某些扰动进入非设计状态,也能很快的恢复到正常的状态循环中来。这里面有两层含义:其一要求该FSM的综合实现结果无毛刺等异常扰动;其二要求FSM要完备,即使受到异常扰动进入非设计状态,也能很快恢复到正常状态。
8 x* j( o5 ^/ n/ x5 ~6 u第二,状态机的设计要满足设计的面积和速度的要求。
+ O; N) g, q$ \& ]7 x第三,状态机的设计要清晰易懂、易维护。+ v: y5 H! `6 ?- K5 G2 U
' K0 m8 R+ `$ e3 H 2、状态机描述方法/ I2 U$ ~( _8 E' s% \
状态机描述时关键是要描述清楚几个状态机的要素,即如何进行状态转移,每个状态的输出是什么,状态转移的条件等。具体描述时方法各种各样,最常见的有三种描述方式:
& c9 d- @( W6 x# {+ O(1)一段式:整个状态机写到一个always模块里面,在该模块中既描述状态转移,又描述状态的输入和输出;
* ~, I3 m$ o5 C9 f(2)二段式:用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出;
8 G1 y* v0 m) ~; k(3)三段式:在两个always模块描述方法基础上,使用三个always模块,一个always模块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。( O1 p, W" S; A0 M
1 k' I( R+ j1 |4 V一般而言,推荐的FSM 描述方法是后两种。这是因为:FSM和其他设计一样,最好使用同步时序方式设计,以提高设计的稳定性,消除毛刺。状态机实现后,一般来说,状态转移部分是同步时序电路而状态的转移条件的判断是组合逻辑。
( E$ F. n }7 U1 I
; ~) r9 g P$ p9 [+ S. W% g& P第二种描述方法同第一种描述方法相比,将同步时序和组合逻辑分别放到不同的always模块中实现,这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。9 g8 M e5 q% V7 p
在第二种方式的描述中,描述当前状态的输出用组合逻辑实现,组合逻辑很容易产生毛刺,而且不利于约束,不利于综合器和布局布线器实现高性能的设计。
* y/ u: @) ?+ ]; l# N7 m& e2 o第三种描述方式与第二种相比,关键在于根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而在不插入额外时钟节拍的前提下,实现了寄存器输出。
; a/ a. [: e$ ]6 q( u g2 d3 O! b3 p/ x/ w
3 Q9 F: B+ C2 Z* b3 {7 k3 I6 K5 |
; z0 h# e7 ~' g |
|