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

三段式状态机书写

[复制链接]

该用户从未签到

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

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-23 03:04 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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