Xilinx 参数化宏(XPM)xpm_cdc_sync_rst

       在 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. 源复位检测:在源时钟域检测同步复位信号

  2. 同步器链:多级同步器将复位信号传递到目标时钟域

  3. 复位生成:在目标时钟域生成同步复位信号

六、应用场景

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(异步复位同步器)

  • 输入:异步复位信号(如电源复位、按钮复位)

  • 输出:同步释放的复位信号

  • 应用:全局复位、上电复位等异步复位源

十一、优势

  1. 确定性:固定的同步延迟

  2. 可靠性:专业的同步器设计避免亚稳态

  3. 一致性:在所有 Xilinx 器件上一致工作

  4. 易用性:简化同步复位跨时钟域设计

十二、注意事项

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 是处理同步复位信号跨时钟域的标准方法,特别适用于软件控制复位、条件复位和层次化复位等场景。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值