FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-所有问题-其他-正文

FPGA 跨时钟域处理 CDC 怎么做?

芯片爱好者小王芯片爱好者小王
其他
22小时前
0
0
3
项目中多个时钟域之间要传数据,听说要 CDC 处理,打拍、异步 FIFO 这些怎么选?有具体例子吗?
芯片爱好者小王

芯片爱好者小王

这家伙真懒,几个字都不愿写!
6511.10K
分享:
FPGA 毕设做什么方向比较好?上一篇
芯片公司的“数字IC前端设计”岗位,具体一天的典型工作流程是怎样的?下一篇
回答列表总数:6
  • 电子工程学生

    电子工程学生

    CDC 处理不好系统就随机出错,debug 能累死人。我一般按这个流程来:

    先画时钟域框图,标清楚每个时钟和相互传输的数据宽度、速率。

    然后分类处理:

    1. 控制信号(单比特):打两拍同步。但要注意信号必须是源时钟域寄存器输出,不能组合逻辑毛刺。另外如果信号脉冲很窄,可能需要在源时钟域先展宽。

    2. 数据总线(多比特):首选异步 FIFO。FPGA 的 IP 核或者自己写都行。自己写的话,网上有很多成熟模板,重点是把读写指针转换成格雷码,然后在对方时钟域打两拍再回来判断空满。记住,指针同步的同步器本身也是打两拍。

    3. 偶尔传输的数据块:可以用握手协议(Req/Ack),但效率低,适合低频场景。

    举个例子:两个时钟域需要传递一组配置寄存器(32位),我直接用异步 FIFO,深度设成 16 足够了。

    仿真时一定要做跨时钟域检查,Vivado 和 Quartus 都有 CDC 分析工具,把未同步的路径都清掉。

    最后提醒:CDC 设计完后,上板测试要跑长时间压力测试,亚稳态不是每次都会触发,但一旦触发就是大问题。

    20小时前
  • Verilog新手笔记

    Verilog新手笔记

    CDC 的核心是避免亚稳态和数据丢失。选打拍还是异步 FIFO,主要看数据是单比特控制信号还是多比特数据总线。

    如果是单比特信号(比如复位、使能),常用打两拍(两级同步器)。注意源时钟域信号要足够宽,确保能被目标时钟域采样到,否则可能漏采。

    多比特数据(比如数据总线、计数器)必须用异步 FIFO 或握手协议。异步 FIFO 最常用,用双端口 RAM 加格雷码指针同步,能连续传输。自己写 FIFO 要注意格雷码转换和空满判断逻辑。

    举个例子:从 100MHz 域传一个 8 位数据到 50MHz 域,就用异步 FIFO。写侧用 100MHz 时钟,读侧用 50MHz 时钟,指针同步部分各自打两拍。

    关键点:
    1. 明确数据特征和时钟频率关系。
    2. 同步器不能解决数据一致性问题,多比特必须用 FIFO 或握手。
    3. 仿真时注意 CDC 报告,工具可能报出未同步的跨时钟域信号。

    20小时前
  • 硅基探索者

    硅基探索者

    我一般按这个流程来选,你参考下:

    第一步,先分析信号类型。如果是简单的标志位、使能、中断,就用打两拍同步,这是成本最低的。但记住,打拍前信号必须在源时钟域保持足够长(比如至少1.5倍目标时钟周期),不然可能漏采。

    第二步,如果是数据总线(比如8位以上),就要考虑异步 FIFO 或握手。异步 FIFO 是首选,因为吞吐率高,用起来像普通 FIFO 一样简单。Xilinx 和 Intel 的 IP 核都能直接生成,自己写的话注意格雷码指针和空满判断逻辑。

    第三步,有些特殊场景,比如多比特信号变化是同步的(比如格雷码计数器),也可以直接同步,但这种情况少,要小心验证。

    举个例子:我之前做的一个项目,ADC 采样数据在 80MHz 时钟域,需要送到 125MHz 的以太网模块。数据是连续不断的,就用了异步 FIFO,深度设了 512,实际用下来很稳定。

    最后提醒:CDC 设计完了一定要做时序约束,告诉工具这些路径是跨时钟域的,不然 STA 会报一堆假错误。仿真也要重点看,尤其是亚稳态的恢复情况。

    21小时前
  • FPGA小学生

    FPGA小学生

    CDC 说白了就是防亚稳态和数据丢失。选打拍还是异步 FIFO,主要看数据是单比特还是多比特,以及传输频率。

    单比特控制信号(比如使能、复位)跨时钟域,常用打两拍(两级同步器)。注意源时钟域信号要展宽,确保能被目标时钟域采到。

    多比特数据总线(比如32位数据)千万别分开打拍,因为每根线延迟可能不同,会导致数据错乱。这时候必须用异步 FIFO 或者握手协议。异步 FIFO 适合连续数据流,握手协议适合偶尔传一下但时序要求不高的场景。

    举个例子:从 100MHz 时钟域传一个脉冲信号到 50MHz 时钟域,就在目标时钟域用两个 D 触发器打两拍。要是传连续的视频像素数据,就建个异步 FIFO,深度算好,别溢出了。

    关键点:同步器打拍只能用于单比特信号;异步 FIFO 的读写指针要用格雷码转换,避免多比特同时变化。

    21小时前
  • Verilog新手村

    Verilog新手村

    实际项目中 CDC 处理不好真的会出诡异 bug。我一般分三步:先判断信号类型,单 bit 控制信号(如使能、复位)就打两拍;多 bit 数据但变化不频繁(如配置寄存器)可以用握手同步;而像 ADC 采样数据流这种连续且高速的,必须上异步 FIFO。选型时还要考虑时钟频率关系,如果两个时钟同源且频率成倍数,有时可以用脉冲同步法。异步 FIFO 的实现网上有很多开源的,重点验证满空生成逻辑和格雷码转换是否正确。CDC 完成后一定要做时序约束,设置 set_false_path 跨时钟域路径,避免工具乱优化。

    22小时前
  • 逻辑萌新实验室

    逻辑萌新实验室

    CDC 的核心是避免亚稳态传播,选方案得看场景。单 bit 信号用打两拍(两级同步器)就行,比如复位信号跨时钟域。多 bit 数据或连续数据流,必须用异步 FIFO,因为打拍不能保证多 bit 同时到达。举个例子:从 100MHz 时钟域传一个 32 位数据到 50MHz 时钟域,数据是连续产生的,那就用异步 FIFO,写侧用 100MHz 时钟,读侧用 50MHz 时钟,用 FIFO 的满空标志控制流。注意异步 FIFO 的指针要用格雷码,避免亚稳态。

    22小时前
我要回答answer.notCanPublish
回答被采纳奖励100个积分
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
请先登录