FPGA时序约束02——不同时序路径的分析方法

news2024/11/26 5:26:32

前言

前文(FPGA时序约束01——基本概念)中介绍了四种时序路径,如下图所示。

分别是触发器到触发器,触发器到输出端,输入端到触发器,输入端到输出端,其中输入端到输出端是纯组合逻辑路径,没有时钟,所谓的时序其实就是延时,故此处只分析前三种路径的时序。

注意,这些时序路径中的时钟都是同源且同频的,这是分析的前提条件。


一. 触发器到触发器

触发器到触发器,reg2reg,此路径的起点为前一个触发器的时钟端,终点为后一个触发器的输入端,如下图所示。

考虑时钟延迟的情况下,信号从REG1的D端传输到REG2的D端的路径延时如下图所示。

其中,
t c l k 1 : c l k 传播到寄存器 1 的时钟延迟 t c l k 2 : c l k 传播到寄存器 2 的时钟延迟 t c o : c l o c k    o u t p u t    d e l a y ,寄存器数据输出延迟时间 t d a t a : d a t a    d e l a y ,数据传输延迟 t s u : s t e u p    t i m e ,建立时间 t h : h o l d    t i m e ,保持时间 t_{clk1}: clk\text{传播到寄存器}1\text{的时钟延迟} \\ t_{clk2}: clk\text{传播到寄存器}2\text{的时钟延迟} \\ t_{co}: clock\,\,output\,\,delay\text{,寄存器数据输出延迟时间} \\ t_{data}: data\,\,delay\text{,数据传输延迟} \\ t_{su}: steup\,\,time\text{,建立时间} \\ t_h: hold\,\,time\text{,保持时间} tclk1:clk传播到寄存器1的时钟延迟tclk2:clk传播到寄存器2的时钟延迟tco:clockoutputdelay,寄存器数据输出延迟时间tdata:datadelay,数据传输延迟tsu:steuptime,建立时间th:holdtime,保持时间

1.1 建立分析

假设总是在时钟信号的上升沿发送数据和锁存数据,下降沿分析方法是一样的,这里以最普遍的上升沿为例,绘制时钟信号与数据信号的时序图如下图所示。

其中,
c l k : 时钟源信号 c l k 1 : R E G 1 时钟端信号,延迟 c l k 信号一定时间 c l k 2 : R E G 2 时钟端信号,延迟 c l k 信号一定时间 R E G 1. Q : R E G 1 的数据输出端,在 R E G 1 的有效时钟沿到来后,延迟 t c o 时间后输出数据 R E G 2. D : R E G 2 的数据输入端,数据至少需要领先 R E G 2 的有效时钟沿 t s u 时间,才能被正确锁存 s l a c k ( s u ) : 建立时间裕量 = 数据要求时间 d a t a    r e q u i r a l    t i m e ( s u ) − 数据到达时间 d a t a    a r r i v a l    t i m e ( s u ) clk: \text{时钟源信号} \\ clk1: REG1\text{时钟端信号,延迟}clk\text{信号一定时间} \\ clk2: REG2\text{时钟端信号,延迟}clk\text{信号一定时间} \\ REG1.Q: REG1\text{的数据输出端,在}REG1\text{的有效时钟沿到来后,延迟}t_{co}\text{时间后输出数据} \\ REG2.D: REG2\text{的数据输入端,数据至少需要领先}REG2\text{的有效时钟沿}t_{su}\text{时间,才能被正确锁存} \\ slack\left( su \right) : \text{建立时间裕量}=\text{数据要求时间}data\,\,requiral\,\,time\left( su \right) -\text{数据到达时间} data\,\,arrival\,\,time\left( su \right) clk:时钟源信号clk1:REG1时钟端信号,延迟clk信号一定时间clk2:REG2时钟端信号,延迟clk信号一定时间REG1.Q:REG1的数据输出端,在REG1的有效时钟沿到来后,延迟tco时间后输出数据REG2.D:REG2的数据输入端,数据至少需要领先REG2的有效时钟沿tsu时间,才能被正确锁存slack(su):建立时间裕量=数据要求时间datarequiraltime(su)数据到达时间dataarrivaltime(su)

d a t a    a r r i v a l    t i m e ( s u ) = L a u n c h    E d g e ( s u ) + t c l k 1 + t c o + t d a t a data\,\,arrival\,\,time\left( su \right) =Launch\,\,Edge\left( su \right) +t_{clk1}+t_{co}+t_{data} dataarrivaltime(su)=LaunchEdge(su)+tclk1+tco+tdata

d a t a    r e q u i r a l    t i m e ( s u ) = L a t c h    E d g e ( s u ) + t c l k 2 − t s u data\,\,requiral\,\,time\left( su \right) =Latch\,\,Edge\left( su \right) +t_{clk2}-t_{su} datarequiraltime(su)=LatchEdge(su)+tclk2tsu

s l a c k ( s u ) = d a t a    r e q u i r a l    t i m e ( s u ) −    d a t a    a r r i v a l    t i m e ( s u ) = L a t c h    E d g e + t c l k 2 − t s u − ( L a u n c h    E d g e + t c l k 1 + t c o + t d a t a ) = ( L a t c h    E d g e − L a u n c h    E d g e ) + ( t c l k 2 − t c l k 1 ) − ( t c o + t d a t a + t s u ) = T c l k + ( t c l k 2 − t c l k 1 ) − ( t c o + t d a t a + t s u ) slack\left( su \right) =data\,\,requiral\,\,time\left( su \right) -\,\,data\,\,arrival\,\,time\left( su \right) \\ =Latch\,\,Edge+t_{clk2}-t_{su}-\left( Launch\,\,Edge+t_{clk1}+t_{co}+t_{data} \right) \\ =\left( Latch\,\,Edge-Launch\,\,Edge \right) +\left( t_{clk2}-t_{clk1} \right) -\left( t_{co}+t_{data}+t_{su} \right) \\ =T_{clk}+\left( t_{clk2}-t_{clk1} \right) -\left( t_{co}+t_{data}+t_{su} \right) slack(su)=datarequiraltime(su)dataarrivaltime(su)=LatchEdge+tclk2tsu(LaunchEdge+tclk1+tco+tdata)=(LatchEdgeLaunchEdge)+(tclk2tclk1)(tco+tdata+tsu)=Tclk+(tclk2tclk1)(tco+tdata+tsu)

