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

FPGA 三段式状态机的问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-5-20 11:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
, C( \/ R# I* c2 T6 ~0 v
//第一部分说明初始状态,和current_state<=next_state6 I# D( m; `7 X9 i) U9 V8 ~
        //每一个时钟沿产生一次可能的状态变化
) N( R& N. h' O3 {7 V, p# m7 @        always@(posedge clk or negedge rst_n)
# Q% w! a" V1 J                if(!rst_n)% I: u+ T" r8 G3 y- H5 I, h+ U6 n  x
                        cstate <= INIT;        //复位态% V  W8 B4 D" G6 h8 e$ r, [
                else  W' B5 e. v+ E& B( x4 v
                        cstate <= nstate;% W; P3 e  X, J) Q! ?
       . B) ~5 |; Q0 L6 `0 m  b/ p

7 S  {% H4 |, c; J- F2 p+ x        //第二部分,状态转移,产生下一状态的整合逻辑
# I% ?2 e# u1 E; {7 ]8 r- F% S        //状态的跳转
8 k6 I7 D$ k8 O  E; `* u3 |        always@(cstate or time_ones or pdh_ok or locked)
8 i. p( i+ Q" S$ {$ o# P; v! G( Q                begin6 y, q) c* y; S$ d2 j" U, h1 l/ @! v
                       
4 x1 J6 Y9 z( `& c0 h                        case (cstate)      
# G% t7 p& L* o3 x! I8 {( _                                IF_PDH_OK:        //PDH OK判断
$ q2 C, R- B- y                                        begin
4 a: I! U& t( X9 n& J               
  k1 m0 i2 D/ Y( B" @                                                if(time_ones == T2S)        //2s$ B* }& m' S9 B/ i. e* R
                                                        begin
& Z4 F( s2 a: q5 g; E# F$ [                                                               
% J1 C5 a  ]$ F# b2 V6 a                                                                if(pdh_ok_count >= PDH_OK_COUNT_N)        //真信号
) [; j- Y8 T4 m  {% W; m                                                                                nstate <= SEARCH_PDH_OK;        //搜索到pdh
& f; k3 `8 e- c) |  g                                                                `else
4 n) U/ B3 f; A- `0 D, m                                                                                nstate <= WAIT;        //重新扫描7 e; L* @$ j; j) D- i( i
                                                                                       
) ~# b- I4 Z1 g6 e# v/ ~                                                        end      
) f5 H- R" v  @8 Z. G! N% |                                                else" w) j8 z6 v, {- P' C
                                                        nstate <= IF_PDH_OK;% i3 e$ s! d, G* E7 X' f
                                                               
/ T) _( g; ?' G/ l                                        end
+ I2 K8 B  O# w/ ]% J( N- H7 ]2 _! B- l; X
& ]/ g7 _0 l2 D) |7 D8 A9 n
        //第三段,产生输出7 Z* X$ `. N6 f
        always@(posedge clk or negedge rst_n)/ F' o' {' }% D- _2 K) ^% Y
                if(!rst_n)
7 u8 G) O, c& Z: _+ u  v. A                        begin
" @# p9 Z; {7 L6 x                       
) x- j0 l% ^: `5 O. w                        end
3 h: H4 j7 E1 Q& N5 H. l                else6 K( [/ ~* t6 S: `1 X2 P" [
                        begin
