跨时钟域(CDC)分两类:单bit信号用打两拍(同步器)处理亚稳态;多bit总线用异步FIFO或握手;亚稳态无法消除,只能用同步器把发生概率降到可接受。
本文概述
CDC 是 FPGA 必考点,面试常考:亚稳态是什么、为什么打两拍、什么时候用异步 FIFO、握手协议。回答要能讲清单 bit 和多 bit 的不同处理。
核心要点
亚稳态:信号在时钟采样沿附近变化,触发器输出不及时钟逻辑值,导致亚稳态
单 bit 跨时钟:用两级触发器(打两拍)同步,第一拍可能亚稳态,第二拍稳定
多 bit 跨时钟:不能用打两拍(各路延迟不同),用异步 FIFO 或握手
异步 FIFO:格雷码指针+双口 RAM,处理连续数据流
握手:req/ack 四相握,处理偶发数据,速度慢但可靠

面试官考察点
这是必考题。面试官看:①是否知道亚稳态;②单 bit 用打两拍;③多 bit 用 FIFO。
回答思路
先讲亚稳态原理,再讲单 bit 打两拍,最后讲多 bit 怎么选。
参考回答
先理解亚稳态。当一个信号在另一个时钟域的采样沿附近变化,触发器输出可能停在中间电平(亚稳态),不确定会演变成 0 还是 1。如果这个不稳定值传到后续逻辑,可能导致整个系统判断错误。
单 bit:打两拍。
把源域的单 bit 信号在目的域用两级 D 触发器打拍:
reg [1:0] sync;
always @(posedge clk_dst) sync <= {sync[0], data_src};
wire data_dst = sync[1];
第一拍 sync[0] 可能亚稳态;
给一个时钟周期让它稳定,第二拍 sync[1] 就是稳定值;
不是消除亚稳态,是把错误概率降到 FIT(每十亿小时失败次数)可接受。
多 bit:不能打两拍。
为什么?比如 data[3:0],各 bit 走线延迟不同,打到目的域后有的 bit 是新值、有的还是旧值,拼出错误数据。
| 场景 | 方案 | 说明 |
|---|---|---|
| 连续数据流 | 异步 FIFO | 格雷码指针+双口 RAM,最常用 |
| 偶发控制信号 | 四相握手 req/ack | 发送方 req,接收方 ack,慢但可靠 |
| 配置寄存器 | 多 cycle path 或异步 FIFO | 配置时停止传输 |
异步 FIFO 原理。
写指针在写时钟域加一,读指针在读时钟域加一;
指针用格雷码编码(每次只变一位),跨时钟打两拍;
读指针跨到写域判断满,写指针跨到读域判断空;
数据存在双口 RAM,读写独立时钟。
注意事项。
控制信号 vs 数据:控制(有效/开始)用打两拍;数据用 FIFO;
使能脉冲跨时钟:把脉冲展成电平,跨过去后再检测上升沿;
复位跨时钟:异步复位、同步释放;
时序约束:set_false_path 或 set_max_delay,让工具不对 CDC 路径做默认时序分析。

扫码关注




