这就是建立时间裕量的计算公式了,其中,

T c l k T_{clk} Tclk是系统运行的时钟周期,可见时钟频率越高,建立时间裕量就越小,这使得系统运行的频率是有上限的。

t c l k 2 − t c l k 1 t_{clk2}-t_{clk1} tclk2tclk1是两寄存器的时钟延时差值,一般来说,在使用全局时钟资源时,此差值是很小的。FPGA软件也会自动将前后两个寄存器布局在靠近的位置。

t c o t_{co} tco t s u t_{su} tsu取决于寄存器的性能,当FPGA器件确定时,这两个参数其实就已经确定了,所以分析时,这两个参数其实是固定值

t d a t a t_{data} tdata是两寄存器的之间的组合逻辑延时(包含路径延时),组合逻辑延时是用户代码决定的,逻辑越多越复杂延时就越大,裕量就越小。所以,在编写FPGA程序时,不应在两个寄存器之间插入太复杂的组合逻辑。如果确实有逻辑变化的需求,可以考虑将组合逻辑全部或部分改为时序逻辑,相当于在这两个寄存器之间再插入了一个寄存器,这使得原本一个时钟周期能完成的工作被分到了两个时钟周期,总的信号传输延时增加了,但建立时序裕量的压力也被分担了。插入寄存器是一种很常用的解决建立时序违例的方法

显然,触发器到触发器的建立时序分析中的所有信号,对FPGA软件来说都是已知的,可能用户需要告诉软件的唯一信息是时钟频率,但一般来说,如果使用的是时钟是PLL输出的话,时钟频率软件知道的,一般的FPGA软件会为PLL输出时钟自动添加时钟约束,所以,大多数情况我们不需要执行任何操作,FPGA软件就会在布局布线时尽量去满足触发器到触发器的建立时序要求

1.2 保持分析

与建立分析同理,绘制时钟信号与数据信号的时序图如下图所示。

其中,
L a t c h    E d g e ( h ) : 旧数据读取时钟沿 L a u n c h    E d g e ( h ) : 新数据写入时钟沿,在保持分析中,新数据写入与旧数据读取是同一时钟沿 保持时间裕量 s l a c k ( h ) = 新数据到达时间 d a t a    a r r i v a l    t i m e ( h ) − 旧数据读取要求时间 d a t a    r e q u i r a l    t i m e ( h ) Latch\,\,Edge\left( h \right) : \text{旧数据读取时钟沿} \\ Launch\,\,Edge\left( h \right) : \text{新数据写入时钟沿,在保持分析中,新数据写入与旧数据读取是同一时钟沿} \\ \text{保持时间裕量}slack\left( h \right) =\text{新数据到达时间}data\,\,arrival\,\,time\left( h \right) -\text{旧数据读取要求时间}data\,\,requiral\,\,time\left( h \right) LatchEdge(h):旧数据读取时钟沿LaunchEdge(h):新数据写入时钟沿,在保持分析中,新数据写入与旧数据读取是同一时钟沿保持时间裕量slack(h)=新数据到达时间dataarrivaltime(h)旧数据读取要求时间datarequiraltime(h)

s l a c k ( h ) = d a t a    a r r i v a l    t i m e ( h ) − d a t a    r e q u i r a l    t i m e ( h ) = L a t c h    E d g e ( h ) + t c l k 1 + t c o + t d a t a − ( L a t c h    E d g e ( h ) + t c l k 2 + t h ) = ( L a t c h    E d g e ( h ) − L a u n c h    E d g e ( h ) ) − ( t c l k 2 − t c l k 1 ) + ( t c o + t d a t a − t h ) = − ( t c l k 2 − t c l k 1 ) + ( t c o + t d a t a − t h ) slack\left( h \right) =data\,\,arrival\,\,time\left( h \right) -data\,\,requiral\,\,time\left( h \right) \\ =Latch\,\,Edge\left( h \right) +t_{clk1}+t_{co}+t_{data}-\left( Latch\,\,Edge\left( h \right) +t_{clk2}+t_h \right) \\ =\left( Latch\,\,Edge\left( h \right) -Launch\,\,Edge\left( h \right) \right) -\left( t_{clk2}-t_{clk1} \right) +\left( t_{co}+t_{data}-t_h \right) \\ =-\left( t_{clk2}-t_{clk1} \right) +\left( t_{co}+t_{data}-t_h \right) slack(h)=dataarrivaltime(h)datarequiraltime(h)=LatchEdge(h)+tclk1+tco+tdata(LatchEdge(h)+tclk2+th)=(LatchEdge(h)LaunchEdge(h))(tclk2tclk1)+(tco+tdatath)=(tclk2tclk1)+(tco+tdatath)
这就是保持时间裕量的计算公式了,其中,

− ( t c l k 2 − t c l k 1 ) -\left( t_{clk2}-t_{clk1} \right) (tclk2tclk1)是两寄存器的时钟延时差值,与建立时间这部分的概念是一样的,这部分差值一般很小。

t c o t_{co} tco t h t_{h} th取决于寄存器的性能,当FPGA器件确定时,这两个参数其实就已经确定了。

