|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
三段式状态机书写 ) U# h9 F/ y! M6 ?4 R1 y) ?* ^
常用的状态机分为一段式、二段式、三段式。/ g7 Z/ b' e" j) U9 I
大家对于一段式的写法并不陌生,初学FPGA的人都经常用一段式去写程序,
1 T6 O* M4 y: P" s4 Q9 Y三段式状态机的原理和源码,大家都可以在网上找到。网上的程序都是完整的程序,
! m* @+ X) ]% B S/ W看起来比较啰嗦和麻烦,我这里只是简单的把三段式用代码的形式概括一下。
: h7 l. Q* Z0 f. j1 F5 h2 S1.把下一状态给当前状态8 N, p2 M7 C* M& p
always@(posedge clk, posedge rst)7 l% @' s/ P7 N% j; k
begin
: S+ y. Q& r* v3 y5 K( e) a if(rst)
6 I8 y( i: }9 B3 M9 H state <= S_IDLE;1 ], ]% e; ?+ @4 x
else
! {) b2 E/ w7 B$ d t8 P3 x state <= next_state;
$ |& H; C" y2 M5 w& [ Y: f end$ j0 Z2 Z( t5 V6 W) J" u
2.根据条件给下一状态赋值: l. X+ G9 q: M( o9 Q8 N/ B
always @(*)
\9 t$ k6 I) E! y; \ begin6 v: r1 c& R: \% S$ N
case(state)
6 ]; T( {3 O G$ K7 a S_IDLE: begin
/ w; `5 R# Q* t" y5 ]. J0 ? if(a)" I2 g/ W9 M7 E# E" y% s2 i
next_state = S_A;
- p: {3 I3 H8 c6 b else if(b&valid_r)
; c9 D7 D+ W3 v* B7 [ I next_state = S_B;
, q$ q1 Z& S& c else
' b; N: T# z8 e) P next_state = S_IDLE; : u, C/ B2 I8 e( s2 X( Y/ g
end
7 @3 i+ T# }: k5 w9 {4 _ L" u S_A: begin; w4 \6 N( x& M/ G% z
if(c)( U7 }9 S+ X" G* o" n0 \' O/ i
next_state = S_IDLE;
# R5 i% i/ Y# x( T; \ else) P7 T1 t6 ^4 i7 q4 L. D
next_state = S_A;
0 E- l7 Y( r3 g- A8 Y: V) F end/ a6 L9 X! u$ h0 p
default: begin
9 x6 C! q& c# v$ r* Q7 Q next_state = 'bx;1 ^. N: t! ~0 G* n: t9 U
end
. z& f8 V1 _7 d& t. s M endcase
' L& o& S o5 ?0 W' ^4 y end
/ [# P9 \8 y2 z) B" P) [$ M: O 3.根据下一状态做处理4 X Y5 v8 k* p# _6 ]# J
always@(posedge clk, posedge rst)
, g" ]$ u+ K+ }! y* M begin, M! r. N( X; R- `
if(rst) begin6 |+ N$ E4 P- r( Q4 h! @0 O* P
b <= 'bx;
* u$ X# O' |+ \* o c <= 0;. F. f+ ~6 S" {8 U- @, v
end9 G! G; L/ q1 C5 B
else begin
: g) C2 O( o; N case(next_state)5 F. G1 {8 U L' a7 e! k
S_IDLE: begin4 q# r" l [& W6 k1 T7 z, G
! S4 p' N1 j/ @* \! j# e O, q
c <= 0;
3 W6 B0 X; d/ Q4 ~; W3 V end6 ~) G2 f* k6 t5 j {
S_A,S_B: begin: d6 f% `0 C: @% b8 r
b <= 1;
0 U* s) H1 x; V$ v) C8 j3 S/ G( o c <= 1;0 p- Z) Z1 p w1 B7 `" n
valid_r <= 1;7 L% W3 M% P: y) P4 \( e
end
9 i, |- z+ `$ N; R4 a" ] S_C: begin' F. c, B) B$ [! N- a, i) n
if(nnn)
( R9 z% T( Y: o6 ~$ D+ I ) Z- g" @: l8 u/ Q5 f' Q0 h( t
else
4 W/ R- g) Y% @# X. h end9 l" E3 P5 Q ^7 V2 I. ^
endcase
0 T `9 v& y* e- T, Z end
; t: N1 D+ L7 @ end
( b" x; Q: A i1 T6 X; L( }
) l* ]# y C5 F+ x1 Z如果有不合理或者有想法的朋友请留言,大家一起去学习fpga,共同成长。 |
; @0 m% N! m& i: Q, `+ r
9 A. x1 U# h2 g* q4 _% Y8 [
; d$ p5 Q$ P. o* g7 _8 } E/ g+ k7 o
+ i$ C3 O" i" W$ G2 Z7 {( _0 D |
|