" W* o8 [9 [" `# Q                                case(nstate)
1 p8 ~# h. p( v. O$ j+ u
6 [3 S! z% h/ I/ T                                IF_PDH_OK:        //PDH OK判断* a7 v( H0 p' x7 L' D
                                        begin
" N$ _2 O$ o- a% q                                       : [0 Q) C# [# i& K0 w! C2 E# y
                                                //锯齿波扫描延长2S9 ~/ i/ n: t7 _- _% t! ]
                                                if(time_count == T1S)        //1s
* D* N. v8 ~* N2 K# [2 K* {* l  Y  {                                                        begin
: i& i6 v: e# ~& Q5 H8 U- K' {                                                                time_ones <= time_ones + 1'b1;
3 C* P9 \& F, b: _; L$ D; ~3 g. c                                                                time_count <= 32'd0;1 M) n2 D! t0 o$ K, K! K
                                                        end
7 |6 W0 H! Q5 w# X                                                else; Y: V; E  n7 k! _* K/ R& [9 F
                                                        time_count <= time_count + 1'b1;
! l* D/ z  s1 x* i# v( m- a                                               
5 I8 Y. J! q5 p# X+ U$ ^1 T# w3 {                                                //清寄存器                                               
9 `7 Y. e+ ~/ S                                                if(time_ones == T2S)        //2s+ e* ?: o; e  u0 u2 b* o5 O& F
                                                        begin
  p3 Z3 B. `, H. n* H( r                                                                time_ones <= 0;
, H# m3 U4 p  C9 c& U                                                                pdh_ok_count <= 0;      
; z' H$ c/ {- {! x                                                               0 s7 V% U6 o, e1 S) I0 u+ d7 p
                                                        end      
* e3 |0 I6 r  O2 W                       
9 C7 p: _% k9 Q0 i5 c                                       
7 G: M8 J9 M. @* g1 |- X                                                //pdh误触发处理' Q' N. ?; Q2 R: E/ K
                                                //开始延时9 N, i. P; y* B& m
                                                if(pdh_ok_delay_flag == START)
6 A3 ~, F) L0 s5 p4 a% w9 h$ n: b                                                        begin5 E% p  i" E, b% p3 Q. v
                                                                if(pdh_time_count == T10MS)        //ms5 r+ L8 ^1 T+ C" n
                                                                        begin0 }0 U0 O& V: L, z
                                                                                pdh_ok_delay_flag <= END;
* ~1 n4 {) K( O4 J. k                                                                                pdh_time_count <= 32'd0;      
+ x9 v0 z2 f) Z  Q+ G                                                                        end2 @0 V7 s6 n# j. _
                                                                else; \: p# ?1 X1 X- L+ z7 }
                                                                        pdh_time_count <= pdh_time_count + 1'b1;% ?$ T/ Y1 T! R  d& ~% v0 J
                                                        end) M1 X/ l  k7 ^. v' X4 o
                                                else8 q2 g6 p* ]9 v6 r& t% Q  j
                                                        begin
! t& d: F1 a3 Q! H# {$ \" n                                                                if(pdh_ok == LOCK)* I! o. E9 \+ f1 A# g; C; j
                                                                        begin
' ^2 M" k* ?* N  z* }                                                                                pdh_ok_count <= pdh_ok_count + 1'b1;
+ |% j8 D( l, c' ?  \                                                                                pdh_ok_delay_flag <= START;                                                                       
, v' X% q. r& p1 D) l& J3 y                                                                        end
  i7 c, Z, {" F4 {                                                        end5 a" \) a, v8 z5 g
                                                               , J0 Y' x: P( b2 j
                                        end  j, h3 x7 f3 L& i/ E
; l* q0 q. z% k$ i) j, t) X  l
请教大神 ,3 Y& D6 l$ b  u6 L# b: a
我在第二部分,状态转移,产生下一状态的整合逻辑 IF_PDH_OK:        //PDH OK判断
8 }8 o0 I: g4 }8 H0 V
" g7 E* `/ U. V; r. J; gtime_ones == T2S        同时 pdh_ok_count >= PDH_OK_COUNT_N 时将状态改变成nstate <= SEARCH_PDH_OK;        //搜索到pdh- M: z. ^3 P' P  T

- L# u; h4 l% K# m, h但有时并没有被进行状态跳转 还是 在IF_PDH_OK 里 if(pdh_ok == LOCK) 时pdh_ok_count  还在计数
* ^' |2 {( U$ U这是是为什么啊?/ S7 [+ Y4 y( P; h

; V9 ?* B$ ^/ Q4 ?* Z# D9 T; z同时我在第三段,产生输出的 IF_PDH_OK: 状态里对pdh_ok_count清零,但pdh_ok_count并没有被清零,这是什么原因啊/非常感谢!
% l" |7 a- w; V& |- ]2 m* A( Y                                                //清寄存器                                               
: D7 K' J' f( I2 Y& Z2 q                                                if(time_ones == T2S)        //2s. a2 z( d1 D, g) v* I% T2 v
                                                        begin5 R7 X+ j8 A* p# q1 T# X
                                                                time_ones <= 0;
9 V$ V7 t/ y* c" P" Q+ o+ ~                                                                pdh_ok_count <= 0;         M' \: j2 y) f4 ]3 G
                                                               
, i% z! x+ K( |3 K; L7 A                                                        end       / v( g6 l, p3 I& @
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-4 08:46 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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