UltraFast Design介绍(二) ——Clocking

目录

一、合理使用MMCM和PLL

二、MMCM和PLL的设置

1.时钟安全启动与启动顺序

​2.错误设置MMCM或PLL的后果

三、创建输出时钟

四、时钟资源总结

1.时钟资源

2.PLL和MMCM

3.IDELAY/IODELAY

4.ODDR

五、源同步接口


一、合理使用MMCM和PLL

MMCM和PLL是我们在FPGA设计中不可避免需要使用的资源,其在使用时应该注意以下几点:

  1. 任何输入都不能是悬浮状态。
  2. 复位信号RST需要连接到用户逻辑——如果在没有时钟的情况下RST直接接地会导致clk_wiz无法工作。具体依据如下。容易坑。
    PG065_pg23
  3. MMCM或PLL的输出LOCKED信号应该用来作为复位完成的状态标志位。
    1. 与PLL输出时钟驱动的逻辑单元需要保持复位状态,直到PLL的LOCKED信号输出拉高为时,此刻表明时钟被锁定,PLL处于稳定的状态。
    2. LOCKED在设计常会用作复位信号,无论是同步复位还是异步复位都应注意LOCKED信号与用户逻辑部分时钟的关系,同步逻辑需要对该信号进行打拍同步。
  4. 输出时钟有时需要与输入参考钟有严格的相位的对应关系,如相位对齐,此时一定要在反馈路径增加BUFG/BUFH。
  5. 确定反馈路径的输入和输出端,即CLKFBIN和CLKFBOUT。

二、MMCM和PLL的设置

1.时钟安全启动与启动顺序

当LOCKED信号被输入时钟连续采8次高电平时,才会输出时钟。这时候时钟输出驱动强制为BUFGCE,也即是受控的BUFG,即连续8次采样LOCKED高电平时使能CE端,确保了输出时钟的稳定性和有效性。

当使能Safe Clock Startup时,CLOCK SEQUENCING选择框有效,此时可以在GUI中控制时钟的启动顺序,而两个时钟的使能间隔时长为第二个启动时钟的8个时钟周期,这个功能会用在有多个时钟并且系统对时钟启动顺序有要求的场景。

2.错误设置MMCM或PLL的后果

  • 增加时钟jitter从而增加时序分析中的clock uncertainty(PLL相对MMCM对jitter有更大的改善,对jitter有要求的情况下请使用PLL,但对应的VCO Freq会相应增加,导致功耗增加
  • 建立错误的时钟相位关系
  • 使时序收敛更加困难

输出时钟的相位关系如下图,1、4、6同相位,2、3、5同相位。

三、创建输出时钟

        常用来作为时钟输出包括ODDR(Output Double Data Rate),取决于时钟和数据如何输出,这在源同步设计中常常使用。

       在vivado的template中V系列的ODDR如下所示。

 ODDR #(
      .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
      .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
      .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
   ) ODDR_inst (
      .Q(Q),   // 1-bit DDR output
      .C(C),   // 1-bit clock input
      .CE(CE), // 1-bit clock enable input
      .D1(D1), // 1-bit data input (positive edge)
      .D2(D2), // 1-bit data input (negative edge)
      .R(R),   // 1-bit reset
      .S(S)    // 1-bit set
   );

 ODDR用作转发时钟的场景,输出端可以直接输出到PORT,不加任何逻辑。

连接方式:输入时钟连接ODDR的C引脚,D1固定值1'b1, D2固定值1'b0,CE固定值1’b1,ODDR的输出Q连接到OBUF;

UG471_pg129

时钟输入有限制,需要从SRCC或者MRCC专用时钟输入引脚输入,时钟输出可以在任何引脚上输出。当输出时钟时,即使使用的是时钟专用输入管脚去输出时钟,也等同于使用普通的GPIO管脚输出时钟。

输出时钟的最佳方法是使用ODDR来转发时钟 (假设输出的时钟是一个专用时钟网络上的时钟)。每个IOB都具有ODDR功能。

这样做时,内部时钟一直停留在专用的时钟网络上,直到ODDR,永远不需要进入一般的路由结构。不建议直接将时钟带到OBUF,因为这需要内部时钟离开专用时钟网络,通过一般的fabric路由线路路由到OBUF。

