interige
发表于 2010-6-26 12:59:04
parameter WIDLE=2'b00,WWRITE=2'b01, WWAIT=2'b10,WREAD=2'b11;<br>
<br>
always@(posedge clk or negedge rst)<br>
if(!rst)<br>
w_state<=WIDLE;<br>
else <br>
case(w_state)<br>
WIDLE: <br>
begin<br>
if(write_gen)<br>
w_state<=WWRITE;<br>
else<br>
w_state<=WIDLE;<br>
end<br>
WWRITE:<br>
begin<br>
if((!rb)&&(wcount>=13'h1015))<br>
w_state<=WWAIT;<br>
else<br>
w_state<=WWRITE;<br>
end<br>
WWAIT:<br>
begin<br>
if(rb||(wait_count>=13'h1ff0))<br>
w_state<=WREAD;<br>
else<br>
w_state<=WWAIT;<br>
end<br>
WREAD:<br>
begin<br>
if(wr_complete)<br>
w_state<=WIDLE;<br>
else<br>
w_state<=WREAD;<br>
end<br>
default:<br>
w_state<=WIDLE;<br>
endcase<br>
<br>
以上是状态机的一部分代码,望大家批评指正
longtime
发表于 2010-6-26 14:19:15
呵呵!没看出来代码有什么问题呀?
inter
发表于 2010-6-26 14:56:39
学习下<br>
呵呵
CHA
发表于 2010-6-26 16:29:02
建议用独热编码
VVC
发表于 2010-6-26 17:27:44
看不懂你的状态机的值到底为多少,入果是零,应该是第一个状态。我觉得状态机的写法没有问题,你可以看看时序分析的结果,如果最大的频率不到40m,fpga工作肯定在40m是要出问题。如果最大的频率超过40M,就要分析一下你的逻辑对不对了。
ANG
发表于 2010-6-26 19:22:51
感谢大家帮忙,终于找到问题了,是要将来自芯片外的输入信号rb用寄存器打一下就好了,来自芯片外的信号不太稳定。以前被人提醒过,但没有在意,今天终于意识到重要性了
inter
发表于 2010-6-26 20:16:22
各位高手,我编了一个状态机模块,在主程序里调用,时序仿真都没问题,为什么写到硬件里后,没有输出?只是状态机那部分的输出没有,其他和仿真结果一样。
CTT
发表于 2010-6-26 20:55:52
呵呵 学习了.
CHA
发表于 2010-6-26 21:44:20
同意用独热编码
ATA
发表于 2010-6-26 22:53:39
学习学习,在数字IC中,状态机是最重要的吗??