上篇博文:时钟简介,简单的介绍了下时钟,这篇博文讲下时钟域的相关问题。
时钟域的概念
随着FPGA芯片所承载的功能日趋复杂,单个时钟信号已经往往不能满足FPGA设计的需求。就拿一个最简单地串并转换接口来说,要实现它就至少需要两个时钟信号,因此,通常情况下,一个FPGA设计中往往要用到多个时钟信号。
当FPGA设计中的时钟增多了以后,多时钟并存,就会导致跨时钟域问题。这篇博文暂时不讲跨时钟域问题,而要要将目光聚集到时钟域上,只要搞清楚什么是时钟域,后续的讨论才有意义。
简而言之,时钟域就是时钟信号的“势力范围”。一个时钟域只能存在一个时钟信号,但是一个时钟信号最多可以对应两个时钟域,当其上升沿和下降沿分别都被一部分资源敏感的时候。
而被各个时钟域所瓜分的资源,正是具有存储功能的各个单元,而其中最典型的就是寄存器。要想判断一个寄存器时属于哪一个时钟域的,方法很简单,只要看它的时钟输入端口接的是哪个时钟信号以及敏感那个边沿即可。
时钟树简介
既然是“势力范围”,那么不同时钟信号的时钟域大小就可能不同。因此,对于“势力范围”大小不同的各个时钟域,时钟的管理方法也必然不同,也就是使用时钟树!(时钟树其实就是FPGA内部的时钟网络资源)
那么时钟树是如何管理时钟域的呢?
首先,如果一个时钟域包含10000个触发器,那么该时钟信号必须能够同时连接到这10000个触发器的时钟输入端,而如此之大的信号扇出要怎么实现呢?
时钟树可以做到这么大的扇出!
其次,为了达到更好的时序指标,我们总希望时钟信号尽可能同时到达其时钟域内各个触发器的时钟输入端,那么如此苛刻的要求又要怎么实现呢?
不用担心,时钟树可以保证时钟信号到达时钟域内不同的触发器的时间差最小。
由此可见,时钟树资源对时钟信号的重要性。
时钟树的工作原理
先看看百度百科的解释:
时钟树,是个由许多缓冲单元(buffer cell)平衡搭建的网状结构,它有一个源点,一般是时钟输入端(clock input port),也有可能是design内部某一个单元输出脚(cell output pin),然后就是由一级一级的缓冲单元搭建而成,具体的多少级,根据你的设置以及所使用的单元而定,目的就是使所用终点的clock skew(一般最关心这个)、insertion delay以及transition了,满足设计要求。
给出FPGA之道的解释:
如下图:
上图为一个时钟树的原理结构图,时钟信号由最中间的树根引入时钟树,并经由第一级缓存扇出若干个分别送往不同的区域;在各个区域中,再采用同样的方式继续扇出并送往不同的子区域;如此往复,直到时钟信号到达最基本的触发器等资源。
可见,时钟树主要利用多级扇出的形式来达到最终的高扇出结果;而通过控制各级扇出后的布线长度尽量一致来保证时钟信号能够尽可能同时到达各个触发器,这就是时钟树工作的基本原理。
注意,如果两个时钟域分别对应一个时钟信号的上升沿和下降沿,则它们可以共用一个时钟树。
最后,需要澄清一个概念,那就是时钟树是保证时钟信号到达时钟域内不同触发器的时间差尽可能小的资源,而不是保证时钟信号到达触发器所消耗时间最短的资源。
时钟树的分类
按照时钟树的作用范围来看,FPGA内部的时钟树资源共有三种:全局时钟树、区域时钟树、IO时钟树。
这篇博文就到这里,下篇博文接着讲如何正确地使用时钟。包括,如何选择时钟树,时钟信号如何上树等问题。
参考文献:
FPGA之道
百度百科