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

三段式状态机书写

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-10-29 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-6 15:06 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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