wind330

掌控全局时钟网络资源

0
阅读(2876)

全局时钟驱动整个FPGA的单元模块,但是相对LC,M9K,全局时钟资源很少,所以需要合理的分配。

哪些信号会消耗全局时钟网络呢?外部输入或者内部产生时钟,时钟使能,异步清零信号以及其他高扇出信号。我以前一直认为全局时钟资源交给QuartusII自动分配就可以得到最优结果,其实不然。

如何规划全局时钟是很重要的,以Cyclone3器件为例,FPGA的每一侧可以有五个全局时钟输入,如下图:

举一个极端的例子,我们需要PLL1的四个时钟输出PLL1_C0,PLL1_C1,PLL1_C2,PLL1_C3做为全局时钟,而且还需要一个外部输入的时钟做为全局时钟网络,该五个时钟占用全局时钟资源可以分为下面几种情况:

C0

C1

C2

C3

外部时钟输入脚

GCLK0

GCLK1

GCLK2

GCLK3

CLK0/2

GCLK0

GCLK4

GCLK2

GCLK3

CLK1/2

GCLK0

GCLK4

GCLK2

GCLK1

CLK2/3

GCLK3

GCLK4

GCLK0

GCLK1

CLK0/1

GCLK3

GCLK4

GCLK2

GCLK1

CLK0/3

由上面表可以知道,外部时钟管脚可以根据需要连接CLK[0..3]任意一个专用时钟输入脚,具体选择由QuartusII软件自动分配完成。也就是说,在FPGA的一侧连入五个全局时钟时,我们可以根据布线要求任意把时钟连至CLK[0..3]之一,但是每侧最多只能连五个全局时钟,如果我们需要在外部连入两个时钟时,并假设连接在CLK0,CLK1时,它们中的一个将无法占用全局时钟资源,改走普通布线资源,具体哪一个由QuartusII判断决定。由于普通布线资源会造成时钟到达各个寄存器不尽相同,也就是CLK SKEW会很大,时序收敛性能就大大减低,所以,我们需要将CLK0,CLK1中的一个连至下一组时钟专用管脚CLK[4..7],全部时钟都在全局时钟网络上。

当我们的系统占用比较多的全局时钟资源时,将外部的时钟和FPGA内部产生的时钟资源综合考虑,充分考虑PLL的位置以及外部输入时钟的管脚位置,保证每个时钟都能分配到全局时钟资源,得到最好的时序性能。

每个全局时钟都有一个时钟控制模块(Clock Control Block),如下图:


该部分的绝大部分配置都是由QuartusII完成,我们能够设置是(2)CLKSELECT[1..0],在MegaWizard…选择I/O--ALTCLKCTRL模块,就可以得到相应的模块,由上图可以知道,该模块的数据必须来自专用时钟管脚或者PLL输出,无法与LC驱动的全局时钟资源连接。当我们需要进行时钟切换时,最好用该功能模块,因为用LC产生的时钟选择模块很容易产生毛刺,另时序电路无法正常工作。

我们知道外部输入或者内部产生时钟,时钟使能,异步清零信号以及其他高扇出信号都会占用全局时钟资源,当系统涉及的上述信号数量过多时,FPGA无法满足,我们就需要有取舍的设置哪些时钟可以占用Global Clock,哪些可以不用。具体设置在Assigment Editor中完成,说明如下:

Auto Global Clock:用于设置时钟是否占用Global Clock;

Auto Global Register Control Signals:用于设置寄存器控制信号(异步复位,寄存器使能等)是否占用Global Clock;

也可在Setting--Fitter Setting--More Setting…将上述设置关闭,则QuartusII阻止信号分配在全局时钟资源上(不推荐)。