逻辑设计新人甲
楼上两位说得都对,我补充点实际调试的坑。首先,时钟拉伸检测一定要用异步电路吗?不,我建议同步化处理。用你的主时钟去采样SCL线,然后边沿检测。但采样频率得够高,至少是SCL的几倍,否则可能错过从机的短时拉伸。其次,仲裁失败后的处理,协议要求主机必须立即停止发送,并转为接收。但你的状态机可能正在‘发送数据’状态,这时候要强行跳到一个‘仲裁失败’状态,这个状态要完成释放SDA、监听总线、可能还要发重复起始条件。代码里if else会变得很复杂。我的建议是,先做一个不支持仲裁的版本,调通。然后再单独加一个仲裁模块,用条件编译隔开。这样出问题了也好定位。最后,仿真时一定要把SDA和SCL的线模型(用wire类型,有多驱动)建好,不能只用自己的驱动值。可以用force/release来模拟从机和其他主机的行为。