t d a t a t_{data} tdata是两寄存器的之间的组合逻辑延时(包含路径延时)。

一般来说,在触发器到触发器路径中,保持时间裕量通常能满足要求。所以,此路径的重点在于满足建立时间裕量。


二. 触发器到输出端

触发器到输出端,reg2out,此路径起点为FPGA内触发器的输出端,终点是外部接收器件(如DAC)内部触发器的输入端,如下图所示。

考虑时钟延迟的情况下,信号从REG1的D端传输到REG2的D端的路径延时如下图所示。

其中, t c l k 1 t_{clk1} tclk1 t c l k 2 t_{clk2} tclk2 t c o t_{co} tco t d a t a t_{data} tdata t s u t_{su} tsu t h t_h th与上文含义一样。

又因为时钟和数据是从一个芯片传输到另一个芯片,中间还有一段是PCB走线,所以,上图的 t d a t a t_{data} tdata t c l k 2 t_{clk2} tclk2可继续细分,如下图所示。

走线可分为三段,分别是FPGA内部走线,PCB走线,DAC内部走线。

2.1 建立分析

此图时序图与reg2reg部分完全一致,因此不再单独绘制时序图。
数据到达时间 d a t a    a r r i v a l    t i m e ( s u ) = L a u n c h    E d g e ( s u ) + t c l k 1 + t c o + t d a t a = L a u n c h    E d g e ( s u ) + t c l k 1 + t c o + t d a t a ( f p g a ) + t d a t a ( p c b ) + t d a t a ( d a c ) \text{数据到达时间}data\,\,arrival\,\,time\left( su \right) =Launch\,\,Edge\left( su \right) +t_{clk1}+t_{co}+t_{data} \\ =Launch\,\,Edge\left( su \right) +t_{clk1}+t_{co}+t_{data\left( fpga \right)}+t_{data\left( pcb \right)}+t_{data\left( dac \right)} 数据到达时间dataarrivaltime(su)=LaunchEdge(su)+tclk1+tco+tdata=LaunchEdge(su)+tclk1+tco+tdata(fpga)+tdata(pcb)+tdata(dac)

数据要求时间 d a t a    r e q u i r a l    t i m e ( s u ) = L a t c h    E d g e ( s u ) + t c l k 2 − t s u ( d a c ) = L a t c h    E d g e ( s u ) + t c l k 2 ( f p g a ) + t c l k 2 ( p c b ) + t c l k 2 ( d a c ) − t s u ( d a c ) \text{数据要求时间}data\,\,requiral\,\,time\left( su \right) =Latch\,\,Edge\left( su \right) +t_{clk2}-t_{su\left( dac \right)} \\ =Latch\,\,Edge\left( su \right) +t_{clk2\left( fpga \right)}+t_{clk2\left( pcb \right)}+t_{clk2\left( dac \right)}-t_{su\left( dac \right)} 数据要求时间datarequiraltime(su)=LatchEdge(su)+tclk2tsu(dac)=LatchEdge(su)+tclk2(fpga)+tclk2(pcb)+tclk2(dac)tsu(dac)

建立时间裕量 s l a c k ( s u ) = d a t a    r e q u i r a l    t i m e ( s u ) − d a t a    a r r i v a l    t i m e ( s u ) = ( L a t c h    E d g e ( s u ) + t c l k 2 ( f p g a ) + t c l k 2 ( p c b ) + t c l k 2 ( d a c ) − t s u ( d a c ) ) − ( L a u n c h    E d g e ( s u ) + t c l k 1 + t c o + t d a t a ( f p g a ) + t d a t a ( p c b ) + t d a t a ( d a c ) ) = ( L a t c h    E d g e ( s u ) − L a u n c h    E d g e ( s u ) ) − t c l k 1 − t c o − ( t d a t a ( f p g a ) − t c l k 2 ( f p g a ) ) − ( ( t d a t a ( p c b ) − t c l k 2 ( p c b ) ) + ( t d a t a ( d a c ) − t c l k 2 ( d a c ) ) + t s u ( d a c ) ) \text{建立时间裕量}slack\left( su \right) =data\,\,requiral\,\,time\left( su \right) -data\,\,arrival\,\,time\left( su \right) \\ =\left( Latch\,\,Edge\left( su \right) +t_{clk2\left( fpga \right)}+t_{clk2\left( pcb \right)}+t_{clk2\left( dac \right)}-t_{su\left( dac \right)} \right) \\ -\left( Launch\,\,Edge\left( su \right) +t_{clk1}+t_{co}+t_{data\left( fpga \right)}+t_{data\left( pcb \right)}+t_{data\left( dac \right)} \right) \\ =\left( Latch\,\,Edge\left( su \right) -Launch\,\,Edge\left( su \right) \right) -t_{clk1}-t_{co}-\left( t_{data\left( fpga \right)}-t_{clk2\left( fpga \right)} \right) \\ -\left( \left( t_{data\left( pcb \right)}-t_{clk2\left( pcb \right)} \right) +\left( t_{data\left( dac \right)}-t_{clk2\left( dac \right)} \right) +t_{su\left( dac \right)} \right) 建立时间裕量slack(su)=datarequiraltime(su)dataarrivaltime(su)=(LatchEdge(su)+tclk2(fpga)+tclk2(pcb)+tclk2(dac)tsu(dac))(LaunchEdge(su)+tclk1+tco+tdata(fpga)+tdata(pcb)+tdata(dac))=(LatchEdge(su)LaunchEdge(su))tclk1tco(tdata(fpga)tclk2(fpga))((tdata(pcb)tclk2(pcb))+(tdata(dac)tclk2(dac))+tsu(dac))

