目录
一、合理使用MMCM和PLL
MMCM和PLL是我们在FPGA设计中不可避免需要使用的资源,其在使用时应该注意以下几点:
- 任何输入都不能是悬浮状态。
- 复位信号RST需要连接到用户逻辑——如果在没有时钟的情况下RST直接接地会导致clk_wiz无法工作。具体依据如下。容易坑。
PG065_pg23 - MMCM或PLL的输出LOCKED信号应该用来作为复位完成的状态标志位。
- 与PLL输出时钟驱动的逻辑单元需要保持复位状态,直到PLL的LOCKED信号输出拉高为时,此刻表明时钟被锁定,PLL处于稳定的状态。
- LOCKED在设计常会用作复位信号,无论是同步复位还是异步复位都应注意LOCKED信号与用户逻辑部分时钟的关系,同步逻辑需要对该信号进行打拍同步。
- 输出时钟有时需要与输入参考钟有严格的相位的对应关系,如相位对齐,此时一定要在反馈路径增加BUFG/BUFH。
- 确定反馈路径的输入和输出端,即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;
![](https://i-blog.csdnimg.cn/blog_migrate/f83ca6c5c2b8b0ba3a20a8549900d74a.png)
时钟输入有限制,需要从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中详细描述了这种时钟方案,如下所示。这种方法可以有效提供时钟与数据相同的延时,而且多时钟情况下可以提供多时钟驱动。
![](https://i-blog.csdnimg.cn/blog_migrate/bd4911b708e78eccf09fe99494e8713d.png)
网上有人做了有无ODDR情况下的输出时钟时钟方案,并没有明显体现ODDR方案的优势,但笔者还是建议使用ODDR,ODDR输出时钟的场景也用于OSERDES等FPGA源同步系统中。使用ODDR使得随路时钟和数据在输出时是严格同步的,保证严格的相位对齐关系 。
四、时钟资源总结
1.时钟资源
常用的时钟资源包括全局时钟资源和区域时钟资源,全局时钟资源如BUFG、BUFGCE、BUFGMUX。区域时钟资源BUFH、BUFR、BUFIO、BUFMR等。主要介绍BUFMR。
- 如果一个时钟跨越多个bank的情况下,必须在不同region使用BUFMR来驱动BUFIO和BUFR。
- 每个BUFR的分频都是独立的,源同步需要保证所有BUFR是同步的。
- BUFMRCE关闭所有输入到BUFR的时钟。
- 复位所有BUFR,即所有BUFR的CLR端置位。
- 解复位所有的BUFR。在下个上升沿允许分频器工作。
- 使能BUFMR的CE端口。开始BUFR的时钟输入。保证了BUFR的同步关系。
场景一:BUFMR的输入必须是MRCC,可以驱动三个时钟域的BUFIO,只需要约束MRCC的管脚约束,其他位置不需要处理。
![](https://i-blog.csdnimg.cn/blog_migrate/6512899666e97b5c7eeb146d9decfd98.png)
场景二:如果需要使用分频功能用到BUFR,输出时钟对齐必须使用BUFR的复位功能,则使用 BUFMRCE。
![](https://i-blog.csdnimg.cn/blog_migrate/e3733a902d3c5f27a491739be81c0c04.png)
场景三:需要对不同BANK的BUFR和BUFIO做位置约束。
![](https://i-blog.csdnimg.cn/blog_migrate/be2b80273cd088de85a6661753b0e109.png)
场景四:如果BUFIO使用完的情况,则使用BUFR不分频替代。BUFR做位置约束。
![](https://i-blog.csdnimg.cn/blog_migrate/ae4a5498a75fa67119b1f27ff485f72a.png)
2.PLL和MMCM
- PLL对jitter有较好的改善。
- MMCM可以提供更宽范围的频率。
- 对时序要求更紧的场合,我们建议选择PLL。
3.IDELAY/IODELAY
如果输入时钟需要较小的相位延时,可以使用IDELAY。
IDELAY不止可用于时钟,也可以用于数据,可以通过调整IDELAY调整时钟与数据相位关系。
4.ODDR
可用于产生一个单独的输出时钟。
五、源同步接口
![ug471_pg153](https://i-blog.csdnimg.cn/blog_migrate/fa9d555a564e31d8812bdee1baf900e6.png)
BUFR能实现分频功能,会作为ISERDES的CLK_DIV的输入时钟,BUFIO是作为ISERDES的CLK的输入时钟,ISERDES输出的并行数据由BUFR提供逻辑时钟。
本人理解能力有限,欢迎各位批评指正。