用verilog写了个状态机,实现ad采集的时序控制。给出convst后,检测busy,要是为低,就拉低RD,读出数据

但是总是在跑了不到1s后,停在某个状态了。
我调试程序,发现要是注释掉对busy的检测,直接跑到下个状态,程序就不会跑飞。但是用万用表检测前一秒正常运行时,busy线有高低变化,跑飞后,busy一直是低,按理说应该正常进行到下一个状态。
请教各位大侠,这可能是什么原因。(所有if均有else,case最后有default语句,语法编译通过,前仿真通过)
部分代码如下
always@(posedge clk)
current_states<=nest_states;

always@(current_states)//尝试过always@(*)也不行

begin
case(current_states)

st0:begin
convst <=0;
rd <= 1;
next_states = st1;
end

st1:begin
convst <= 1;
rd<=1;
next_states = st2;
end

st2:begin
convst<=0;
if(busy==1) //如果注释掉这里的if else ,直接跑到st3,程序就不会跑飞
next_states = st2;
else
next_states = st3;
end

st3:begin
convst<=0;
rd<=0;
next_states=st4;
end

st4:begin
convst<=0;
rd<=1;
dataout=adin;//数据输入
next_states = st5;//省略了几个重复rd高低变化的状态
end

st5:begin
convst<=0;
rd<=1;
next_states=st0;
end
default:next_states=st0;
endcase
end
endmodule
1楼的你好。
以上的几个方面我都试过。
1、nest是笔误,因为上面的程序是我打的,不是原程序,所以写错了。
2、复位信号我也加上过,,连接的是外面的一个按钮。并且每次复位后,程序又能跑大概半秒钟后就停下来了。。

3、同意你的意见,我修改试一试。因为原来都是=,也用第一个always写了时序,但第二个always快实质上仍然是个时序快,所以把一部分改成<=试一试是否有用才改成这样的。
4、在实际的程序了面,的确用的是1‘b0这样的表述。
另外,我的状态采用的是热独码:st0 = 6’b000001,st1 = 6'b000010,......st5 = 6'b100000;
4个建议:
1、第二行“nest_states”命名错误。
2、状态机的迁移最好加上复位,如下渗者:
always @ (posedge clk or negedge rst)
if (!rst)
state <= IDLE;
else
state <= next_state;
3、状态机的第二段可以采用组合逻辑写,always(*)是可以的,但是严禁在同一个组合逻辑always模块里同时出现<= 和=,改成都用=。
4、硬件丛脊薯描述语言,最好用1'b1,1'b0把位宽野圆也描述上而不要用直接用1,0。
可以做个测握物试信号 将前皮绝busy的输入再从另外的管脚输出 做一个直通 看看输慧姿出状态 没准是fpga的管脚坏了