在软件中进行时序分析时,上式中的前4项 ( L a t c h    E d g e ( s u ) − L a u n c h    E d g e ( s u ) ) \left( Latch\,\,Edge\left( su \right) -Launch\,\,Edge\left( su \right) \right) (LatchEdge(su)LaunchEdge(su)) t c l k 1 t_{clk1} tclk1 t c o t_{co} tco ( t d a t a ( f p g a ) − t c l k 2 ( f p g a ) ) \left( t_{data\left( fpga \right)}-t_{clk2\left( fpga \right)} \right) (tdata(fpga)tclk2(fpga))对软件来说都是已知的,而后三项$
\left( t_{data\left( pcb \right)}-t_{clk2\left( pcb \right)} \right) , , \left( t_{data\left( dac \right)}-t_{clk2\left( dac \right)} \right) , , t_{su\left( dac \right)} 是未知的,所以,要分析输出数据的建立时间裕量,就要把后 3 项的和告诉软件,然后 ∗ ∗ 软件需要在最恶劣的情况下保证 是未知的,所以,要分析输出数据的建立时间裕量,就要把后3项的和告诉软件,然后**软件需要在最恶劣的情况下保证 是未知的,所以,要分析输出数据的建立时间裕量,就要把后3项的和告诉软件,然后软件需要在最恶劣的情况下保证slack\left( su \right) \geqslant 0$**。

所谓的最恶劣情况,就是在前面4项已知的情况下,后3项和最大的情况,所以,此处后三项的和被称为最大输出延迟(output delay max),即
最大输出延迟 o u t p u t    d e l a y    max ⁡ = ( ( t d a t a ( p c b ) − t c l k 2 ( p c b ) ) + ( t d a t a ( d a c ) − t c l k 2 ( d a c ) ) + t s u ( d a c ) ) ( max ⁡ ) \text{最大输出延迟}output\,\,delay\,\,\max =\left( \left( t_{data\left( pcb \right)}-t_{clk2\left( pcb \right)} \right) +\left( t_{data\left( dac \right)}-t_{clk2\left( dac \right)} \right) +t_{su\left( dac \right)} \right) \left( \max \right) 最大输出延迟outputdelaymax=((tdata(pcb)tclk2(pcb))+(tdata(dac)tclk2(dac))+tsu(dac))(max)
一般板上走线都会进行等长处理,所以 t d a t a ( p c b ) t_{data\left( pcb \right)} tdata(pcb)可认为和 t c l k 2 ( p c b ) t_{clk2\left( pcb \right)} tclk2(pcb)相等,又一般芯片的 t d a t a ( d a c ) t_{data\left( dac \right)} tdata(dac) t c l k 2 ( d a c ) t_{clk2\left( dac \right)} tclk2(dac)都很小,可以忽略,所以上式可简化为:
最大输出延迟 o u t p u t    d e l a y    max ⁡ = t s u ( d a c ) ( max ⁡ ) \text{最大输出延迟}output\,\,delay\,\,\max =t_{su\left( dac \right)}\left( \max \right) 最大输出延迟outputdelaymax=tsu(dac)(max)
也就是说外部数据接收芯片的最大建立时间就是最大输出延迟在reg2out的建立分析时,需要手动输入output delay max以供软件分析

2.2 保持分析

数据到达时间 d a t a    a r r i v a l    t i m e ( h ) = L a u n c h    E d g e ( h ) + t c l k 1 + t c o + t d a t a = L a u n c h    E d g e ( h ) + t c l k 1 + t c o + t d a t a ( f p g a ) + t d a t a ( p c b ) + t d a t a ( d a c ) \text{数据到达时间}data\,\,arrival\,\,time\left( h \right) =Launch\,\,Edge\left( h \right) +t_{clk1}+t_{co}+t_{data} \\ =Launch\,\,Edge\left( h \right) +t_{clk1}+t_{co}+t_{data\left( fpga \right)}+t_{data\left( pcb \right)}+t_{data\left( dac \right)} 数据到达时间dataarrivaltime(h)=LaunchEdge(h)+tclk1+tco+tdata=LaunchEdge(h)+tclk1+tco+tdata(fpga)+tdata(pcb)+tdata(dac)

数据要求时间 d a t a    r e q u i r a l    t i m e ( h ) = L a t c h    E d g e ( h ) + t c l k 2 + t h ( d a c ) = L a t c h    E d g e ( h ) + t c l k 2 ( f p g a ) + t c l k 2 ( p c b ) + t c l k 2 ( d a c ) + t h ( d a c ) \text{数据要求时间}data\,\,requiral\,\,time\left( h \right) =Latch\,\,Edge\left( h \right) +t_{clk2}+t_{h\left( dac \right)} \\ =Latch\,\,Edge\left( h \right) +t_{clk2\left( fpga \right)}+t_{clk2\left( pcb \right)}+t_{clk2\left( dac \right)}+t_{h\left( dac \right)} 数据要求时间datarequiraltime(h)=LatchEdge(h)+tclk2+th(dac)=LatchEdge(h)+tclk2(fpga)+tclk2(pcb)+tclk2(dac)+th(dac)

