三段式状态机,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和你直接写应该是一样的!虽然你现在程序可以了,但是有可能调着调着就挂了!
很奇怪的问题,但确实好了
学习/学习/学习
学习/学习/学习