[官方 IP] XPM_CDC
Xilinx XPM_CDC IP (PG382) 详细介绍
概述
Xilinx XPM_CDC(Xilinx Parameterized Macros - Clock Domain Crossing,Xilinx 参数化宏 - 时钟域交叉)是 AMD Xilinx 提供的一组参数化宏,用于在 FPGA 设计中实现安全高效的时钟域交叉(CDC,Clock Domain Crossing)。这些宏通过 Vivado 工具的模板实例化,基于 FPGA 的寄存器资源(FF)实现跨时钟域的信号同步,避免亚稳态问题。XPM_CDC 宏支持多种 CDC 场景,包括单比特同步、多比特同步、握手协议和异步复位同步,广泛应用于多时钟域的数字系统设计。
本文基于 PG382(XPM_CDC Generator v1.0 LogiCORE IP 产品指南,2022年4月20日发布),结合 AMD 官方文档(如 UG974、Vivado 设计套件用户指南:使用参数化宏)和社区资源,详细介绍 XPM_CDC 宏的功能、特性、配置、使用场景和注意事项,以中文内容呈现。
主要功能
XPM_CDC 宏提供一组标准化的 CDC 解决方案,旨在简化跨时钟域设计并确保信号同步的可靠性。其主要功能包括:
- 多种 CDC 宏类型:
- XPM_CDC_SINGLE:单比特信号同步,用于简单控制信号的跨时钟域传输。
- XPM_CDC_GRAY:多比特格雷码同步,用于计数器或状态值的跨时钟域传输。
- XPM_CDC_HANDSHAKE:握手协议同步,用于多比特数据(如总线)的安全传输。
- XPM_CDC_PULSE:脉冲信号同步,将单周期脉冲从源时钟域传输到目标时钟域。
- XPM_CDC_ASYNC_RST:异步复位同步,确保复位信号在目标时钟域的正确同步。
- 参数化配置:
- 支持用户定义的同步级数(2 至 10 级),平衡亚稳态保护和延迟。
- 支持同步或异步时钟关系配置。
- 高效实现:
- 使用 FPGA 的寄存器(FF)资源,无需额外的黑盒 IP。
- 优于传统 Block Memory/FIFO Generator 的 CDC 实现,减少仿真时间并提高综合精度。
- 灵活的接口:
- 支持简单的信号接口(如单比特输入/输出)或握手接口(如 req/ack 信号)。
- 兼容 Vivado 的 RTL 实例化和综合流程。
- 广泛的器件支持:
- 7 系列 FPGA(Artix-7、Kintex-7、Virtex-7、Zynq-7000)。
- UltraScale 和 UltraScale+ 系列。
- Versal 自适应计算加速平台。
- 仿真和验证:
XPM_CDC 宏类型详解
以下是对 XPM_CDC 宏的具体功能和典型应用的详细说明:
1. XPM_CDC_SINGLE
- 功能:将单比特信号从源时钟域同步到目标时钟域,使用多级寄存器链(默认 2 级)防止亚稳态。
- 端口:
- src_clk:源时钟。
- src_in:源时钟域的单比特输入。
- dest_clk:目标时钟。
- dest_out:目标时钟域的同步输出。
- 应用:同步控制信号(如使能信号、标志位)。
- 参数:
- DEST_SYNC_FF:同步级数(2 至 10,推荐 2 或 3)。
- INIT_SYNC_FF:是否初始化同步寄存器(0 或 1)。
- SRC_INPUT_REG:是否在源时钟域添加输入寄存器(0 或 1)。
2. XPM_CDC_GRAY
- 功能:将多比特格雷码信号从源时钟域同步到目标时钟域,适合计数器或状态值传输。
- 端口:
- src_clk、dest_clk:源和目标时钟。
- src_in:源时钟域的格雷码输入(多比特)。
- dest_out:目标时钟域的同步格雷码输出。
- 应用:同步计数器值(如地址指针)或状态机状态。
- 参数:
- WIDTH:格雷码位宽(1 至 32)。
- DEST_SYNC_FF:同步级数。
- INIT_SYNC_FF、SRC_INPUT_REG:同 XPM_CDC_SINGLE。
3. XPM_CDC_HANDSHAKE
- 功能:通过握手协议(req/ack)安全传输多比特数据,确保数据在目标时钟域正确采样。
- 端口:
- src_clk、dest_clk:源和目标时钟。
- src_in:源时钟域的多比特数据输入。
- src_send:源时钟域的发送请求信号。
- src_rcv:源时钟域的接收确认信号。
- dest_out:目标时钟域的同步数据输出。
- dest_req:目标时钟域的请求信号。
- dest_ack:目标时钟域的确认信号(可选)。
- 应用:同步宽位数据总线(如配置寄存器、数据包)。
- 参数:
- WIDTH:数据位宽(1 至 256)。
- DEST_SYNC_FF、INIT_SYNC_FF、SRC_INPUT_REG:同上。
- DEST_EXT_HSK:是否启用外部握手(0 或 1)。
4. XPM_CDC_PULSE
- 功能:将源时钟域的单周期脉冲信号传输到目标时钟域,生成目标时钟域的单周期脉冲。
- 端口:
- src_clk、dest_clk:源和目标时钟。
- src_pulse:源时钟域的脉冲输入。
- dest_pulse:目标时钟域的脉冲输出。
- 应用:同步事件触发信号(如中断请求)。
- 参数:
- DEST_SYNC_FF、INIT_SYNC_FF:同上。
- REG_OUTPUT:是否在目标时钟域添加输出寄存器(0 或 1)。
5. XPM_CDC_ASYNC_RST
- 功能:将异步复位信号同步到目标时钟域,确保复位信号的稳定性和时序正确性。
- 端口:
- dest_clk:目标时钟。
- src_arst:异步复位输入(高电平或低电平有效)。
- dest_arst:目标时钟域的同步复位输出。
- 应用:同步外部复位信号到内部时钟域。
- 参数:
- DEST_SYNC_FF:同步级数。
- RST_ACTIVE_HIGH:复位信号极性(0 为低电平有效,1 为高电平有效)。
配置与实例化
XPM_CDC 宏通过 Vivado 的 RTL 实例化实现,用户需在 Verilog 或 VHDL 代码中包含 XPM 库并实例化宏。以下是配置和使用步骤:
-
包含 XPM 库:
- 在 Verilog 中,添加以下语句:
`include "xpm_cdc.sv" import xpm::*;
- 在 Verilog 中,添加以下语句:
-
实例化宏:
- 使用 Vivado 的语言模板(Language Templates)或 PG382 中的示例代码。
- 示例:XPM_CDC_SINGLE 宏的 Verilog 实例化:
module xpm_cdc_single_example (input wire src_clk, // 源时钟input wire src_in, // 源信号input wire dest_clk, // 目标时钟output wire dest_out // 同步输出
);xpm_cdc_single #(.DEST_SYNC_FF(3), // 3 级同步.INIT_SYNC_FF(0), // 不初始化.SRC_INPUT_REG(1) // 添加源输入寄存器
) cdc_single_inst (.src_clk(src_clk),.src_in(src_in),.dest_clk(dest_clk),.dest_out(dest_out)
);endmodule
设计工具推荐
- SZ901:
SZ901 是一款基于XVC协议的FPGA网络下载器。- 最高支持53M
- 支持4路JTAG独立使用
- 支持端口合并
- 支持国产FLASH烧写
- 下载器无限扩展
- 配备专属程序固化软件,一键烧写,能大大减小程序固化时间!