对Spartan6里面,必须用ODDR寄存器输出。具体实现如下所示:

wire user_clk;
IBUFDS IBUFDS_inst_user_clk(
    .O(user_clk), // Buffer output
    .I(USRCLK_P_I), // Diff_p buffer input
    .IB(USRCLK_N_I) // Diff_n buffer input
);   

wire user_clk_bufg;
BUFG BUFG_inst_user_clk (
      .O(user_clk_bufg), // 1-bit output: Clock output
      .I(user_clk)
);

wire user_clk_bufg_oddr;
ODDR #(
      .DDR_CLK_EDGE("OPPOSITE_EDGE"), //"OPPOSITE_EDGE" or "SAME_EDGE"
      .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
      .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
 ) ODDR_out_clock_inst_user_clock (
     .Q(user_clk_bufg_oddr),   // 1-bit DDR output
     .C(user_clk_bufg),   // 1-bit clock input
     .CE(1'b1), // 1-bit clock enable input
     .D1(1'b1), // 1-bit data input (positive edge)
     .D2(1'b0), // 1-bit data input (negative edge)
     .R(),   // 1-bit reset
     .S()    // 1-bit set
);

 OBUFDS OBUFDS_inst_user_clock (
    .O (USER_SMA_CLOCK_P_O
    .OB(USER_SMA_CLOCK_N_O),     // Diff_n output
    .I (user_clk_bufg_oddr)      // Buffer input
 )

 在Xilinx的UG471手册pg128中详细描述了这种时钟方案,如下所示。这种方法可以有效提供时钟与数据相同的延时,而且多时钟情况下可以提供多时钟驱动。

UG471_pg128

 网上有人做了有无ODDR情况下的输出时钟时钟方案,并没有明显体现ODDR方案的优势,但笔者还是建议使用ODDR,ODDR输出时钟的场景也用于OSERDES等FPGA源同步系统中。使用ODDR使得随路时钟和数据在输出时是严格同步的,保证严格的相位对齐关系 。

四、时钟资源总结

1.时钟资源

常用的时钟资源包括全局时钟资源和区域时钟资源,全局时钟资源如BUFG、BUFGCE、BUFGMUX。区域时钟资源BUFH、BUFR、BUFIO、BUFMR等。主要介绍BUFMR。

  1. 如果一个时钟跨越多个bank的情况下,必须在不同region使用BUFMR来驱动BUFIO和BUFR。
  2. 每个BUFR的分频都是独立的,源同步需要保证所有BUFR是同步的。
    1. BUFMRCE关闭所有输入到BUFR的时钟。
    2. 复位所有BUFR,即所有BUFR的CLR端置位。
    3. 解复位所有的BUFR。在下个上升沿允许分频器工作。
    4. 使能BUFMR的CE端口。开始BUFR的时钟输入。保证了BUFR的同步关系。

场景一:BUFMR的输入必须是MRCC,可以驱动三个时钟域的BUFIO,只需要约束MRCC的管脚约束,其他位置不需要处理。

场景一

场景二:如果需要使用分频功能用到BUFR,输出时钟对齐必须使用BUFR的复位功能,则使用 BUFMRCE。

场景二

 场景三:需要对不同BANK的BUFR和BUFIO做位置约束。

场景三

 场景四:如果BUFIO使用完的情况,则使用BUFR不分频替代。BUFR做位置约束。

场景四

2.PLL和MMCM

  • PLL对jitter有较好的改善。
  • MMCM可以提供更宽范围的频率。
  • 对时序要求更紧的场合,我们建议选择PLL。

3.IDELAY/IODELAY

如果输入时钟需要较小的相位延时,可以使用IDELAY。

IDELAY不止可用于时钟,也可以用于数据,可以通过调整IDELAY调整时钟与数据相位关系。

4.ODDR

可用于产生一个单独的输出时钟。

五、源同步接口

ug471_pg153
UG471_pg153

BUFR能实现分频功能,会作为ISERDES的CLK_DIV的输入时钟,BUFIO是作为ISERDES的CLK的输入时钟,ISERDES输出的并行数据由BUFR提供逻辑时钟。

本人理解能力有限,欢迎各位批评指正。

  • 43
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

耿晓宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值