在 Verilog 中,xpm_cdc_async_rst 是 Xilinx 参数化宏(XPM) 中的异步复位同步器模块,用于将异步复位信号安全地同步到目标时钟域。
一、概述
xpm_cdc_async_rst 专门用于处理异步复位信号的时钟域交叉,确保复位信号在目标时钟域中安全释放,避免亚稳态问题。
二、基本语法
// Verilog 实例化 xpm_cdc_async_rst #( .DEST_SYNC_FF(2), // 范围:2-10 .INIT_SYNC_FF(0), // 0-1 .RST_ACTIVE_HIGH(1) // 0-1 ) xpm_cdc_async_rst_inst ( .src_arst(src_arst), // 源异步复位 .dest_clk(dest_clk), // 目标时钟 .dest_arst(dest_arst), // 目标异步复位 .dest_rst(dest_rst) // 目标同步复位(可选) );
三、参数详解
1. 关键参数
-
DEST_SYNC_FF(默认=2): 目标时钟域同步寄存器级数 -
RST_ACTIVE_HIGH(默认=1): 复位有效电平(1=高电平有效,0=低电平有效) -
INIT_SYNC_FF(默认=0): 同步寄存器初始值
四、使用示例
示例 1:基本异步复位同步
module async_rst_sync_example ( input wire async_reset, // 异步复位输入 input wire clk, // 目标时钟 output wire sync_reset // 同步复位输出 ); xpm_cdc_async_rst #( .DEST_SYNC_FF(2), // 2级同步 .RST_ACTIVE_HIGH(1) // 高电平有效复位 ) rst_sync_inst ( .src_arst(async_reset), .dest_clk(clk), .dest_arst(), // 不使用的输出 .dest_rst(sync_reset) ); endmodule
示例 2:低电平有效复位
module low_active_rst_sync ( input wire rst_n_async, // 异步低电平有效复位 input wire clk, output wire rst_n_sync // 同步低电平有效复位 ); xpm_cdc_async_rst #( .DEST_SYNC_FF(3), // 3级同步提高可靠性 .RST_ACTIVE_HIGH(0) // 低电平有效复位 ) rst_sync_low ( .src_arst(rst_n_async), .dest_clk(clk), .dest_rst(rst_n_sync) ); endmodule
示例 3:多时钟域复位同步
module multi_domain_rst_sync ( input wire global_arst, // 全局异步复位 input wire clk_domain_a, // 时钟域 A input wire clk_domain_b, // 时钟域 B output wire rst_domain_a, // 时钟域 A 同步复位 output wire rst_domain_b // 时钟域 B 同步复位 ); // 同步到时钟域 A xpm_cdc_async_rst #(.DEST_SYNC_FF(2)) rst_sync_a ( .src_arst(global_arst), .dest_clk(clk_domain_a), .dest_rst(rst_domain_a) ); // 同步到时钟域 B xpm_cdc_async_rst #(.DEST_SYNC_FF(2)) rst_sync_b ( .src_arst(global_arst), .dest_clk(clk_domain_b), .dest_rst(rst_domain_b) ); endmodule
五、工作原理
xpm_cdc_async_rst 内部结构:
-
异步复位检测:检测源异步复位信号
-
同步器链:多级同步器将复位信号传递到目标时钟域
-
复位释放:确保复位在目标时钟域安全释放
六、应用场景
1. 全局复位分配
module global_reset_distribution ( input wire por_rst, // 上电复位 input wire clk_core, // 核心逻辑时钟 input wire clk_memory, // 存储器时钟 input wire clk_io, // IO 时钟 output wire rst_core, // 核心逻辑复位 output wire rst_memory, // 存储器复位 output wire rst_io // IO 复位 ); xpm_cdc_async_rst #(.DEST_SYNC_FF(2)) rst_core_sync ( .src_arst(por_rst), .dest_clk(clk_core), .dest_rst(rst_core) ); xpm_cdc_async_rst #(.DEST_SYNC_FF(3)) rst_mem_sync ( .src_arst(por_rst), .dest_clk(clk_memory), .dest_rst(rst_memory) ); xpm_cdc_async_rst #(.DEST_SYNC_FF(2)) rst_io_sync ( .src_arst(por_rst), .dest_clk(clk_io), .dest_rst(rst_io) ); endmodule
2. 模块级复位同步
module dsp_module (
input wire clk,
input wire async_rst,
input wire [31:0] data_in,
output wire [31:0] data_out
);
// 同步模块内部复位
wire dsp_rst;
xpm_cdc_async_rst #(
.DEST_SYNC_FF(2),
.RST_ACTIVE_HIGH(1)
) dsp_rst_sync (
.src_arst(async_rst),
.dest_clk(clk),
.dest_rst(dsp_rst)
);
// DSP 处理逻辑
reg [31:0] pipeline_reg;
always @(posedge clk) begin
if (dsp_rst)
pipeline_reg <= 32'h0;
else
pipeline_reg <= data_in * 2;
end
assign data_out = pipeline_reg;
endmodule
3. 电源管理复位控制
module power_management ( input wire clk_operational, input wire clk_low_power, input wire wakeup_rst, // 唤醒复位 output wire op_rst, // 操作模式复位 output wire lp_rst // 低功耗模式复位 ); xpm_cdc_async_rst #(.DEST_SYNC_FF(2)) op_rst_sync ( .src_arst(wakeup_rst), .dest_clk(clk_operational), .dest_rst(op_rst) ); xpm_cdc_async_rst #(.DEST_SYNC_FF(3)) lp_rst_sync ( .src_arst(wakeup_rst), .dest_clk(clk_low_power), .dest_rst(lp_rst) ); endmodule
4. 调试复位同步
module debug_reset_sync ( input wire jtag_clk, // JTAG 时钟 input wire system_clk, input wire debug_rst, // 调试复位 output wire system_debug_rst // 系统调试复位 ); xpm_cdc_async_rst #( .DEST_SYNC_FF(2), .RST_ACTIVE_HIGH(1) ) debug_rst_sync ( .src_arst(debug_rst), .dest_clk(system_clk), .dest_rst(system_debug_rst) ); endmodule
七、完整参数列表
xpm_cdc_async_rst #( .DEST_SYNC_FF(2), // 目标同步寄存器级数(2-10) .INIT_SYNC_FF(0), // 同步寄存器初始值(0或1) .RST_ACTIVE_HIGH(1) // 复位有效电平(0=低有效,1=高有效) )
八、输出信号说明
dest_arst vs dest_rst:
-
dest_arst: 异步复位输出(与目标时钟异步) -
dest_rst: 同步复位输出(在目标时钟域同步)
// 使用同步复位输出(推荐) xpm_cdc_async_rst rst_sync ( .src_arst(async_rst), .dest_clk(clk), .dest_rst(sync_rst) // 同步复位,用于时序逻辑 ); // 使用异步复位输出(特殊情况) xpm_cdc_async_rst rst_async ( .src_arst(async_rst), .dest_clk(clk), .dest_arst(async_out) // 异步复位,用于特殊电路 );
九、时序特性
1. 复位断言
-
立即生效:复位断言是异步的
-
无时钟依赖:不需要目标时钟活跃
2. 复位释放
-
同步释放:复位释放在目标时钟边沿同步
-
延迟:
DEST_SYNC_FF个目标时钟周期后安全释放
十、在 Vivado 中的使用
1. 自动识别
Vivado 能够自动识别 XPM CDC 模块并应用适当的时序约束。
2. 约束建议
# 复位信号约束
set_false_path -from [get_ports {async_reset}] \
-to [get_cells {xpm_cdc_async_rst_inst/*sync*_reg}]
# 如果使用多个同步器,设置时钟组
set_clock_groups -asynchronous \
-group [get_clocks clk_a] \
-group [get_clocks clk_b]
十一、优势
-
安全性:专门为异步复位信号优化
-
可靠性:确保复位安全释放,避免亚稳态
-
灵活性:支持高电平和低电平有效复位
-
易用性:无需手动实现复杂的复位同步逻辑
十二、注意事项
1. 正确用法
// 正确:使用同步复位输出
xpm_cdc_async_rst #(.DEST_SYNC_FF(2)) good_sync (
.src_arst(async_reset),
.dest_clk(clk),
.dest_rst(sync_reset) // 用于时序逻辑复位
);
always @(posedge clk) begin
if (sync_reset) begin
// 复位逻辑
end else begin
// 正常操作
end
end
2. 错误用法
// 错误:在组合逻辑中使用同步复位
always @(*) begin
if (sync_reset) // 组合逻辑中避免使用同步复位
out = 1'b0;
else
out = in;
end
3. 复位域考虑
// 为每个时钟域创建独立的复位同步器 xpm_cdc_async_rst rst_sync_clk1 ( .src_arst(global_rst), .dest_clk(clk1), .dest_rst(rst_clk1) ); xpm_cdc_async_rst rst_sync_clk2 ( .src_arst(global_rst), .dest_clk(clk2), .dest_rst(rst_clk2) );
4. 参数选择指南
// 对于一般应用 xpm_cdc_async_rst #( .DEST_SYNC_FF(2), // 平衡MTBF和延迟 .RST_ACTIVE_HIGH(1) ) // 对于高可靠性系统 xpm_cdc_async_rst #( .DEST_SYNC_FF(3), // 提高MTBF .RST_ACTIVE_HIGH(1) ) // 对于低功耗设计 xpm_cdc_async_rst #( .DEST_SYNC_FF(2), .RST_ACTIVE_HIGH(0) // 低电平有效复位 )
十三、相关 XPM CDC 模块
-
xpm_cdc_sync_rst: 同步复位同步器 -
xpm_cdc_pulse: 脉冲同步器 -
xpm_cdc_handshake: 握手数据同步器
xpm_cdc_async_rst 是处理异步复位信号跨时钟域的标准方法,在 FPGA 设计中广泛用于确保复位信号的可靠同步和释放。
1754

被折叠的 条评论
为什么被折叠?



