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

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

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

KernelLab发布于 2026/4/6更新于 2026/8/2260 浏览

什么是跨时钟域 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 核配置步骤
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 经典时间序列建模:差分处理与 AR/MA/ARMA 模型识别
  • Qwen3 与 Qwen Agent 智能体开发实战:接入 MCP 工具
  • Llama-3.2-3B 对比 Qwen2-1.5B:Ollama 部署与摘要 BLEU 实测
  • llama.cpp 量化模型部署实战:从模型转换到 API 服务
  • C++ 多线程同步:原子操作(atomic)实战
  • C++ 类和对象(中):默认成员函数与运算符重载
  • 小厂架构师实战:AI Agent 辅助 Bug 定位与修复
  • 基于 Vue 3 构建 imToken 风格钱包交互原型及核心流程验证
  • Linux 文件操作核心:缓冲区机制与文件描述符原理
  • Node-RED 智能家居自动化配置指南
  • 二分答案专题实战:木材加工与砍树问题详解
  • Boston Dynamics(波士顿动力)机器人进化史
  • 基于 PSO-DWA 融合的无人机三维动态避障路径规划研究 (Matlab 实现)
  • Fooocus 部署实践:本地手动配置与云端一键启用对比
  • Java 最新版本详细安装配置教程
  • NestJS 核心揭秘:InstanceWrapper 的艺术与前端缓存新思路
  • 使用 OpenClaw 在飞书搭建专属 AI 机器人
  • 快手 M3CSR:多模态短视频冷启动推荐方法
  • KIMI 与文心一言、通义千问大模型能力对比评测
  • 线性 DP 经典四题详解:台阶、子段和、传球与乌龟棋

相关免费在线工具

  • 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