打印
[FPGA]

FPGA 三段式状态机 状态改变条件成立,实际状态并未改变...

[复制链接]
1079|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
whyil|  楼主 | 2018-1-29 17:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 whyil 于 2018-1-29 18:13 编辑

        //第一部分说明初始状态,和current_state<=next_state
        //每一个时钟沿产生一次可能的状态变化
        always@(posedge clk or negedge rst_n)
                if(!rst_n)
                        cstate <= INIT;        //复位态
                else
                        cstate <= nstate;
       

        //第二部分,状态转移,产生下一状态的整合逻辑
        //状态的跳转
        always@(cstate or time_ones or pdh_ok or locked)
                begin
                       
                        case (cstate)       
                                IF_PDH_OK:        //PDH OK判断
                                        begin
               
                                                if(time_ones == T2S)        //2s
                                                        begin
                                                               
                                                                if(pdh_ok_count >= PDH_OK_COUNT_N)        //真信号
                                                                                nstate <= SEARCH_PDH_OK;        //搜索到pdh
                                                                `else
                                                                                nstate <= WAIT;        //重新扫描
                                                                                       
                                                        end       
                                                else
                                                        nstate <= IF_PDH_OK;
                                                               
                                        end


        //第三段,产生输出
        always@(posedge clk or negedge rst_n)
                if(!rst_n)
                        begin
                       
                        end
                else
                        begin
                                case(nstate)

                                IF_PDH_OK:        //PDH OK判断
                                        begin
                                       
                                                //锯齿波扫描延长2S
                                                if(time_count == T1S)        //1s
                                                        begin
                                                                time_ones <= time_ones + 1'b1;
                                                                time_count <= 32'd0;
                                                        end
                                                else
                                                        time_count <= time_count + 1'b1;
                                               
                                                //清寄存器                                               
                                                if(time_ones == T2S)        //2s
                                                        begin
                                                                time_ones <= 0;
                                                                pdh_ok_count <= 0;       
                                                               
                                                        end       
                       
                                       
                                                //pdh误触发处理
                                                //开始延时
                                                if(pdh_ok_delay_flag == START)
                                                        begin
                                                                if(pdh_time_count == T10MS)        //ms
                                                                        begin
                                                                                pdh_ok_delay_flag <= END;
                                                                                pdh_time_count <= 32'd0;       
                                                                        end
                                                                else
                                                                        pdh_time_count <= pdh_time_count + 1'b1;
                                                        end
                                                else
                                                        begin
                                                                if(pdh_ok == LOCK)
                                                                        begin
                                                                                pdh_ok_count <= pdh_ok_count + 1'b1;
                                                                                pdh_ok_delay_flag <= START;                                                                       
                                                                        end
                                                        end
                                                               
                                        end

求助 ,
我在第二部分,状态转移,产生下一状态的整合逻辑 IF_PDH_OK:        //PDH OK判断

time_ones == T2S        同时 pdh_ok_count >= PDH_OK_COUNT_N 时将状态改变成nstate <= SEARCH_PDH_OK;        //搜索到pdh

但有时并没有被进行状态跳转 还是 在IF_PDH_OK 里 if(pdh_ok == LOCK) 时pdh_ok_count  还在计数
这是是为什么啊?

同时我在第三段,产生输出的 IF_PDH_OK: 状态里对pdh_ok_count清零,但pdh_ok_count并没有被清零,这是什么原因啊/
                                                //清寄存器                                               
                                                if(time_ones == T2S)        //2s
                                                        begin
                                                                time_ones <= 0;
                                                                pdh_ok_count <= 0;       
                                                               
                                                        end       


相关帖子

沙发
ucx| | 2018-1-31 19:50 | 只看该作者
由第二段明显看出:  在time_ones == T2S时nstate !=IF_PDH_OK
那么第三段:case(nstate)        IF_PDH_OK中怎么会有if(time_ones == T2S)  成立呢?
呵呵,真把verilog语言当做硬件设计语言来用了啊。HDL其实不过是硬件描述语言。

使用特权

评论回复
板凳
whyil|  楼主 | 2018-2-1 10:55 | 只看该作者
ucx 发表于 2018-1-31 19:50
由第二段明显看出:  在time_ones == T2S时nstate !=IF_PDH_OK
那么第三段:case(nstate)        IF_P ...

恩恩 是这个问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

49

帖子

0

粉丝