大家好,我对状态机有疑问。
我写了一个状态机来实现一些功能,设备是virtex-ii。
机器中有26个状态,其中4个是A,B,C,D,E;
输入信号为rdy_i和smp_rdy_i,输出信号为p_o和q_o。输入和输出信号之间存在因果关系。如果p_o为1,某些时钟周期后,smp_rdy_i从0变为1,持续1个时钟周期。如果
q_o为1,有些时钟周期后,rdy_i从0变为1并持续1个时钟周期.smp_rdy_i和rdy_i是来自其他模块的信号,它与状态机处于同一时钟域,但是从寄存器输出后,两个
信号传递了一些组合逻辑。
通常,关于A,B,C,D的跳跃码如下:来自A-B-C-D的状态,我认为在状态D中,p_o应该是0并且q_o应该是1。
但是,有时,状态机会跳错。
频率是几十,或几百,或几千。通过chipcope,我发现状态机在状态D停止,但是p_o是1而q_o是0.在状态D,q_o是0,所以我认为这是合理的
rdy_i永远不会是1,这就是状态机停止的原因。但是,为什么状态D q_o为0且p_o为1?
只有状态机跳转错误才给出原因。
为什么状态机跳转错误???
我该怎么做才能避免状态机跳转错误???
我很抱歉打扰你,但我需要你的帮助,感谢你的回答。
------ codes ------------ case(state)... A:begin if(smp_rdy_i)next = B;
else next = A; endB:begin if(rdy_i)next = C;
else next = B; endC:begin if(rdy_i)next = D;
else next = C; endD:begin if(rdy_i)next = E;
else next = D; end ...默认值:begin next ='bx; endendcase
...
case(next)... A:开始p_o q_oendB:开始p_o q_oendC:开始//其他信号assignmentsendD:开始//其他信号assignmentsend ... endcase
0