这个问题遇到了几次,大概现象就是状态机在运行过程中没有根据某些信号的跳变而跳转,看起来就是乱跑。
可能的原因如下:
1.异步时钟信号引起;
解决办法:异步时钟给过来的信号用状态机使用的时钟打两拍,用打拍后的信号;
2.状态机跳转的判断条件不充分,大多数情况下就是a = 1,b = 16‘haabb同时发生时,或者再加上一些其他的判断条件,列举不充分,这样的话,状态机会跑飞。上面的举例太过随意,通俗一点讲就是你给了状态机有些模棱两可,或者还有其他可能性的判断条件,状态机不知道该怎么跳了。
解决方法:
if((a=1) &&(b=16'haabb))
state <= 1'b0;
else
state <= 1'b1;
可以写成
if(a=1)
if(b = 16'haabb)
state <= 1'b0;
else
state <= state;
else
state <= state;
大概就是这么个意思,你自己都不确定的情况,就分开列出来,给状态机一个明显的跳变条件。