电子工程学生
CDC 处理不好系统就随机出错,debug 能累死人。我一般按这个流程来:
先画时钟域框图,标清楚每个时钟和相互传输的数据宽度、速率。
然后分类处理:
1. 控制信号(单比特):打两拍同步。但要注意信号必须是源时钟域寄存器输出,不能组合逻辑毛刺。另外如果信号脉冲很窄,可能需要在源时钟域先展宽。
2. 数据总线(多比特):首选异步 FIFO。FPGA 的 IP 核或者自己写都行。自己写的话,网上有很多成熟模板,重点是把读写指针转换成格雷码,然后在对方时钟域打两拍再回来判断空满。记住,指针同步的同步器本身也是打两拍。
3. 偶尔传输的数据块:可以用握手协议(Req/Ack),但效率低,适合低频场景。
举个例子:两个时钟域需要传递一组配置寄存器(32位),我直接用异步 FIFO,深度设成 16 足够了。
仿真时一定要做跨时钟域检查,Vivado 和 Quartus 都有 CDC 分析工具,把未同步的路径都清掉。
最后提醒:CDC 设计完后,上板测试要跑长时间压力测试,亚稳态不是每次都会触发,但一旦触发就是大问题。
