|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
三段式状态机书写 ( H+ q) W7 N% n, b0 s. Z. d* e( u
常用的状态机分为一段式、二段式、三段式。
/ u7 [! T8 _' u+ N& Q0 d! S( E' J2 p大家对于一段式的写法并不陌生,初学FPGA的人都经常用一段式去写程序, }' j2 r, u$ B, d5 M4 m
三段式状态机的原理和源码,大家都可以在网上找到。网上的程序都是完整的程序,
. @3 g+ M8 Y# `8 T看起来比较啰嗦和麻烦,我这里只是简单的把三段式用代码的形式概括一下。& h9 i- W$ {1 f G- \
1.把下一状态给当前状态( o3 V( S M: f! \7 `* `8 w( h
always@(posedge clk, posedge rst)! \' u O! q$ e( o1 P' l) E
begin
5 c9 u7 z. I) q( v! T+ @! K3 ^* Y if(rst)0 i# z6 y7 [' Z3 I" q5 X: V, ]3 w
state <= S_IDLE;) ?/ J# E, A6 a6 P! @. E) H2 J7 O
else
5 r' S& B; B0 a/ Z9 Z6 w- S2 S K U state <= next_state;& F" `! E8 s ?5 d, A7 C' Z
end
. J- F( t. ~( B" p" Y r/ B2.根据条件给下一状态赋值& e( d3 L# ?: V4 G
always @(*)
2 \; n5 ]( n' e7 U5 \0 R7 u begin" y1 _- ]2 V5 h% ]+ A* L$ u$ k
case(state)
; x% s( g- V5 F5 ]- T" B0 j. ? S_IDLE: begin6 r4 \ @% W; d8 {
if(a)
& `/ j `+ r0 B2 E; O next_state = S_A;
, t% I6 R% [" o" a: h) {7 \5 j else if(b&valid_r)' t9 K+ @9 m6 H9 E. o/ n. f
next_state = S_B;
1 ^7 F" q+ h) E- S0 f; s else$ C2 P2 L' j d
next_state = S_IDLE;
/ G6 p/ E* z# \5 W8 J0 D1 d6 R, q end
+ w1 l5 c [( C- Z1 ` G S_A: begin
$ L6 C. {; s5 ?% N4 L if(c)! d- y+ D5 P H% z
next_state = S_IDLE;
& S- ~- T g5 Y% p7 N- M else
) x; r3 D; Q0 c, v, }$ {8 Q) ^ next_state = S_A;
2 V8 V1 m' c x( o/ B end
% ^# a3 c& s7 u6 d% Z) E default: begin
3 e! u' E- Q! q! s next_state = 'bx;
7 P8 ^8 ?& O& Q% Q4 c4 s end
# C1 f& [8 f: J5 ] endcase, W4 t- X1 [% m4 |) y
end4 j* b! n9 b2 |7 ]
3.根据下一状态做处理
4 c4 a9 w- V' x always@(posedge clk, posedge rst)
- W2 W# m5 p4 e! N+ U begin# c& Y$ P4 k# T7 S3 h |- N
if(rst) begin
/ t/ u( R8 Q4 R( w b <= 'bx;
2 O, P& M+ r' y( O$ h3 }7 R c <= 0;! w' {6 }1 ?. ]4 w7 B0 \* ?
end
# W) |6 {8 {! }: o: A% j. f8 i8 F else begin6 K6 N3 C# P, @- ~" n) f: R! z0 z `
case(next_state)
4 \. Q/ F: _5 h S_IDLE: begin, i# j$ c$ S. b' l( ?
- _' N8 |. g8 _& X' S c <= 0;
0 u. O; n Z( b6 k+ h end' x& P* E- f( P6 U
S_A,S_B: begin/ l5 w6 @# B# {4 S; e
b <= 1;
2 {* l. Z+ [& d# {9 y, e c <= 1;
/ h* e+ l+ w( v. V8 Y3 _ valid_r <= 1;. a& o6 ^. G, E# f
end
* K( [- }8 \9 R* P/ m1 k3 r S_C: begin
5 h. J V9 B- o6 P% K) J if(nnn) a: p( r- R- [; W: V! e+ W' j
- C2 y8 c4 w6 z; c* S else/ U; A- E& O5 g! f, Z
end3 F& `) N/ f9 j7 N6 W2 m2 [; a8 I
endcase
( m- G& Q3 [( v' b. v1 Z end; t$ t1 h; P7 t4 w9 }
end
+ g, w9 }' f1 `3 \
' }8 b/ @8 m$ |' }' B如果有不合理或者有想法的朋友请留言,大家一起去学习fpga,共同成长。 | ) ?7 L& V1 h# C- o: ]
) _7 r: A: R K% C" F1 d& u
, ^' V# _+ L6 _1 H! ~9 x/ U' E5 J* p9 N" E' ~- z! i6 y
9 ?3 V% |$ H. b( m$ Y2 T+ K; I
|
|