跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言

FPGA 跨时钟域 CDC 处理的三种工程方案

综述由AI生成FPGA 跨时钟域(CDC)处理的三种核心工程方案。针对单比特信号,采用两级寄存器同步消除亚稳态;针对多比特数据,使用握手机制确保数据完整性;针对批量高速传输,推荐异步 FIFO 配合格雷码指针同步。文章提供了详细的 Verilog 代码示例及 Vivado IP 核配置步骤,并总结了 CDC 设计中的关键铁律,如复位同步、避免直接打拍等,旨在帮助开发者规避系统隐患。

KernelLab发布于 2026/4/6更新于 2026/5/2227 浏览

什么是跨时钟域 CDC?

核心场景:信号从一个时钟域(如 clk_a)传到另一个时钟域(如 clk_b)。 触发条件:两个时钟频率不同,或相位无关(无固定时间关系)。 直接后果:如果不做处理,直接打拍会出现亚稳态,导致数据错误或系统死机。

只要是多时钟系统,就必须做 CDC 处理,这是企业级 FPGA 开发的基本要求。

方案 1:单比特信号 —— 两级寄存器同步

适用场景:按键输入、使能信号、标志位、单 bit 控制信号(如中断请求、数据有效标志)。

代码示例

module sync_2d(
    input  wire      clk_dst, // 目标时钟
    input  wire      rst_n,   // 全局复位,低电平有效
    input  wire      din,     // 异步输入
    output wire      dout     // 同步后输出
);

reg q1, q2;

always @(posedge clk_dst or negedge rst_n) begin
    if(!rst_n) begin
        q1 <= 1'b0;
        q2 <= 1'b0;
    end else begin
        q1 <= din; // 第一级同步
        q2 <= q1;  // 第二级同步
    end
end

assign dout = q2;

endmodule

关键要点

  • 两级寄存器足够抵御大部分亚稳态,单 bit 信号统一用此方案。
  • 绝对不要只打一拍,风险极大。
  • 模板可直接复用,替换 clk_dst 即可适配不同频率。

方案 2:多比特信号 —— 握手机制

适用场景:数据总线、地址信号、多 bit 控制信号。禁止直接打拍,否则会导致数据错乱。

核心思路

  1. 发送方准备好数据,发送 valid 信号。
  2. 同步 valid 到接收方时钟域。
  3. 接收方检测到 valid 后锁存数据并发送 ack 应答。
  4. 同步 ack 回发送方,确认接收完成。

代码示例

module cdc_handshake(
    input  wire          clk_a,       // 发送方时钟
    input  wire          rst_n,       // 全局复位
    input  wire [15:0]   data_a,      // 发送方数据
    input  wire          data_vld_a,  // 发送方有效
    
    input  wire          clk_b,       // 接收方时钟
    output reg  [15:0]   data_b,      // 接收方数据
    output reg           data_vld_b   // 接收方有效
);

// 声明信号
reg valid_a_sync1, valid_a_sync2;
reg ack_b, ack_b_sync1, ack_b_sync2;
reg data_lock;

// 第一步:valid_a 同步到 clk_b 域
always @(posedge clk_b or negedge rst_n) begin
    if(!rst_n) begin
        valid_a_sync1 <= 1'b0;
        valid_a_sync2 <= 1'b0;
    end else begin
        valid_a_sync1 <= data_vld_a;
        valid_a_sync2 <= valid_a_sync1;
    end
end

// 第二步:接收方逻辑
always @(posedge clk_b or negedge rst_n) begin
    if(!rst_n) begin
        data_b   <= 16'd0;
        data_vld_b <= 1'b0;
        ack_b    <= 1'b0;
        data_lock<= 1'b0;
    end else begin
        case(valid_a_sync2)
            1'b1: begin
                if(!data_lock) begin
                    data_b   <= data_a;
                    data_vld_b <= 1'b1;
                    data_lock<= 1'b1;
                    ack_b    <= 1'b1;
                end else begin
                    data_vld_b <= 1'b0;
                end
            end
            1'b0: begin
                data_vld_b <= 1'b0;
                ack_b    <= 1'b0;
                data_lock<= 1'b0;
            end
        endcase
    end
end

// 第三步:ack_b 同步到 clk_a 域
always @(posedge clk_a or negedge rst_n) begin
    if(!rst_n) begin
        ack_b_sync1 <= 1'b0;
        ack_b_sync2 <= 1'b0;
    end else begin
        ack_b_sync1 <= ack_b;
        ack_b_sync2 <= ack_b_sync1;
    end
end

endmodule

代码要点

  • 数据位宽可根据需求修改(如 8bit/32bit)。
  • 通过'valid 同步→数据锁存→ack 同步'闭环确保稳定。

方案 3:异步 FIFO

适用场景:高速数据传输、批量数据处理(图像、串口、以太网等)。企业级标准方案。

核心要点

  • 读写指针必须用格雷码编码后再跨时钟域同步。
  • 格雷码优势:相邻数值仅 1bit 变化,避免采样错误。

Vivado IP 核配置步骤

  1. 打开 Vivado,进入项目,点击

目录

  1. 什么是跨时钟域 CDC?
  2. 方案 1:单比特信号 —— 两级寄存器同步
  3. 代码示例
  4. 关键要点
  5. 方案 2:多比特信号 —— 握手机制
  6. 核心思路
  7. 代码示例
  8. 代码要点
  9. 方案 3:异步 FIFO
  10. 核心要点
  11. Vivado IP 核配置步骤
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 通义万相 2.1 文生视频模型部署与硬件性能实测
  • 基于 FastGPT 与 MCP 协议构建工具增强型 AI Agent
  • 归并排序详解:递归实现与复杂度分析
  • CoRAL:协作检索增强大型语言模型改进长尾推荐
  • C++11 详解:列表初始化与右值引用移动语义
  • Llama-3.2-3B 代码审查:基于 Java 面试题的质量评估体系
  • Python 使用 SQLAlchemy 操作 MySQL 入门与实战
  • AIGC 如何重塑日常生活:从内容创作到智能服务的全面解析
  • 数据结构:二叉树概念与堆实现详解
  • MyBatisPlus 与 Thymeleaf 全栈分页整合方案
  • 基于Zynq FPGA对雷龙SD NAND的测试
  • Vibe Coding:AI 时代的新编程范式
  • 使用 CSS 实现水平导航菜单
  • AIGC 时代:为何 AI 文本检测已成为刚需?
  • AIGlasses 导航效果展示:盲道分割结果叠加 AR 眼镜视野实时导航
  • Spring Boot 实战:从入门到项目部署
  • CSS 样式基础与布局实战指南
  • Python 非官方 Google 搜索 API 集成指南
  • 使用 GitHub Desktop 将本地代码上传至远程仓库教程
  • 开源 AI 工具推荐:Antigravity Tools、Vibe Kanban、CC-Switch

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online