Xilinx 参数化宏(XPM)xpm_cdc_async_rst

       在 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. 异步复位检测:检测源异步复位信号

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

  3. 复位释放:确保复位在目标时钟域安全释放

六、应用场景

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. 安全性:专门为异步复位信号优化

  2. 可靠性:确保复位安全释放,避免亚稳态

  3. 灵活性:支持高电平和低电平有效复位

  4. 易用性:无需手动实现复杂的复位同步逻辑

十二、注意事项

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 设计中广泛用于确保复位信号的可靠同步和释放。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值