FPGA跨异步时钟ASYNC_REG和XPM_CDC处理-Xilinx-AMD社区-FPGA CPLD-ChipDebug

FPGA跨异步时钟ASYNC_REG和XPM_CDC处理

  FPGA中跨异步时钟处理的方法,是面试中经常碰到的问题,也是我们平时工作中经常会碰到的场景,对于单bit的跨异步时钟处理,我们最常用的方法就是打两拍,但这时这两级寄存器最好是放到同一个Slice中,比如下面的代码:

reg reg_1;
reg reg_2,
 reg_3;

always @ ( posedge clk_src ) begin 
    reg_1 <= ~reg_1;
end  

always @ ( posedge clk_dst) begin 
    reg_2 <= reg_1;
    reg_3 <= reg_2;
end

 reg_2和reg_3应该放到同一个Slice中,但综合工具并不是那么智能,有时并不会综合到同一个Slice中,这时就需要我们添加ASYNC_REG的属性:

(*ASYNC_REG="true"*)reg reg_2, reg_3;
图片[1]-FPGA跨异步时钟ASYNC_REG和XPM_CDC处理-Xilinx-AMD社区-FPGA CPLD-ChipDebug

image-20211016154759934

  其实Vivado中还提供了另外一种处理单bit跨时钟的方式,就是xpm_cdc_single

图片[2]-FPGA跨异步时钟ASYNC_REG和XPM_CDC处理-Xilinx-AMD社区-FPGA CPLD-ChipDebug
image-20211016155518223

对于上面的跨时钟域场景,我们可以采用如下方式例化:

 

xpm_cdc_single的原语,会自动插入ASYNC_REG属性,保证放到同一个Slice中。

请登录后发表评论

    没有回复内容