保持时间裕量 s l a c k ( h ) = d a t a    a r r i v a l    t i m e ( h ) − d a t a    r e q u i r a l    t i m e ( h ) = L a u n c h    E d g e ( h ) + t c l k 1 + t c o + t d a t a ( f p g a ) + t d a t a ( p c b ) + t d a t a ( d a c ) − ( L a t c h    E d g e ( h ) + t c l k 2 ( f p g a ) + t c l k 2 ( p c b ) + t c l k 2 ( d a c ) + t h ( d a c ) ) = ( L a t c h    E d g e ( h ) − L a u n c h    E d g e ( h ) ) + t c l k 1 + t c o + ( t d a t a ( f p g a ) − t c l k 2 ( f p g a ) ) + ( ( t d a t a ( p c b ) − t c l k 2 ( p c b ) ) + ( t d a t a ( d a c ) − t c l k 2 ( d a c ) ) − t h ( d a c ) ) \text{保持时间裕量}slack\left( h \right) =data\,\,arrival\,\,time\left( h \right) -data\,\,requiral\,\,time\left( h \right) \\ =Launch\,\,Edge\left( h \right) +t_{clk1}+t_{co}+t_{data\left( fpga \right)}+t_{data\left( pcb \right)}+t_{data\left( dac \right)} \\ -\left( Latch\,\,Edge\left( h \right) +t_{clk2\left( fpga \right)}+t_{clk2\left( pcb \right)}+t_{clk2\left( dac \right)}+t_{h\left( dac \right)} \right) \\ =\left( Latch\,\,Edge\left( h \right) -Launch\,\,Edge\left( h \right) \right) +t_{clk1}+t_{co}+\left( t_{data\left( fpga \right)}-t_{clk2\left( fpga \right)} \right) \\ +\left( \left( t_{data\left( pcb \right)}-t_{clk2\left( pcb \right)} \right) +\left( t_{data\left( dac \right)}-t_{clk2\left( dac \right)} \right) -t_{h\left( dac \right)} \right) 保持时间裕量slack(h)=dataarrivaltime(h)datarequiraltime(h)=LaunchEdge(h)+tclk1+tco+tdata(fpga)+tdata(pcb)+tdata(dac)(LatchEdge(h)+tclk2(fpga)+tclk2(pcb)+tclk2(dac)+th(dac))=(LatchEdge(h)LaunchEdge(h))+tclk1+tco+(tdata(fpga)tclk2(fpga))+((tdata(pcb)tclk2(pcb))+(tdata(dac)tclk2(dac))th(dac))

与建立分析一样,前4项对软件来说是已知的,后三项未知。所以,要分析输出数据的保持时间裕量,就要把后3项的和告诉软件,然后软件需要在最恶劣的情况下保证 s l a c k ( h ) ⩾ 0 slack\left( h \right) \geqslant 0 slack(h)0。所谓的最恶劣情况,就是在前面4项已知的情况下,后3项和最小的情况,所以,此处后三项的和被称为最小输出延迟output delay min,即
最小输出延迟 o u t p u t    d e l a y    min ⁡ = ( ( t d a t a ( p c b ) − t c l k 2 ( p c b ) ) + ( t d a t a ( d a c ) − t c l k 2 ( d a c ) ) − t h ( d a c ) ) ( min ⁡ ) \text{最小输出延迟}output\,\,delay\,\,\min =\left( \left( t_{data\left( pcb \right)}-t_{clk2\left( pcb \right)} \right) +\left( t_{data\left( dac \right)}-t_{clk2\left( dac \right)} \right) -t_{h\left( dac \right)} \right) \left( \min \right) 最小输出延迟outputdelaymin=((tdata(pcb)tclk2(pcb))+(tdata(dac)tclk2(dac))th(dac))(min)
一般板上走线都会进行等长处理,所以 t d a t a ( p c b ) t_{data\left( pcb \right)} tdata(pcb)可认为和 t c l k 2 ( p c b ) t_{clk2\left( pcb \right)} tclk2(pcb)相等,又一般芯片的 t d a t a ( d a c ) t_{data\left( dac \right)} tdata(dac) t c l k 2 ( d a c ) t_{clk2\left( dac \right)} tclk2(dac)都很小,可以忽略,所以上式可简化为:
最小输出延迟 o u t p u t    d e l a y    min ⁡ = − ( t h ( d a c ) ( max ⁡ ) ) \text{最小输出延迟}output\,\,delay\,\,\min =-\left( t_{h\left( dac \right)}\left( \max \right) \right) 最小输出延迟outputdelaymin=(th(dac)(max))
也就是说外部数据接收芯片的最大保持时间的相反数就是最小输出延迟在reg2out的保持分析时,需要手动输入output delay min以供软件分析


三. 输入端到触发器

输入端到触发器,in2reg,此路径的起点为外部发送器件的时钟端,终点为FPGA内部触发器的输入端,如下图所示。

考虑时钟延迟的情况下,信号从REG1的D端传输到REG2的D端的路径延时如下图所示。

其中, t c l k 1 t_{clk1} tclk1 t c l k 2 t_{clk2} tclk2 t c o t_{co} tco t d a t a t_{data} tdata t s u t_{su} tsu t h t_h th与上文含义一样。

又因为时钟和数据是从一个芯片传输到另一个芯片,中间还有一段是PCB走线,所以,上图的 t d a t a t_{data} tdata t c l k 2 t_{clk2} tclk2可继续细分,如下图所示。

走线可分为三段,分别是FPGA内部走线,PCB走线,DAC内部走线。

3.1 建立分析

数据到达时间 d a t a    a r r i v a l    t i m e ( s u ) = L a u n c h    E d g e ( s u ) + t c l k 1 + t c o ( a d c ) + t d a t a = L a u n c h    E d g e ( s u ) + ( t c l k 1 ( f p g a ) + t c l k 1 ( p c b ) + t c l k 1 ( a d c ) ) + t c o ( a d c ) + ( t d a t a ( a d c ) + t d a t a ( p c b ) + t d a t a ( f p g a ) ) \text{数据到达时间}data\,\,arrival\,\,time\left( su \right) =Launch\,\,Edge\left( su \right) +t_{clk1}+t_{co\left( adc \right)}+t_{data} \\ =Launch\,\,Edge\left( su \right) +\left( t_{clk1\left( fpga \right)}+t_{clk1\left( pcb \right)}+t_{clk1\left( adc \right)} \right) +t_{co\left( adc \right)}+\left( t_{data\left( adc \right)}+t_{data\left( pcb \right)}+t_{data\left( fpga \right)} \right) 数据到达时间dataarrivaltime(su)=LaunchEdge(su)+tclk1+tco(adc)+tdata=LaunchEdge(su)+(tclk1(fpga)+tclk1(pcb)+tclk1(adc))+tco(adc)+(tdata(adc)+tdata(pcb)+tdata(fpga))

