微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 三段式状态机,modelsim上仿真没问题,下载到板子上后,signaltab却显示与仿真不相符,可能是什么原因?

三段式状态机,modelsim上仿真没问题,下载到板子上后,signaltab却显示与仿真不相符,可能是什么原因?

时间:10-02 整理:3721RD 点击:
状态转移及条件全在always@(*),modelsim上状态转移都是对的,signaltab实板验证的时候状态转移却是乱的

代码结构是这样的:
//第一段
always@(posedge CLK_100M or negedge rst_n)
begin
        if(!rst_n) state_last <= S0;
        else state_last <= state_current;
end
//第二段
always@(*)
begin
        if(!rst_n) state_current <= S0;
        else
        begin
                case(state_last)
                        S0:   begin if(rst_n)       state_current = S1;         end
                        S1: begin if(条件1)   state_current = S2;                 end
                        S2:  begin if(条件2)   state_current = S3;         end
                        S3: begin if(条件3)   state_current = S4;                 end
                        S4:  begin if(条件4)   state_current = S5;  end
                        S5:;
                        default:;
                endcase
        end
end
//第三段
always@(posedge CLK_100M or negedge rst_n)
begin
        if(!rst_n)
             ......
            .
        else
            case(state_current)
                  S1:
                     ......
                      .....
                     条件1满足
                  S2:
                     ......
                      .....
                     条件2满足
                  S3:
                     ......
                      .....
                     条件3满足
                  S4:
                     ......
                      .....
                     条件4满足
                   S5:
                     ......
                      .....

            endcase
end

仿真可以的话一般就是时序问题了!你是不是状态跑飞了?检查一下你的跳转条件是不是都是CLK_100M 上的信号!你要保证你的跳转条件都是这个时钟域的才行!

你看我写的第三段,跳转条件都已经处在CLK_100M的这个always里面了,是你所说的处在时钟域吧?

恩,你的条件跳转信号是不是在100M这个时钟域上!

是的,是在啊,

就是说这些信号都用100M时钟打过拍了是吧,如果是别的时钟域的话要至少打两拍,如果都满足你就要查一下时序是不是报红了!还有一个办法你也可以试一下,把状态换成独热码!

改成独热码也不行,不太清楚你说的时钟域、打拍是什么意思,能解释一下吗?
always@(*)应该是组合逻辑吧,与时钟没关系

就是因为always@(*)是组合电路,所以这里面的信号都要是100M时钟域下的,要不就会出错,你可以试试改成1段式试试,我估计你的条件是不这个时钟域的!因为我以前遇到过!哈哈!

我状态都是通过parameter来定义的,我试了一下不用parameter来定义状态变量,直接用原始数据,不管是格雷码还是独热码,结果就正常了。
这尼玛在逗我?真奇葩,啥原因?

现在可以了。

哈哈!parameter和你直接写应该是一样的!虽然你现在程序可以了,但是有可能调着调着就挂了!

很奇怪的问题,但确实好了

学习/学习/学习

学习/学习/学习

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top