特权同学

Cyclone 器件全局时钟尽在掌控

0
阅读(3111)

本文结合cyclone器件(因为特权最近正在使用这个系列的器件)对FPGA的时钟资源进行一些探讨,或者说是特权同学的一点认识和大 家分享一下,有不对的欢迎指正。

翻开cyclone-handbook的Clock Management一章,其主要还是要介绍cyclone器件的PLL资源相关的内容。但是对于我们了解FPGA的全局时钟网络还是很有参考价值的。

Cyclone系列的器件基本都有2个PLL,EP1C3例外只有一个PLL。


上面这个图最说明问题,CLK0/CLK1作为PLL1的输入,CLK2/CLK3作为PLL2(EP1C3没有)的输入。当然了,如果你尝试用上面所规定的时钟管脚 以外的管脚作为PLL的输入,那么只会换来Quartus II的报错信息。

而从上图我们可以看到PLL的输出最多可以有三个,c0,c1,e0,c0和c1一般作为内部时钟使用,而e0是只能作为外部输出时钟使用的,就是说这个PLL输出时钟必须直接连接到器件外部的pin上,如果你尝试在FPGA内部逻辑使用e0作为时钟,那么你同样只能换来Quartus II的报错信息。

另外有一点必须提一下,先看下面的图。


绿色的方波是作为PLL输入的clk,而往下红色的分别是c0,c1,e0,最后面一个是所谓的Lock信号(拉高作为PLL输出有效信号)。也就是当PLL复位完成或者使能(到底要复位还是使能是可以在配置PLL时选择的)后若干个时钟周期后PLL的输出才会有效,那么在Lock拉高以后的PLL才是我们想要的。上面这个图里输入的clk和输出的时钟之间似乎没有相位差,是很理想的一个状态。但 是实际上PLL出来的时钟和输入的clk之间总是存在相位差的,仿真后如下面的图。


所以,个人感觉在PLL时钟资源充裕的情况下,统一使用PLL输出时钟作为内部逻辑的时钟使用,而不使用PLL的输入作为内部时钟,这样是为了防止内部的各个时钟之间保 持一定相位的对齐,同时我也发现PLL的输入时钟驱动内部逻辑的clock network latency相对要比PLL输出的时钟驱动内部逻辑的clock network lacency大得多。

如果非得用PLL的输入时钟同时作为内部逻辑的时钟,最好是根据它们的相位关 系进行一下时钟的对齐。如下面的两个图所示。



下面再看看cyclone器件的内部全局时钟网络的分配,8个全局时钟网络,左右各4个。而PLL1的输出c0,c1和CLK0/1以及DPCLK0-3(复用的时钟管脚)或者内部的逻辑可以使用左边的4个全局时钟网络;PLL2的输出c0,c1和CLK2/3以及DPCLK4-7(复用的时钟管脚)或者内部的逻辑可以使用右边的4个全局时钟网络。PLL输出作为外部时钟的e0是不会(也没有必要)分配到全局时钟网络的。


就拿左边的来说,可以使用4个全局时钟网络的信号其实不少,它们之中到底谁使用有限的全 局时钟网络呢?说白了,都是可以由你掌控的,当然了,在你不管它们的时钟会有一个缺省的状态。

如果Setting--Fitter Setting--More Setting…里的Aoto Global Clock开启时,Quartus II在实现时会根据内部逻辑的实际情况自动分配全局时钟,就是说谁占用全局时钟网络软件说了算(一般系统的时钟和复位信 号会占用全局时钟网络)。当然了,你也可以关闭它,然后自己来分配,这时你可以到Assignment Edit里Global Signals进行分配。然后你可以到编译报告里查看Fitter—>Rescource Section—>Global…里的信息。

另外 还有一个值得注意的地方,下面两个图示出了可以占用全局时钟网络的信号它们实际可以占用的全局时钟网络资源。比如PLL1的输出c0只能使用GCLK1或者GCLK2,c2只能使用GCLK0或者GCLK3。



拿一 个实例来看看,我们有一个CLK1输入的时钟信号clk,这个时钟信号clk同时是PLL1的输入,产生两个PLL输出c0和c1。系统本身有一个复位信号rst_n。此外,我们内部逻辑产生一个时钟clk_divown,在Aoto Global Clock开启的情 况下,我们得到了下面的全局时钟网络的分配结果。


PLL的c0分配到了GCLK2,c1分配到了GCLK3,PLL的输入时钟即CLK1的输入clk分配到了GCLK1,它们都分配到了规定的全局时钟网络内了。其次,clk_div_own和rst_n随机分配。

这个例子中的全局时钟网络对于我们的使用还是绰绰有余的,但是一个大的系统,时钟交错,高扇出的信号层 出不穷,那么对于全局时钟信号的掌控就需要格外小心了。

说白 了,对于设计者来说,最重要的是要做到一切尽在掌握。

Baidu
map