时序设计是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. 建立时间 \TsuSetup Time定义时钟有效沿到来之前输入 D 信号必须稳定不变的最小时间。本质触发器内部采样通路需要足够时间完成电平采样、内部节点充放电若 D 变化距离时钟沿不足Tsu内部锁存器无法正确捕获电平出现亚稳态。器件特性FPGA 芯片手册给定固定最小值如 Xilinx 7 系列DFF(触发器)的Tsu在0.2ns~0.5ns 之间。2. 保持时间 \ThHold Time定义时钟有效沿到来之后输入 D 信号必须继续保持稳定不变的最小时间。本质时钟沿到来后内部传输门切换需要时间此时 D 若立刻跳变会冲掉刚采样的数据。关键特点与时钟周期无关仅由器件内部电路决定高速设计更容易出现保持违例。3. 输出延迟 \TcoClock-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之间的时序关系在T0Tco时刻FF1的输出Q1由原来的状态b1稳定变化到b2状态。对于FF2的d2来讲必须在T1时刻前Tsu即T1-Tsud2就保持稳定。由于T1-T0Tclk因此要使FFT2的d2满足Tsu则需TclkTcoTsu。如果两个FF之间有组合逻辑且组合逻辑运算时间为Tdata则FF2满足Tsu的条件为TclkTcoTsuTdata。这与是FPGA时序电路中时钟周期的计算公式TclkTcoTsuTdata。Tco是由FPGA器件制造工艺确定的无法更改Tdata是组合逻辑运算时间由程序设计的电路确定为便于分析Tdata除组合逻辑运算时间外还包括FF1到FF2之间的布线传输时间。每个FPGA器件的最小Tsu是由FPGA器件制造工艺确定的工程师设计FPGA程序时只有当程序列生成的电路中TsuTclk-Tco-Tdata程序才能够正确定的工作否则就会出现Tsu不满足要求而产生数据采取错误无法正确工作。因此时钟约束create_clock就是指约束所有由clk控制的任意两个经组合逻辑连接或直接连接的FF之间的时间满足TclkTcoTsuTdata的要求。FPGA布线工具会根据电路结构及时序要求自动调整两个FF之间的布局布线。对于FPGA工程师来讲除了添加时钟约束create_clock之外最为核心最为重要的显然是准确控制两个相邻FF之间的组合逻辑运算延时。因为布局布线减小的延时相比于合理设计FF之间组合逻辑减小的延时要困难得多。如果FPGA工程师能够准确把握所设计的程序中任意两个相邻FF之间组合逻辑的运算延时只需把握逻辑运算级联数量则对程序所能达到的运行频率就充满信心了。从上面的分析可知时钟约束create_clock只会影响Tsu即触发器的建立时间并不会改变保持时间Th。三、两个FF直接级联会出现什么状态对于图1来讲如果没有Tdata时延时也就是FF1的输出直接与FF2的输入连接则根据TclkTcoTsuTdata的公式此时电路的时钟频率可以更快速度更高TclkTcoTsu。现在需要考察一下如何满足D触发器的保持时间Th。考察图1中T0时刻FF2的输入信号d2。当上升沿T0来到后d2需要在Th内仍然保持b1稳定不变在Tco之后Q2才能稳定输出b1当上升沿T1来到后d2需要在Th内仍然保持b2稳定不变在Tco之后Q2才能稳定输出b2。如果FF1与FF2之间没有组合逻辑延时Tdata则只有当TcoTh时D触发器才能满足保持时间要求如果存在组合逻辑则需当TcoTdataTh时D触发器满足保持时间要求。由于Tco是固定的因此组合逻辑时间Tdata越长越容易满足保持时间Th要求Th与时钟周期Tclk无关。由于TclkTcoTsuTdata因此Tdata越长系统运行速度越慢。组合逻辑Tdata降低了系统运行速度增加了Tclk增加了对Tsu的要求但降低了对Th的要求。如果没有组合逻辑Tdata如果TcoTh则两个FFT直接级联就不满足Th要求电路无法正确运行如果我们查阅一下芯片手册比如XC7A100T芯片的手册如下表所示。可以看到TcoTh。所以在FPGA程序设计时两个FF直接级联完全满足Th的时序要求。对于XC7A100T-2来讲系统理论上的最高频率fclk1/Tclk1/(TcoTsu)1/(0.380.20)ns1724MHz。当然这只是理论值没有考虑布线延时以及程序中不可或缺的组合逻辑运算延时。当程序中出现两个FF触发器级联时常规状态都会有Th的理论余量为Tco-Th0.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。