数据要求时间 d a t a    r e q u i r a l    t i m e ( s u ) = L a t c h    E d g e ( s u ) + t c l k 2 − t s u \text{数据要求时间}data\,\,requiral\,\,time\left( su \right) =Latch\,\,Edge\left( su \right) +t_{clk2}-t_{su} 数据要求时间datarequiraltime(su)=LatchEdge(su)+tclk2tsu

建立时间裕量 s l a c k ( s u ) = d a t a    r e q u i r a l    t i m e ( s u ) − d a t a    a r r i v a l    t i m e ( s u ) = ( L a t c h    E d g e ( s u ) + t c l k 2 − t s u ) − ( L a u n c h    E d g e ( s u ) + ( t c l k 1 ( f p g a ) + t c l k 1 ( p c b ) + t c l k 1 ( a d c ) ) + t c o ( a d c ) + ( t d a t a ( a d c ) + t d a t a ( p c b ) + t d a t a ( f p g a ) ) ) = ( L a t c h    E d g e ( s u ) − L a u n c h    E d g e ( s u ) ) + ( t c l k 2 − t c l k 1 ( f p g a ) ) − t s u − t d a t a ( f p g a ) − ( t c l k 1 ( p c b ) + t d a t a ( p c b ) + t c l k 1 ( a d c ) + t c o ( a d c ) + t d a t a ( a d c ) ) \text{建立时间裕量}slack\left( su \right) =data\,\,requiral\,\,time\left( su \right) -data\,\,arrival\,\,time\left( su \right) \\ =\left( Latch\,\,Edge\left( su \right) +t_{clk2}-t_{su} \right) \\ -\left( Launch\,\,Edge\left( su \right) +\left( t_{clk1\left( fpga \right)}+t_{clk1\left( pcb \right)}+t_{clk1\left( adc \right)} \right) +t_{co\left( adc \right)}+\left( t_{data\left( adc \right)}+t_{data\left( pcb \right)}+t_{data\left( fpga \right)} \right) \right) \\ =\left( Latch\,\,Edge\left( su \right) -Launch\,\,Edge\left( su \right) \right) +\left( t_{clk2}-t_{clk1\left( fpga \right)} \right) -t_{su}-t_{data\left( fpga \right)} \\ -\left( t_{clk1\left( pcb \right)}+t_{data\left( pcb \right)}+t_{clk1\left( adc \right)}+t_{co\left( adc \right)}+t_{data\left( adc \right)} \right) 建立时间裕量slack(su)=datarequiraltime(su)dataarrivaltime(su)=(LatchEdge(su)+tclk2tsu)(LaunchEdge(su)+(tclk1(fpga)+tclk1(pcb)+tclk1(adc))+tco(adc)+(tdata(adc)+tdata(pcb)+tdata(fpga)))=(LatchEdge(su)LaunchEdge(su))+(tclk2tclk1(fpga))tsutdata(fpga)(tclk1(pcb)+tdata(pcb)+tclk1(adc)+tco(adc)+tdata(adc))

分析同1.1与2.1,前四项已知,后三项的最大值为最恶劣情况,所以,此处后三项的和被称为最大输入延迟input delay max,即
最大输入延迟 i n p u t    d e l a y    max ⁡ = ( ( t c l k 1 ( p c b ) + t d a t a ( p c b ) ) + ( t c l k 1 ( a d c ) + t c o ( a d c ) + t d a t a ( a d c ) ) ) ( max ⁡ ) \text{最大输入延迟}input\,\,delay\,\,\max =\left( \left( t_{clk1\left( pcb \right)}+t_{data\left( pcb \right)} \right) +\left( t_{clk1\left( adc \right)}+t_{co\left( adc \right)}+t_{data\left( adc \right)} \right) \right) \left( \max \right) 最大输入延迟inputdelaymax=((tclk1(pcb)+tdata(pcb))+(tclk1(adc)+tco(adc)+tdata(adc)))(max)
可见最大输入延迟由两部分构成:

  1. pcb上时钟走线延时与数据走线延时的和
  2. adc芯片引脚接收到时钟边沿后到数据从引脚输出的延时

在in2out的建立分析时,需要手动输入input delay max以供软件分析

3.2 保持分析

数据到达时间 d a t a    a r r i v a l    t i m e ( h ) = L a u n c h    E d g e ( h ) + t c l k 1 + t c o ( a d c ) + t d a t a = L a u n c h    E d g e ( h ) + ( t c l k 1 ( f p g a ) + t c l k 1 ( p c b ) + t c l k 1 ( a d c ) ) + t c o ( a d c ) + ( t d a t a ( a d c ) + t d a t a ( p c b ) + t d a t a ( f p g a ) ) \text{数据到达时间}data\,\,arrival\,\,time\left( h \right) =Launch\,\,Edge\left( h \right) +t_{clk1}+t_{co\left( adc \right)}+t_{data} \\ =Launch\,\,Edge\left( h \right) +\left( t_{clk1\left( fpga \right)}+t_{clk1\left( pcb \right)}+t_{clk1\left( adc \right)} \right) +t_{co\left( adc \right)}+\left( t_{data\left( adc \right)}+t_{data\left( pcb \right)}+t_{data\left( fpga \right)} \right) 数据到达时间dataarrivaltime(h)=LaunchEdge(h)+tclk1+tco(adc)+tdata=LaunchEdge(h)+(tclk1(fpga)+tclk1(pcb)+tclk1(adc))+tco(adc)+(tdata(adc)+tdata(pcb)+tdata(fpga))

