同一块板子上跑着好几个时钟,快的200MHz,慢的32kHz。它们之间传数据,不做处理,就是一颗随时会爆的定时炸弹。

1、先分清两种设计
同步设计:所有触发器由同一个时钟驱动,数据在时钟沿统一采样,时序清晰,分析简单。
异步设计:没有统一时钟,靠握手信号协调,设计灵活,但时序分析极其复杂。
实际项目中,两者往往混用。问题就出在交界处。
2、跨时钟域为什么危险?
慢时钟域的信号传到快时钟域,建立时间和保持时间都可能被违反。
触发器在亚稳态区域采样,输出可能在0和1之间震荡,既不是高也不是低。
这个亚稳态会像病毒一样向后级传播,导致整个系统逻辑错乱,而且这种错误是偶发的,仿真查不出来,上板才会暴露。
3、三种经典处理方法
第一种:两级打拍。最简单,适用于单比特控制信号。快时钟域连续采样两次,大幅降低亚稳态传播概率。
第二种:异步FIFO。多比特数据跨域,用双口RAM加格雷码读写指针,既解决数据宽度问题,又解决指针同步问题。
第三种:握手协议。源时钟域发出请求,目的时钟域返回应答,双方确认后再传数据,可靠但速度慢。
本文凡亿教育原创文章,转载请注明来源!

扫码关注






































