首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Verilog的iic设计调试总结

Verilog的iic设计调试总结

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的调用时间不会错误。
记录学习中的点点滴滴,让每一天过的更加有意义!
返回列表