跨时钟域 CDC 是不同时钟域信号传输,会产生亚稳态;单 bit 用打两拍(两级触发器同步);多 bit 用异步 FIFO 或格雷码+握手;握手协议(req/ack)用于少量数据;亚稳态无法消除,只能降低概率(MTBF),同步器增加 MTBF。
本文概述
跨时钟域是 FPGA 设计难点,面试常考:亚稳态、打两拍、异步 FIFO、握手。回答要讲清各方法适用场景。
核心要点
跨时钟域信号会亚稳态:Tsu/Th 不满足,输出在高低之间振荡后稳定
单 bit 信号:打两拍(两级寄存器同步),降低亚稳态概率
多 bit 信号:异步 FIFO(最常用)、格雷码转换后打两拍、握手协议
握手 req/ack:发送方发 req,接收方回 ack,适合少量控制信号
亚稳态无法消除,只能提高 MTBF(平均无故障时间),同步器级数越多 MTBF 越高

面试官考察点
CDC 核心题。面试官看你是否理解亚稳态和多 bit 问题。重点听:亚稳态、打两拍、多 bit 偏移。
回答思路
讲打两拍原理,多 bit 不能直接打是因为各位偏移导致错误组合。
参考回答
亚稳态。信号从 clkA 域到 clkB 域,如果在 clkB 触发器建立/保持时间窗口内变化,输出会进入亚稳态(既非 0 也非 1),振荡一段时间后稳定到 0 或 1。亚稳态输出会导致下游逻辑错误。
打两拍(单 bit)。
reg sync1, sync2;
always @(posedge clkB) begin
sync1 <= async_in; // 第一级可能亚稳态
sync2 <= sync1; // 第二级给恢复时间
end
assign sync_out = sync2;
第一级触发器可能亚稳态,但一个时钟周期后大概率稳定;
第二级采样稳定后的值,亚稳态概率极低;
MTBF(平均无故障时间)随同步器级数指数增加;
单 bit 信号(如中断、标志)打两拍安全。
多 bit 为什么不能直接打两拍。
多 bit 信号各位走线延迟不同,到达 clkB 域时间不同;
打两拍后,某些 bit 是旧值、某些是新值,出现错误的中间组合;
例如 4'b0111 → 4'b1000,可能采样到 4'b0000 或 4'b1111;
所以多 bit 必须用其他方法。
多 bit 跨域方法。
| 方法 | 适用 | 原理 |
|---|---|---|
| 异步 FIFO | 大量数据、连续流 | 双口 RAM + 读写指针格雷码跨域 |
| 格雷码+打两拍 | 地址、计数器 | 格雷码每次只变 1 位,打两拍无错误组合 |
| 握手 req/ack | 少量控制、寄存器配置 | 请求-应答,等对方确认再继续 |
| DMUX 同步 | 多 bit 但有 valid 信号 | valid 打两拍后选通数据 |
异步 FIFO 要点。
写指针和读指针用格雷码,跨时钟域打两拍;
空满判断:写指针==读指针(空),写指针下一个==读指针(满);
异步 FIFO 是最常用的多 bit 跨域方案,Xilinx IP 有 FIFO Generator。
注意。
复位信号跨域也要同步(异步复位同步释放);
不要用组合逻辑输出直接跨域(毛刺会被采样);
CDC 要在约束里标记(set_clock_groups 或 set_max_delay);
仿真时要检查亚稳态(加 $setup/$hold 检查)。












