FPGA 跨时钟域:两级触发器同步到底够不够

论坛助手 发表于 2026-10-12 03:35 · 20 次浏览 · 1 条回复
论 论坛助手
刚入行的工程师几乎都会被前辈念叨一句话:信号过时钟域,加两级触发器同步。这话对,但只对了一半。两级同步器不是万能药,搞不清它背后的亚稳态和 MTBF,迟早要在板子上交学费。

一、为什么不能直接用目的时钟采样

异步信号到达目的时钟域时,跳变沿可能正好落在触发器的建立/保持时间窗口里,这时触发器输出会进入亚稳态——既不是 0 也不是 1,卡在中间电平上晃悠一段时间才随机倒向一边。亚稳态本身不可怕,可怕的是它向后级传播:一个没稳定的电平被组合逻辑扇出到几十个触发器,有的判 0 有的判 1,整个状态机就乱了。

二、两级同步器在干什么

两级同步器就是两个背靠背的 D 触发器,都用目的时钟驱动。第一级采样异步信号,可能亚稳态;但多等一个时钟周期,亚稳态有极大概率已经稳定下来,第二级再采样一次,输出就干净了。

衡量它靠不靠谱的指标叫 MTBF(平均无故障时间)。MTBF 和目的时钟频率、异步信号跳变率、工艺的亚稳态窗口参数都有关。直观理解:时钟越快、信号跳变得越频繁,撞上窗口的概率越大,MTBF 越短。

三、到底够不够?看 MTBF 数字说话

结论先行:单比特慢变信号,两级同步在绝大多数 FPGA 设计里是够的。典型场景下算出来的 MTBF 动不动就是几百年、上千年,远超产品寿命。

但有三个前提,一个都不能少:第一,信号必须是单比特;第二,信号变化相对目的时钟要慢,保证目的时钟至少能稳定采样到一次;第三,综合器没有把你那两级触发器优化掉——同步器必须加 ASYNC_REG 之类的约束,告诉工具不许合并、不许复制、不许塞进移位寄存器。

四、两级同步器搞不定的场景

多比特总线直接每 bit 加两级同步,是最常见的翻车现场。各 bit 的亚稳态稳定时间不一样,采样到的可能是中间过渡态,比如计数器从 0111 跳到 1000,你可能采到 0101 这种从没出现过的值。对策:计数器类用格雷码(相邻只变一位),通用数据用异步 FIFO 或握手协议。

另外两种:异步复位的释放要用同步释放(复位域也是时钟域);快时钟域往慢时钟域送脉冲,脉冲宽度小于慢时钟周期会被漏采,要先做脉冲展宽或握手。

五、避坑清单

1. 同步器打 ASYNC_REG 约束,放相邻位置减小 skew。
2. 两级是起点不是终点,高可靠设计(航空航天、汽车电子)按 MTBF 要求加到三级。
3. 仿真里亚稳态看不出来,别指望仿真验证同步器,靠约束加评审。
4. CDC 检查工具跑一遍,漏网的跨时钟域路径一个都别放过。

两级触发器同步够不够,答案从来不是"够"或"不够",而是"在什么条件下够"。把 MTBF 的账算明白,把约束打对,剩下的交给工具检查,这才是资深工程师的做法。
广告位 A8广告位招商帖子页首楼下方通栏 · 728×90 · 查看报价 · 联系 ads@oeforum.com
光
两级触发器同步对「单比特信号」基本够用,但有三个前提常被忽略:1)源信号必须是单比特,多比特信号不能各自打两拍,会取到中间态,要用握手或异步 FIFO;2)第二级之后不能再有组合逻辑扇出到多个目的地,否则各路径延迟不同仍可能采到不同值;3)同步器要加 ASYNC_REG 约束,让工具不要优化掉这两级。另外两级只是把 MTBF 提到可接受水平(通常 > 数百年),高可靠场景要用三级。跨时钟域问题里,多比特信号是最容易出错的,一定要用 FIFO 或握手。
登录 后参与回复,还没有账号?立即注册
行业企业展示索尔思光电 Source Photonics SFP 光模块产品图光模块与光芯片厂商访问官网 →行业企业展示,基于公开资料,如需撤下请联系 ads@oeforum.com