前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FPGA跨异步时钟ASYNC_REG和XPM_CDC处理

FPGA跨异步时钟ASYNC_REG和XPM_CDC处理

作者头像
猫叔Rex
发布2022-01-24 14:02:51
8980
发布2022-01-24 14:02:51
举报
文章被收录于专栏:科学计算科学计算

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

代码语言:javascript
复制
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_2reg_3应该放到同一个Slice中,但综合工具并不是那么智能,有时并不会综合到同一个Slice中,这时就需要我们添加ASYNC_REG的属性:

代码语言:javascript
复制
(*ASYNC_REG="true"*)reg reg_2, reg_3;

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

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

代码语言:javascript
复制
   xpm_cdc_single #(
      .DEST_SYNC_FF(2),   // DECIMAL; range: 2-10
      .INIT_SYNC_FF(0),   // DECIMAL; 0=disable simulation init values, 1=enable simulation init values
      .SIM_ASSERT_CHK(0), // DECIMAL; 0=disable simulation messages, 1=enable simulation messages
      .SRC_INPUT_REG(1)   // DECIMAL; 0=do not register input, 1=register input
   )
   xpm_cdc_single_inst (
      .dest_out(reg_3), // 1-bit output: src_in synchronized to the destination clock domain. This output is
                           // registered.

      .dest_clk(clk_dst), // 1-bit input: Clock signal for the destination clock domain.
      .src_clk(clk_src),   // 1-bit input: optional; required when SRC_INPUT_REG = 1
      .src_in(reg_1)      // 1-bit input: Input signal to be synchronized to dest_clk domain.
   );

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 傅里叶的猫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档