在当前的数字集成电路设计中,同步电路占了绝大部分。所谓同步电路,即电路中的所有寄存器由为数不多的几个全局时钟驱动,被相同时钟信号驱动的寄存器共同组成一个时钟域,并可认为同时时钟域内所有寄存器的时钟沿同时到达。
然而,在实际电路中,同时钟域内寄存器时钟沿的到达时间存在偏差,即时钟偏差。通过合理的时钟设计,可以减少这种时钟偏差,使其相对时钟周期可以忽略不计,从而达到同步的效果。
1 ASIC的时钟电路
在ASIC的电路设计中,自动布局布线工具使用动态搭建时钟缓冲器树的方法来解决时钟偏差问题。其基本思想就是控制时钟源与寄存器之间的门延时与线路延时。如果同时钟域内所有寄存器的时钟端与时钟源之间的路径,包含大体相同的时钟缓冲器个数与连线长度,就可以近似地认为时钟信号从时钟源到各寄存器时钟端的延时是相等的,因此寄存器间的时钟偏差可以忽略不计。
ASIC时钟树结构如图1所示。

2 FPGA的时钟电路
随着FPGA集成度的不断提升,单片FPGA已经可以完成百万门级的集成电路设计。因此,很多ASIC设计可以利用FPGA完成流片前的功能验证。甚至直接使用FPGA进行商业生产。但是,FPGA的特殊结构决定了基于FPGA的设计不能直接照搬在ASIC设计当中的某些经验,时钟设计便是其中较突出的一条。ASIC时钟树结构如图1所示。
由于FPGA的生产工艺,在出厂之前,FPGA内部元件之间的连线已经完全固定。同时,FPGA具有连线延时相对门延时较大的特点,造成FPGA并不能通过动态搭建时钟缓冲器树的方法解决时钟偏差问题。实际上,时钟树结构已经被预先固化在芯片当中。针对Xilinx公司的Virtex Ⅱ系列的FPGA。其时钟树结构如图2所示。

该系列FPGA直接利用单独一层铜布线层搭建时钟网络。所有的时钟信号,只能通过处于芯片纵向中轴线上下两端的16个BUFGMUX进入时钟网络。所有BUFGMUX输出端一直延伸到芯片的中心,连接到铜布线层处于芯片中央纵向分布宽度为8的时钟总线。纵向时钟总线再连接到横向的8条宽度为8的时钟总线,进而延伸到每一个CLB(Configurable Logic Block,可编程逻辑块)的GRM(General Route Matrix,通用布线矩阵阵列)上。
也就是说,在Virtex Ⅱ结构的FPGA当中,最多可以存在16个时钟域,然而同时只能存在最多8个全局时钟(上下两个对应的BUFGMUX共用一条时钟总线)。由于每个寄存器的时钟端都通过横向和纵向的时钟总线连接到位于芯片中央的时钟源,而时钟源通过相同路径长度的连线和BUFGMUX连接,因此可以认为从同一BUFGMUX出发的时钟信号到芯片内所有寄存器的延时相同,从而没有时钟偏差,经过实际工程验证,同BUFGMUX构成的时钟域内时钟偏差最多不超过0.3ns。
3 设计实例
为了更好的说明FPGA 时钟电路的使用方法与其特殊的问题,下面将用一个在Virtex Ⅱ 6000 FPGA上实现的设计实例具体说明时钟电路建立的方法。
3.1 问题分析
图3显示了在该设计当中的4个时钟域。

这样的时钟结构,在ASIC的时钟树设计中,并不会引发很大的问题。但是在FPGA的设计中,如果不加处理,会引起电路综合、布局布线的巨大压力。其主要的问题源于FPGA综合软件对BUFGMUX的自动指定,造成门控时钟和分频时钟与源时钟之间出现较大的时钟偏差。
一般,综合软件可以通过Verilog HDL的“posedge”和“negedge”关键字,或者VHDL当中的“event”关键字判断出时钟信号。然而,综合工具并没有判断门控时钟与分频时钟的能力,即就是综合工具认定的时钟只能是一根网线,而不能穿越一般的逻辑门。为了让同时钟域的寄存器间没有时钟偏差。综合工具会自动在时钟的源头为时钟信号指定BUFGMUX,使得时钟信号使用铜布线资源。
经过综合工具的自动指定,最终会将图3当中时钟结构转换为图4中的电路结构。

正如第2节所述,FPGA通过其特定的时钟网络,使得时钟信号从BUFGMUX到每个CLB的时钟端没有时钟偏差。但是,此结构的间接后果是为每个CLB的时钟端添加了一个相同的时钟线延时,即从BUFGMUX通过时钟网络到达GRM的时间,在正常情况下,这个时间为6-7ns。
正是由于这一点,在综合工具自动指定BUFGMUX之后,为了实现CLK_2XG这个门控时钟,必须将CLK_2X时钟信号通过与门,再经过BUFGMUX重新连接到时钟资源。显而易见,CLK_2XG时钟域的时钟信号相对时钟源CLK_IN来说经过了两次BUFGMUX和CLK_2X的时钟域产生了至少6ns的时钟偏差。同理,CLK_1XG和CLK_1X相应与CLK_2X之间存在12ns和6ns的时钟偏差。相对CLK_2X 80MHz的时钟频率,一周期为12.5ns,显然最大12ns的跨时钟域的时钟偏差是不能忍受的。从图5的后仿波形当中,可以很明显地看到这个时钟偏差达到了13.34ns。
3.2 解决方案
3.2.1 门控时钟
实际上,BUFGMUX并不是简单的时钟缓冲器,他是一个具有低时钟偏差、高驱动能力并带有选择端的双路选择器。使用不同的原语进行实例化,BUFGMUX可以构成时钟选择器、时钟门控器或者简单的时钟缓冲器。
尽管BUFGMUX就3种使用方式,但如果让综合软件自动在合适的位置指定BUFGMUX,由于综合软件只能认出网线形式的时钟信号,因而只会使用BUFG的方式使用BUFGMUX,造成了上述的问题。

为了去除由于门控时钟造成的时钟偏差,只能通过手动更改代码,在合适的位置实例化BUFGMUX。在此例中可以为CLK_2X信号实例化BUFG原语,而使用BUFGCE原语替代原来的与门,并直接使用CLK_IN为BUGCE的输入。这样CLK_2X和CLK_2XG都只经过了一个BUFGMUX,因此可以近似地认为不存在时钟偏差。同理CLK_1X和CLK_1XG之间的时钟偏差也可以解决。
1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.

