在 Verilog 中,xpm_cdc_sync_rst 是 Xilinx 参数化宏(XPM) 中的同步复位同步器模块,用于将同步复位信号安全地传递到另一个时钟域。
一、概述
xpm_cdc_sync_rst 专门用于处理同步复位信号的时钟域交叉,确保复位信号在目标时钟域中正确同步。
二、基本语法
// Verilog 实例化 xpm_cdc_sync_rst #( .DEST_SYNC_FF(2), // 范围:2-10 .INIT(1), // 0-1 .INIT_SYNC_FF(0), // 0-1 .SIM_ASSERT_CHK(0) // 0-1 ) xpm_cdc_sync_rst_inst ( .src_rst(src_rst), // 源同步复位 .dest_clk(dest_clk), // 目标时钟 .dest_rst(dest_rst) // 目标同步复位 );
三、参数详解
1. 关键参数
-
DEST_SYNC_FF(默认=2): 目标时钟域同步寄存器级数 -
INIT(默认=1): 复位初始值(输出复位信号的初始状态) -
INIT_SYNC_FF(默认=0): 同步寄存器初始值
四、使用示例
示例 1:基本同步复位同步
module sync_rst_sync_example ( input wire clk_src, // 源时钟 input wire clk_dest, // 目标时钟 input wire sync_rst_src, // 源同步复位 output wire sync_rst_dest // 目标同步复位 ); xpm_cdc_sync_rst #( .DEST_SYNC_FF(2), // 2级同步 .INIT(1) // 复位初始值为1(高有效) ) rst_sync_inst ( .src_rst(sync_rst_src), .dest_clk(clk_dest), .dest_rst(sync_rst_dest) ); endmodule
示例 2:低电平有效同步复位
module low_active_sync_rst ( input wire clk_a, input wire clk_b, input wire rst_n_src, // 源低电平有效复位 output wire rst_n_dest // 目标低电平有效复位 ); xpm_cdc_sync_rst #( .DEST_SYNC_FF(3), // 3级同步提高可靠性 .INIT(0) // 初始值为0(低有效) ) rst_sync_low ( .src_rst(rst_n_src), .dest_clk(clk_b), .dest_rst(rst_n_dest) ); endmodule
示例 3:多时钟域复位同步
module multi_clock_rst_sync ( input wire main_clk, input wire aux_clk, input wire eth_clk, input wire main_rst, // 主时钟域复位 output wire aux_rst, // 辅助时钟域复位 output wire eth_rst // 以太网时钟域复位 ); // 同步到辅助时钟域 xpm_cdc_sync_rst #(.DEST_SYNC_FF(2)) aux_rst_sync ( .src_rst(main_rst), .dest_clk(aux_clk), .dest_rst(aux_rst) ); // 同步到以太网时钟域 xpm_cdc_sync_rst #(.DEST_SYNC_FF(2)) eth_rst_sync ( .src_rst(main_rst), .dest_clk(eth_clk), .dest_rst(eth_rst) ); endmodule
五、工作原理
xpm_cdc_sync_rst 内部结构:
-
源复位检测:在源时钟域检测同步复位信号
-
同步器链:多级同步器将复位信号传递到目标时钟域
-
复位生成:在目标时钟域生成同步复位信号
六、应用场景
1. 软件控制复位同步
module software_reset_sync ( input wire cpu_clk, // CPU 时钟 input wire peri_clk, // 外设时钟 input wire sw_rst, // 软件复位(CPU时钟域) output wire peri_sw_rst // 外设时钟域软件复位 ); xpm_cdc_sync_rst #( .DEST_SYNC_FF(2), .INIT(0) // 初始无复位 ) sw_rst_sync ( .src_rst(sw_rst), .dest_clk(peri_clk), .dest_rst(peri_sw_rst) ); endmodule
2. 条件复位传播
module conditional_reset_sync (
input wire ctrl_clk,
input wire data_clk,
input wire error_condition,
input wire [2:0] error_mask,
output wire data_path_rst
);
// 在控制时钟域生成条件复位
reg ctrl_rst;
always @(posedge ctrl_clk) begin
if (error_condition && (error_mask != 3'b0))
ctrl_rst <= 1'b1;
else
ctrl_rst <= 1'b0;
end
// 同步到数据路径时钟域
xpm_cdc_sync_rst #(.DEST_SYNC_FF(2)) cond_rst_sync (
.src_rst(ctrl_rst),
.dest_clk(data_clk),
.dest_rst(data_path_rst)
);
endmodule
3. 超时复位生成
module timeout_reset_sync (
input wire monitor_clk,
input wire system_clk,
input wire heartbeat,
output wire system_rst
);
// 心跳监控和超时复位生成
reg [7:0] timeout_counter;
reg monitor_rst;
always @(posedge monitor_clk) begin
if (heartbeat) begin
timeout_counter <= 8'h00;
monitor_rst <= 1'b0;
end else if (timeout_counter == 8'hFF) begin
monitor_rst <= 1'b1; // 超时复位
end else begin
timeout_counter <= timeout_counter + 1;
end
end
// 同步到系统时钟域
xpm_cdc_sync_rst #(.DEST_SYNC_FF(2)) timeout_rst_sync (
.src_rst(monitor_rst),
.dest_clk(system_clk),
.dest_rst(system_rst)
);
endmodule
4. 多级复位控制
module hierarchical_reset_sync ( input wire top_clk, input wire sub_clk, input wire top_level_rst, input wire module_enable, output wire module_rst ); // 顶层复位逻辑 wire module_rst_ctrl; assign module_rst_ctrl = top_level_rst || !module_enable; // 同步到子模块时钟域 xpm_cdc_sync_rst #( .DEST_SYNC_FF(2), .INIT(1) // 初始处于复位状态 ) hierarchical_rst_sync ( .src_rst(module_rst_ctrl), .dest_clk(sub_clk), .dest_rst(module_rst) ); endmodule
七、完整参数列表
xpm_cdc_sync_rst #( .DEST_SYNC_FF(2), // 目标同步寄存器级数(2-10) .INIT(1), // 复位初始值(0或1) .INIT_SYNC_FF(0), // 同步寄存器初始值(0或1) .SIM_ASSERT_CHK(0) // 仿真断言检查(0或1) )
八、时序特性
1. 复位传输延迟
src_rst 断言 → [DEST_SYNC_FF个dest_clk周期] → dest_rst 断言 src_rst 释放 → [DEST_SYNC_FF个dest_clk周期] → dest_rst 释放
2. 关键时序
-
同步延迟:固定的
DEST_SYNC_FF个目标时钟周期 -
确定性:延迟是可预测的
-
安全性:避免亚稳态传播
九、在 Vivado 中的使用
1. 自动识别
Vivado 能够自动识别 XPM CDC 模块并应用适当的时序约束。
2. 约束建议
# 设置异步时钟组
set_clock_groups -asynchronous \
-group [get_clocks src_clk] \
-group [get_clocks dest_clk]
# 复位信号虚假路径
set_false_path -from [get_cells {src_rst_reg*}] \
-to [get_cells {xpm_cdc_sync_rst_inst/*sync*_reg}]
十、与 xpm_cdc_async_rst 的区别
1. xpm_cdc_sync_rst(同步复位同步器)
-
输入:同步复位信号(已同步到源时钟域)
-
输出:同步到目标时钟域的复位信号
-
应用:软件复位、条件复位等同步生成的复位
2. xpm_cdc_async_rst(异步复位同步器)
-
输入:异步复位信号(如电源复位、按钮复位)
-
输出:同步释放的复位信号
-
应用:全局复位、上电复位等异步复位源
十一、优势
-
确定性:固定的同步延迟
-
可靠性:专业的同步器设计避免亚稳态
-
一致性:在所有 Xilinx 器件上一致工作
-
易用性:简化同步复位跨时钟域设计
十二、注意事项
1. 正确用法
// 正确:源复位已同步到源时钟域 reg src_rst_sync; always @(posedge src_clk) begin src_rst_sync <= async_reset; // 先同步异步复位 end xpm_cdc_sync_rst sync_rst_cdc ( .src_rst(src_rst_sync), // 已同步的复位 .dest_clk(dest_clk), .dest_rst(dest_rst_sync) );
2. 错误用法
// 错误:直接同步异步复位 xpm_cdc_sync_rst bad_sync ( .src_rst(async_reset), // 异步输入! .dest_clk(clk), .dest_rst(sync_rst) // 可能不可靠 );
3. 复位持续时间要求
// 源复位必须持续足够长的时间 // 至少 (DEST_SYNC_FF + 1) 个源时钟周期
4. 参数选择指南
// 对于一般应用 xpm_cdc_sync_rst #( .DEST_SYNC_FF(2), // 平衡MTBF和延迟 .INIT(1) // 高有效复位 ) // 对于高可靠性系统 xpm_cdc_sync_rst #( .DEST_SYNC_FF(3), // 提高MTBF .INIT(0) // 低有效复位 ) // 对于低延迟需求 xpm_cdc_sync_rst #( .DEST_SYNC_FF(2), // 最小延迟 .INIT(1) )
十三、相关 XPM CDC 模块
-
xpm_cdc_async_rst: 异步复位同步器 -
xpm_cdc_pulse: 脉冲同步器 -
xpm_cdc_handshake: 握手数据同步器 -
xpm_cdc_single: 单比特同步器
xpm_cdc_sync_rst 是处理同步复位信号跨时钟域的标准方法,特别适用于软件控制复位、条件复位和层次化复位等场景。
421

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



