【原创】verilog的iic设计调试总结_Detective_ALong_新浪博客

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的调用时间不会错误。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值