【CXD720】-准确理解FPGA时序的机理
时序设计是FPGA设计过程中的重要组成部分,保证FPGA程序能够正确运行,就是保证程序所生成的电路能够在一定频率范围内正确运行。
很多电路,当速度快到一定程度,设计的方法,工程师所要关注的细节就完全不同了。
当程序需要高速时钟频率下运行时,核心就是确定时序的正确性。
FPGA设计与C语言等其它语言有本质上的区别,时序就是其中之一。
FPGA设计过程中有很多种时序约束。但是正如绝大多数知识一样,初学者需要理解最核心的知识,在理解最核心知识的基础上,才能推而广之,快速牢固的学习其它枝枝叶叶的知识。
FPGA设计过程中,最重要的约束有3种:时钟约束create_clock、输入延时set_input_delay、输出延时set_output_delay。
简单来讲,时钟约束是指FPGA电路中的时钟能够跑多快;输入延时用于指定内部时钟上升沿时(假设统一采用上升沿设计),外部信号需提前多少时间,延时多久后才能到达FPGA对应管脚(上升沿时刻前后,数据都要保持稳定);输出延时用于模拟下游器件的建立 / 保持要求,保证 FPGA 输出数据满足外部芯片时序。
虽然上面说的是“简单来讲”,估计除时钟约束外,输入延时和输出延时、以及建立、保持等概念已经开始让初学者犯迷糊了。
别慌,我们先弄清楚FPGA中时序电路正确工作的基本前提条件,而后再理解建立、保持等概念就比较容易了。
所谓时序电路,就是指包含有D触发器(也可以称为寄存器)的电路。或者说,时序电路就是由组合逻辑电路和D触发器组成的电路。纯粹的组合逻辑电路没有时序的概念,输入状态改变,输出状态立马就改变。D触发器是受时钟控制的,只有当时钟上升沿来到的时刻,输出状态才可能改变。一般来讲,FPGA程序统一受少数几个独立的时钟控制(大多数情况仅受同一个时钟控制),因此所有的触发器均在相同的时钟控制下工作,从而产生了时序的概念。
所以,时序的核心,是弄清楚D发器的时序要求。
D触发器有以下3个核心时序概念:
1. 建立时间 \Tsu:Setup Time
定义:时钟有效沿到来之前,输入 D 信号必须稳定不变的最小时间。
- 本质:触发器内部采样通路需要足够时间完成电平采样、内部节点充放电;若 D 变化距离时钟沿不足Tsu,内部锁存器无法正确捕获电平,出现亚稳态。
- 器件特性:FPGA 芯片手册给定固定最小值(如 Xilinx 7 系列DFF(触发器)的Tsu在0.2ns~0.5ns 之间)。
2. 保持时间 \Th:Hold Time
定义:时钟有效沿到来之后,输入 D 信号必须继续保持稳定不变的最小时间。
- 本质:时钟沿到来后,内部传输门切换需要时间,此时 D 若立刻跳变会冲掉刚采样的数据。
- 关键特点:与时钟周期无关,仅由器件内部电路决定;高速设计更容易出现保持违例。
3. 输出延迟 \Tco:Clock-to-Output Delay
定义:时钟有效沿到达触发器时钟端,到输出 Q 稳定更新的延迟。
- 组成:内部时钟缓冲延迟 + 内部传输门 / 寄存器通路延迟。
图1 D触发器基本时序关系
一、我们先分析FF1:
分析前需要明确关于时序的参考相位,由于考虑了Tsu、Th、Tco,时钟的上升沿认为是理想的状态,没有上升时间,信号的变化也是理想状态,没有变化时间。且假设clk到各触发器有布线没有延时,也就是没有任何时钟歪斜。
din是管脚输入到FF1端d1的信号,这个信号的状态不受时钟clk控制。如果clk在上升沿T0时刻采样到正确的d1,则要求d1在clk上升沿前Tsu时间内保持稳定。由于clk上升沿来到之后,FFT内部的传输门切换需要时间,因此在clk上升沿来到之后,d1需要在Th之内仍然保持稳定。
这是什么意思?意思时clk上升沿的前后,d1均需要保持稳定。意思是clk上升沿需要对准d1信号中间的稳定状态。如图1中的clk、din/d1信号波形,T0时刻为clk上升沿,对准的时d1为b数据的近似中间位置。
当clk上升沿来到之后,FF1的输出端Q得到稳定的d1状态b2需要时间,这个时间为输处延时Tco,如图1中的Q1/d2波形,Tco为图中的紫色图例。即,clk上升沿之后,经Tco后,Q1/d2稳定到b2这个状态值。
对于FF1的输出信号Q1和FF2的输出Q2来讲,由于受clk控制,状态只可能在clk的上升沿之后Tco时刻发生改变,因此,信号Q1、Q2的波形中两个状态之间隔最小为一个时钟周期Tclk。由于d1不受clk控制,因此其变化速率与Tclk无关。
也正由于d1的变化时刻与clk上升沿无关,因此在FPGA设计时,如d1的变化时刻与clk之间不满足Tsu、Th时序,就会出现亚稳态及数据采样输出不正确的现象,如果din/d1是由FPGA管脚送来的信号,由外部芯片送来,就需要通过硬件设计及FPGA输入延时set_input_delay约束来保证数据时序满足要求。同样,如FF2的Q2直接输入到FPGA管脚,这管脚又与其它芯片连接,其它芯片通过clk或采样Q2,为了使外部芯片正确采样到Q2的信号,需要通地硬件设计及FPGA输出延时set_output_delay约束来保证数据时序满足要求。
二、接着分析T0到T1时刻,即一个Tclk周期内,FF1输出Q1到FF2输入d2之间的时序关系:
在T0+Tco时刻,FF1的输出Q1由原来的状态b1稳定变化到b2状态。对于FF2的d2来讲,必须在T1时刻前Tsu,即T1-Tsu,d2就保持稳定。由于T1-T0=Tclk,因此,要使FFT2的d2满足Tsu,则需Tclk>Tco+Tsu。如果两个FF之间有组合逻辑,且组合逻辑运算时间为Tdata,则FF2满足Tsu的条件为:Tclk>Tco+Tsu+Tdata。
这与是FPGA时序电路中,时钟周期的计算公式:Tclk=Tco+Tsu+Tdata。Tco是由FPGA器件制造工艺确定的,无法更改,Tdata是组合逻辑运算时间,由程序设计的电路确定,为便于分析,Tdata除组合逻辑运算时间外,还包括FF1到FF2之间的布线传输时间。每个FPGA器件的最小Tsu是由FPGA器件制造工艺确定的,工程师设计FPGA程序时,只有当程序列生成的电路中,Tsu>Tclk-Tco-Tdata,程序才能够正确定的工作,否则就会出现Tsu不满足要求而产生数据采取错误,无法正确工作。
因此,时钟约束create_clock,就是指约束所有由clk控制的,任意两个经组合逻辑连接,或直接连接的FF之间的时间满足Tclk>Tco+Tsu+Tdata的要求。FPGA布线工具,会根据电路结构及时序要求,自动调整两个FF之间的布局布线。
对于FPGA工程师来讲,除了添加时钟约束create_clock之外,最为核心最为重要的,显然是准确控制两个相邻FF之间的组合逻辑运算延时。因为,布局布线减小的延时,相比于合理设计FF之间组合逻辑减小的延时,要困难得多。
如果,FPGA工程师能够准确把握所设计的程序中,任意两个相邻FF之间组合逻辑的运算延时(只需把握逻辑运算级联数量),则对程序所能达到的运行频率就充满信心了。
从上面的分析可知,时钟约束create_clock只会影响Tsu,即触发器的建立时间,并不会改变保持时间Th。
三、两个FF直接级联会出现什么状态?
对于图1来讲,如果没有Tdata时延时,也就是FF1的输出直接与FF2的输入连接,则根据Tclk=Tco+Tsu+Tdata的公式,此时电路的时钟频率可以更快,速度更高,Tclk=Tco+Tsu。
现在需要考察一下,如何满足D触发器的保持时间Th。
考察图1中T0时刻FF2的输入信号d2。当上升沿T0来到后,d2需要在Th内仍然保持b1稳定不变,在Tco之后,Q2才能稳定输出b1;当上升沿T1来到后,d2需要在Th内仍然保持b2稳定不变,在Tco之后,Q2才能稳定输出b2。如果FF1与FF2之间没有组合逻辑延时Tdata,则只有当Tco>Th时,D触发器才能满足保持时间要求;如果存在组合逻辑,则需当Tco+Tdata>Th时,D触发器满足保持时间要求。
由于Tco是固定的,因此组合逻辑时间Tdata越长,越容易满足保持时间Th要求,Th与时钟周期Tclk无关。
由于Tclk=Tco+Tsu+Tdata,因此Tdata越长,系统运行速度越慢。
组合逻辑Tdata降低了系统运行速度,增加了Tclk,增加了对Tsu的要求,但降低了对Th的要求。
如果没有组合逻辑Tdata,如果Tco<Th,则两个FFT直接级联就不满足Th要求,电路无法正确运行!
如果我们查阅一下芯片手册,比如XC7A100T芯片的手册,如下表所示。
可以看到,Tco>Th。所以在FPGA程序设计时,两个FF直接级联完全满足Th的时序要求。对于XC7A100T-2来讲,系统理论上的最高频率fclk=1/Tclk=1/(Tco+Tsu)=1/(0.38+0.20)ns=1724MHz。当然,这只是理论值,没有考虑布线延时,以及程序中不可或缺的组合逻辑运算延时。
当程序中出现两个FF触发器级联时(常规状态都会有)Th的理论余量为Tco-Th=0.28ns。
四、建立时间Tsu和保持时间Th在什么情况不可能不满足?
Tsu:当FF之逻辑级联运算时间过长,或时钟周期Tclk过小。最好的处理方法:采用流水线等方法减小FF之间的逻辑运算级联。
Th:一般出现在输入输出接口端,添加不合理的输入延时set_input_delay、输出延时set_output_delay时。set_input_delay和set_output_delay需要计算其它芯片与FPGA管脚之间的延时,合理设计硬件,根据设计合理调整set_input_delay和set_output_delay。