数据要求时间 d a t a    r e q u i r a l    t i m e ( h ) = L a t c h    E d g e ( h ) + t c l k 2 − t s u \text{数据要求时间}data\,\,requiral\,\,time\left( h \right) =Latch\,\,Edge\left( h \right) +t_{clk2}-t_{su} 数据要求时间datarequiraltime(h)=LatchEdge(h)+tclk2tsu

保持时间裕量 s l a c k ( h ) = d a t a    a r r i v a l    t i m e ( h ) − d a t a    r e q u i r a l    t i m e ( h ) = ( L a u n c h    E d g e ( h ) + ( t c l k 1 ( f p g a ) + t c l k 1 ( p c b ) + t c l k 1 ( a d c ) ) + t c o ( a d c ) + ( t d a t a ( a d c ) + t d a t a ( p c b ) + t d a t a ( f p g a ) ) ) − ( L a t c h    E d g e ( h ) + t c l k 2 − t s u ) = − ( L a t c h    E d g e ( h ) − L a u n c h    E d g e ( h ) ) − ( t c l k 2 − t c l k 1 ( f p g a ) ) + t s u + t d a t a ( f p g a ) + ( t c l k 1 ( p c b ) + t d a t a ( p c b ) + t c l k 1 ( a d c ) + t c o ( a d c ) + t d a t a ( a d c ) ) \text{保持时间裕量}slack\left( h \right) =data\,\,arrival\,\,time\left( h \right) -data\,\,requiral\,\,time\left( h \right) \\ =\left( Launch\,\,Edge\left( h \right) +\left( t_{clk1\left( fpga \right)}+t_{clk1\left( pcb \right)}+t_{clk1\left( adc \right)} \right) +t_{co\left( adc \right)}+\left( t_{data\left( adc \right)}+t_{data\left( pcb \right)}+t_{data\left( fpga \right)} \right) \right) \\ -\left( Latch\,\,Edge\left( h \right) +t_{clk2}-t_{su} \right) \\ =-\left( Latch\,\,Edge\left( h \right) -Launch\,\,Edge\left( h \right) \right) -\left( t_{clk2}-t_{clk1\left( fpga \right)} \right) +t_{su}+t_{data\left( fpga \right)} \\ +\left( t_{clk1\left( pcb \right)}+t_{data\left( pcb \right)}+t_{clk1\left( adc \right)}+t_{co\left( adc \right)}+t_{data\left( adc \right)} \right) 保持时间裕量slack(h)=dataarrivaltime(h)datarequiraltime(h)=(LaunchEdge(h)+(tclk1(fpga)+tclk1(pcb)+tclk1(adc))+tco(adc)+(tdata(adc)+tdata(pcb)+tdata(fpga)))(LatchEdge(h)+tclk2tsu)=(LatchEdge(h)LaunchEdge(h))(tclk2tclk1(fpga))+tsu+tdata(fpga)+(tclk1(pcb)+tdata(pcb)+tclk1(adc)+tco(adc)+tdata(adc))

分析同1.2与2.2,前四项已知,后三项的最小值为最恶劣情况,所以,此处后三项的和被称为最小输入延迟input delay max,即
最小输入延迟 i n p u t    d e l a y    min ⁡ = ( ( t c l k 1 ( p c b ) + t d a t a ( p c b ) ) + ( t c l k 1 ( a d c ) + t c o ( a d c ) + t d a t a ( a d c ) ) ) ( min ⁡ ) \text{最小输入延迟}input\,\,delay\,\,\min =\left( \left( t_{clk1\left( pcb \right)}+t_{data\left( pcb \right)} \right) +\left( t_{clk1\left( adc \right)}+t_{co\left( adc \right)}+t_{data\left( adc \right)} \right) \right) \left( \min \right) 最小输入延迟inputdelaymin=((tclk1(pcb)+tdata(pcb))+(tclk1(adc)+tco(adc)+tdata(adc)))(min)
可见最大输入延迟与最小输入延迟的公式是一样的,PCB延迟是固定的,所以两种延迟的区别是:ADC芯片的内部时钟延迟与数据输出延迟是变化的,有最大值和最小值,就分别对应了最大/最小输入延迟


四. 总结

通过以上分析可以看出,不同时序路径的分析方法大同小异,都是基于reg2reg,然后引入FPGA内部路径,PCB路径与外部器件路径来计算数据到达时间与数据要求时间,最后两者相减就对应了建立时间裕量与保持时间裕量。

本文介绍了最大/最小输出延迟,最大/最小输入延迟这四个新概念,它们都对应FPGA时序分析软件中的一项分析,且这些值对软件是未知的,需要手动输入。


五. 参考

小梅哥FPGA时序分析和约束实例演练课程_哔哩哔哩_bilibili


徐晓康的博客持续分享高质量硬件、FPGA与嵌入式知识,软件,工具等内容,欢迎大家关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4359.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

外包做的系统宕机了,逼得我重新设计一套MySQL数据库架构!

V-xin:ruyuanhadeng获得600页原创精品文章汇总PDF 目录 一般业务系统运行流程图一台 4 核 8G 的机器能扛多少并发量呢?高并发来袭时数据库会先被打死吗?8 核 16G 的数据库每秒大概可以抗多少并发压力?数据库架构可以从哪些方面优…

[Android移动安全渗透基础教程] 如何为Android Studio 模拟器(AVD)设置Frida?

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 0x01 如何为Android Studio 模拟器(AVD)设置Frid…

全志V853 NPU 系统介绍

