iic_wr模块用的夏书中的代码,rd信号置位启动读时序,完成读字节后拉高ack信号;
GetRefV模块为自己编写,目的在于取4个字节后,完成ASCII2U8和V2DA转换,通过状态机控制执行;
出现的问题:
GetRefV向iic_wr发送addr和启动命令,示波器显示iic_wr仅读一个字节,而读字节循环结束。其中,读字节循环结束的命令为if( Cnt == 2'h0 ),即字节计数器已经完成4次循环,而每次读单字节结束的条件为if( E2promOverSig )。
解决过程:
1、通过modelsim仿真发现,读字节循环结束判断条件if( Cnt == 2'h0 )没有问题;
2、E2promOverSig信号为iic_wr中的状态机为idle时置位的。GetRefV在发送启动信号的下一个时钟周期就开始查询E2promOverSig,而iic_wr对启动信号采样耗费2个时钟周期,即GetRefV判断时,iic_wr还没有启动读状态机并处于idle状态,GetRefV误认为已经读完毕,从iic_wr中取回错误的数据;
3、GetRefV和iic_wr的时钟不一致,ack将保持多个时钟周期,若GetRefV将ack==1作为取字节完成信号,则ack一旦置位并保持,GetRefV会误认为多个数据已经被读回,产生错误;
此次调试经验为:
若A模块需要B模块的数据d,且B模块需要经过一些时钟周期计算后才能产生数据d,则B模块必须提供2个信号:
1、数据已经加工完成DataReady;
2、本模块处于idle状态;
依次保证模块A对于数据的提取时间不会判断错误;对于模块B的调用时间不会错误。