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

FPGA 三段式状态机的问题

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
5 L; y+ Y* q2 h% @8 j
//第一部分说明初始状态,和current_state<=next_state
, Y- |9 ]$ Z8 x' K- l  H* i: B: Q, t        //每一个时钟沿产生一次可能的状态变化
' K7 A% n! ]; X3 S9 }5 [2 @        always@(posedge clk or negedge rst_n)9 s: G9 q- j2 u: J, f4 m+ ?( C
                if(!rst_n). L, r" ?* |5 J
                        cstate <= INIT;        //复位态' ~* O7 Y& A" |3 _1 J
                else, @1 B3 n; q, a/ U* u% ~
                        cstate <= nstate;
2 s$ t! h( g/ [; ^2 K0 P      
" P( W% T1 j0 G# I# t. _  T6 h* f$ t7 K' _& x: d/ @
        //第二部分,状态转移,产生下一状态的整合逻辑$ p3 \5 n! H8 x
        //状态的跳转: `6 K& V& |# ~7 X: P
        always@(cstate or time_ones or pdh_ok or locked)0 }$ U# b( l3 j, B
                begin  z$ E3 d2 \8 u& U3 F
                       3 ]# q0 w+ h/ @" t: q$ L" H" c
                        case (cstate)       5 T0 Y2 \7 y: {+ K& e% b# ^2 e
                                IF_PDH_OK:        //PDH OK判断; w2 C9 H, K% q7 o' Z! C/ |
                                        begin0 e" n7 X1 B+ c% v" I7 q3 A
               
$ O5 y, a; d! f1 c                                                if(time_ones == T2S)        //2s
% i4 z- u$ a0 @' K* f                                                        begin* E& }) i: ]5 h6 Y3 E3 Q5 N0 z% q
                                                                 q0 l0 G( o) f% U! n! s9 @
                                                                if(pdh_ok_count >= PDH_OK_COUNT_N)        //真信号
& u& W# S- B5 t' L                                                                                nstate <= SEARCH_PDH_OK;        //搜索到pdh
! w( @6 y8 ^" p  g, Y3 U8 w7 n8 \                                                                `else
; l& N$ b4 U; |3 \% r/ A8 f! P                                                                                nstate <= WAIT;        //重新扫描3 J  C) U) B0 ~/ X: M, ?0 g
                                                                                       
2 g4 k( P; i: v( P' D5 n: K2 m# x                                                        end      
' v$ V. L9 N( \# i' [9 C                                                else" T- U# p" u- J6 u0 {! x
                                                        nstate <= IF_PDH_OK;
/ M/ e  W0 S* F" L. ]3 l                                                               
- [# H, J; v& p9 W                                        end$ s5 r- f; w8 B1 E, b

) [# _1 u/ B1 u: @+ V+ S
. C6 T8 G+ A/ o% R* z        //第三段,产生输出2 {* H% T$ P4 N2 x" }- A% V: v9 a
        always@(posedge clk or negedge rst_n)( p0 `3 x5 z0 m4 Z, j' Z6 p/ O
                if(!rst_n); t+ R7 f, c' [4 \4 t4 N( K
                        begin
; L% H' |9 a! b                       
5 W' z9 P4 r( {4 C                        end
: \4 k# `5 ]( \* |- f# u8 j' A                else! I" j# e9 x2 o3 c7 B) s
                        begin
: X0 b6 U2 H$ P/ h3 @                                case(nstate)" P7 Q: V4 G* F) w
9 R% t# ~0 X  U2 k
                                IF_PDH_OK:        //PDH OK判断6 g* S) r$ ^  P4 g/ B# e! N
                                        begin9 Y2 u* z+ g, _/ P( f
                                       
- R& {( }7 E5 @0 x1 I* c' Q                                                //锯齿波扫描延长2S
2 L2 u% [0 M( k4 R6 a                                                if(time_count == T1S)        //1s& `$ [$ b! u9 U; R! P& N# N4 [. k
                                                        begin
6 ^. ?; F4 P3 E0 F# K                                                                time_ones <= time_ones + 1'b1;
' U1 x- @3 B& F  ]                                                                time_count <= 32'd0;
# C7 @* r3 Q5 V* @                                                        end
9 D( R, R0 G! j                                                else
4 J+ _. q" g8 t4 x$ x0 N' A9 c                                                        time_count <= time_count + 1'b1;! K& d4 Q1 r# X3 Q% N) {
                                               + J$ `" Y" n: y( }$ N
                                                //清寄存器                                               8 G! i" Z( s( e" ~0 d. i
                                                if(time_ones == T2S)        //2s
. c4 Y+ ~) k; c                                                        begin7 c  m4 ?0 _9 y' N9 o% w' W
                                                                time_ones <= 0;
2 Z5 @4 `# Y# |# Z3 v, i                                                                pdh_ok_count <= 0;       % J% b' U) S* }% a
                                                               % \/ ^: T- ~, e) g
                                                        end       8 A1 g1 x, S- E6 K0 O
                       7 J+ K: M% G" t. ~! i
                                       
; e# Q* E+ [3 N7 G                                                //pdh误触发处理5 a, }: c. s+ l+ c
                                                //开始延时
8 P3 o5 r9 B# p3 i% c% n                                                if(pdh_ok_delay_flag == START)
, v$ P$ b! Z: U* y# y" U: ]                                                        begin
! U1 o, y6 [' U& G' W4 U                                                                if(pdh_time_count == T10MS)        //ms
& S8 Z2 N9 `! C* Z7 D                                                                        begin% W) U6 U3 d4 @
                                                                                pdh_ok_delay_flag <= END;
  @( t1 j' m2 ^2 U; w# h                                                                                pdh_time_count <= 32'd0;       - A/ a* Q3 ^7 X- d- J; B
                                                                        end9 j5 Q; x3 Y. g' s8 f3 D; u, u! s
                                                                else5 b" ~7 W% _3 G! G
                                                                        pdh_time_count <= pdh_time_count + 1'b1;+ A# r2 ]5 ~! ~9 e! c: k
                                                        end: U& c# r3 ^' b' {7 u) h0 X
                                                else
2 [9 m% Z" ~$ W+ H, F7 L                                                        begin
$ G/ E) D5 R1 p/ B  |                                                                if(pdh_ok == LOCK)
: q4 ?  h& G. a3 `5 H7 y' c& r                                                                        begin% N( W! d5 m+ R- E0 ?( [
                                                                                pdh_ok_count <= pdh_ok_count + 1'b1;! o$ U1 ^# v  A/ Q, w2 N9 }
                                                                                pdh_ok_delay_flag <= START;                                                                       
* x  n) ?( n7 v( z, }                                                                        end- O; F" ]3 d, F/ r
                                                        end
1 x' Y5 P, S! \6 b5 d+ q7 h                                                               1 l+ [8 u& W. M# D- G7 q" p
                                        end
7 @& Z) t! d8 k" l& ~/ L
% _" {) K+ d3 t! g0 O' _请教大神 ,8 p0 ]0 S3 Y# M3 Y8 b' `
我在第二部分,状态转移,产生下一状态的整合逻辑 IF_PDH_OK:        //PDH OK判断
7 {) n5 n' l2 D1 y$ j6 x6 p4 t) p7 X. @: ?& A) M9 b0 a
time_ones == T2S        同时 pdh_ok_count >= PDH_OK_COUNT_N 时将状态改变成nstate <= SEARCH_PDH_OK;        //搜索到pdh- i, Z6 D5 e: f8 }2 R: U$ H& @8 [

4 y% b6 _& |' N0 K9 V: \但有时并没有被进行状态跳转 还是 在IF_PDH_OK 里 if(pdh_ok == LOCK) 时pdh_ok_count  还在计数
4 h/ r" ~' N& Y8 p: J这是是为什么啊?
0 @- u' v" X1 m
, h; P* R6 A5 G  |# t) j# x! |% _同时我在第三段,产生输出的 IF_PDH_OK: 状态里对pdh_ok_count清零,但pdh_ok_count并没有被清零,这是什么原因啊/非常感谢!
8 t! E' _0 s2 W                                                //清寄存器                                               3 N, k5 h4 ~5 w. H
                                                if(time_ones == T2S)        //2s
! g5 w2 J0 C# n5 e: Y/ u                                                        begin
0 S7 `* [8 W) z, W( a( T+ d% t                                                                time_ones <= 0;
: E6 Q" P1 K  ^. z: `) [- z                                                                pdh_ok_count <= 0;       : b- {) Y: f, j: O" r9 O8 W
                                                               
4 M/ d: x' t6 v; G                                                        end      
8 }4 c  O' O9 D6 Z. T0 a4 t' N
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-3 15:57 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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