NPU 系统介绍 V853 芯片内置一颗 NPU,其处理性能为最大 1 TOPS 并有 128KB 内部高速缓存用于高速数据交换,支持 OpenCL、OpenVX、android NN 与 ONNX 的 API 调用,同时也支持导入大量常用的深度学习模型。 NPU 系统架构 NPU 的系统架构如下…

猿创征文| 六款我的开发者宝藏工具箱

目录 No.1 | 亿图图示 简介: 推荐之处: 下载途径: Show time: No.2 | 飞书 简介: 推荐之处: 下载途径: Show time: No.3 | 迅捷PDF转换器 简介: 推荐之处: …

Allegro SigXplorer 等长设置方法-比较简单

使用方法示一: 1、如图SDRAM的连线U2到U5、U6和U7的地址线均需要设置等长,常规我们对每个网络设置pin pair,会比较繁琐,设过的人都知道。 使用方法二: 2、开始设置,打开规则管理器,在电气规则…

HTML爱心代码 | 一起体验理工男的极致浪漫(电视剧男主同款)

写在前面 大家好,我是陈橘又青,今天中午刷微博,看到最近《点燃我温暖你》中男主角——理工男李峋的爱心代码撩到了无数人,于是把代码开源分享给大家。 文章目录写在前面运行示例完整代码保姆级运行教学添加背景图片修改爱心颜色运…

软件工程毕业设计课题(17)基于python的毕业设计python鲜花水果商城系统毕设作品源码

项目背景和意义 目的:伴随着互联网技术的不断发展和完善,在人们的生活和工作的各个方面,互联网都有着非常重大的影响。伴随着国内电子商务行业的迅猛发展,消费者现在能够轻松的实现足不出户的,仅仅通过网络购物平台就可…

这些包括我在内都有的Python编程陋习,趁早改掉

B站|公众号:啥都会一点的研究生 相关阅读 整理了几个100%会踩的Python细节坑,提前防止脑血栓 整理了十个100%提高效率的Python编程技巧,更上一层楼 Python-列表,从基础到进阶用法大总结,进来查漏补缺 Python-元组&…

pytest参数化详解

文章目录一.概念二.单个参数三.多个参数案例1案例2:使用py文件存放测试数据案例3:使用yaml文件存放测试数据案例4:使用json文件存放测试数据四.对测试类参数化案例1一.概念 参数化,就是把测试过程中的数据提取出来,通过参数传递不同的数据来驱动用例运行…

健身房信息管理系统(PHP+Html+MySQL)

3.需求分析 3.1 健身房管理系统功能需求 健身房管理信息系统,提供动作教学,健身基本动作可视化,健身知识层次化,一个完整的健身房管理系统,为健身爱好者对健身知识的了解和健身动作的了解提供了便利,系统应…

网络协议:透彻解析HTTPS协议

本篇内容包括:HTTPS 协议概述,SSL 与 TLS(SSL 与 TLS 概述、SSL证书 和 SSL 与 TLS 二者之间关系),以及 HTTPS 下浏览器访问一个网站的全过程的内容! 文章目录一、HTTPS 协议概述二、SSL 与 TLS1、SSL 与 T…

两种让python输出更加美观的方式,三分钟看完就会

嗨害大家好鸭!我是小熊猫❤ 最近要给大家持续带来干货输出啦! 赶紧收藏起来,以后查漏补缺要用到的喔~ 源码、资料电子书点击这里 1.输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数。 (第三种方式是使用文件对象的 write…

Web前端开发技术课程大作业——南京旅游景点介绍网页代码html+css+javascript

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有…

二选一工作器引入的Verilog语法

二选一工作器引入的Verilog语法 ——XILINX 基于BASYS 3板 状态机、线性序列机、学习仿真 DDS:矩阵键盘、DAC,LCD/数码管,这些模块间的接口逻辑 常见的接口设计:SPI、IIC、UART 学习:三八译码器、计数器电灯、学习开发工具的使用…

年轻人不用太过于努力

周末和一个毕业一年多的朋友聊天,我随口问了一句「你有什么想跟我分享的」,然后他就说了上面的那句话。「年轻人不用太过于努力」和读者聊天会做成我的一个公众号专栏,内容有也会越来越丰富,全部的内容都会收录到我的程序人生专栏…

RK3568平台开发系列讲解(音频篇)Audio 音量控制流程

🚀返回专栏总目录 文章目录 一、安卓音量控制流程简介二、什么是AudioService沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要介绍安卓音量控制流程。 一、安卓音量控制流程简介 Android音频系统,分为数据流和策略两部分。 数据流描述了音频数据从数据源…

【C++哈希表】哈希碰撞,线性探测,二次探测 ,荷载因子,闭散列的实现及string需要特化

目录 1.哈希概念 2.哈希碰撞 3.解决哈希冲突 4.哈希表闭散列实现 框架: 4.3插入 1.哈希概念 线性表以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。线性表查找…

首届数据安全大赛初赛web

文章目录easy_nodeeasy_webeasy_phar刮刮乐my_cloudeasy_node 访问src得到源码 第一步需要伪造admin用户 可以看到都是通过jwt进行加密解密 很容易想到jwt的几种攻击方式,可以参考下文章https://blog.csdn.net/miuzzx/article/details/111936737 首先试下改为n…

Linux篇【4】:Git,Gitee,GitHub

在 Linux 系统中,如何将普通源文件和普通头文件上传到 Gitee ? Git 是一个分布式的版本控制器,目前可以理解成百度云盘,其次,在 Linux 系统中,Git 也是一个软件/工具/指令,在 Windows 系统中&a…

212 - 218. MySQL索引的基本用法

1.索引的简介 1.1 索引的概念 是数据库对象,实现数据库快速查询 1.2 为什么使用索引 实现数据库快速查询,提高查询速度 1.3 索引的分类 a.普通索引 最基本的索引,对字段数据的类型和值没有任何限制,数据类型可以任意,…