| |
一 先说FPGA内部:
如图
先简单说明几种时间
TAB :时钟脚到reg1的延时tclk1
TAE :时钟脚到reg2的延时tclk2
TBC :reg1时钟到来后,数据的TCO(寄存器固定值,且较小)
TCD :数据延时tdelay
TDE :reg2数据的TSU(寄存器固定值,且较小)
重申下TCO,TSU,TH概念
Tsu:时钟到达前,数据和使能信号准备好的时间间隔
Th: 在(有效时钟沿能正确采样的)数据在时钟沿之后的稳定时间。
Tco:时钟有效沿到数据有效的时间间隔
(最小)时间间隔,(最小)稳定时间,(最大)时间间隔都是REG的固定参数MTsu,MTh, MTco。
简单点说,一次FPGA数据传输的循环周期:
Tclk1到达reg1,然后reg1中数据输出,经传输,到达reg2的D端.
同时Tclk2到达reg2,将D端已经等待足够长时间T2(大于等于Mtsu)的数据latch进reg2.
latch的过程需要T3(大于等于Mth)个时间。
------- T2时间为本次已经到达D2但是下个数据还未到达D2的时间(即本次数据还有效)
在这个过程中,reg2要正确接收数据必须满足:在latch edge到达reg2之前,数据已经进行到等待了不少于Tsu个时间。 FPGA中 latch edge为延后一个T到达的时钟沿
所以有如下时间关系
其中T2大于等于Mtsu
另外
下一个周期的数据到达D2前必须有reg2已经完成latch
tclk2 + T +T3 < = Tclk1 + tco +tdelay + T
所以有 tclk2 +T3 < = Tclk1 + tco +tdelay
tclk2 +MTh < = Tclk1 + tco +tdelay
一般FPGA内部约束中T2,T3就靠tdelay来改变
如图
一般路径周期
所以一般最大延时路径有:
我们通常对建立保持时间的要求,即为要满足式1和式2
在一般FPGA中没有时钟偏斜
如图
则有
T1 = Tco +Tdelay
T4 = T – (Tco +Tdelay ) >=Tsu -------------式2
看FPGA与外部器件共时钟的情况(参考其他)
这里时钟的延时,和偏斜是肯定存在的。
则按照fpga内部时序理解可以得出如下公式
Tclk1 + Tco + Tdata_PCB + Tcl + Tdataint + T2 <= Tclk2ext + Tclk2int + T
Tclk1 + Tco + Tdata_PCB + Tcl + Tdataint + Mtsu <= Tclk2ext + Tclk2int + T
IO约束中有
Tsu = Tdataint + Mtsu
所以Tsu约束
Tclk1 + Tco + Tdata_PCB + Tcl + Tdataint + Mtsu <= Tclk2ext + Tclk2int + T
Tsu = Tdataint + Mtsu - Tclk2int <= T – (Tco + Tdata_PCB + Tcl) + (Tclk2ext - Tclk1)
Th约束:
Tclk2ext + Tclk2int + T +MTh < = Tclk1 + Tco + Tdata_PCB + Tcl + Tdataint + T
Tclk2ext + Tclk2int +MTh < = Tclk1 + Tco + Tdata_PCB + Tcl + Tdataint
IO约束中有
Th = Tclk2int +MTh – Tdataint
所以
Th = Tclk2int +MTh – Tdataint <= (Tco + Tdata_PCB + Tcl )– (Tclk2ext - Tclk1)
不难看出其tsu和th的满足条件和FPGA内部的是一样的
PS 附加更正:
FPGA内部:
T2 = Tco +Tdelay – (Tclk2 – Tclk1) = Th >= Mth
T4 = T – (Tco +Tdelay ) + (Tclk2 – Tclk1) =Tsu >= MTsu -------------式2
在有Tdelay的大小确定
Tdelay >= MTh +
Tdelay <= T – (Tco) + (Tclk2 – Tclk1) - MTsu
FPGA与外部时钟共时钟情况
则按照fpga内部时序理解可以得出如下公式
Tclk1 + Tco + Tdata_PCB + Tcl + Tdataint + T2 = Tclk2ext + Tclk2int + T
Tclk1 + Tco + Tdata_PCB + Tcl + Tdataint + Mtsu <= Tclk2ext + Tclk2int + T
一般约束时候
Tsu = Tdataint + Mtsu - Tclk2int <= T – (Tco + Tdata_PCB + Tcl) + (Tclk2ext - Tclk1)
T – (Tco + Tdata_PCB + Tcl) + (Tclk2ext - Tclk1)为根据外部PCB计算出的建立时间TsuI,Tclk2int一般较固定,
所以有 (Tdataint)max = Tclk2int + TsuI – Mtsu
同理
(Tdataint)min = Tclk2int – ThI – Mth
以下为lattice中一个例子便于理解约束的意义和负值的意思。
某个设计,PCB能够提供的建立时间TsuI为3ns,保持时间ThI为1ns,FPGA寄存器建立时间要求是0.7,保持时间0.2ns,计算得到的数据路径延迟减去时钟路径延迟的差值应该要在-0.8到2.3ns之间。数据路径延迟减去时钟路径延迟为负值表示允许时钟路径的延时比数字路径的延时要大,但是不能超过0.8ns。
关于TSU,TH,TCO的在此理解
tsu: 数据先于时钟采样之沿前到达的时间,所以当时钟延迟大于数据延迟理解为Tclk – Td = tsu,(关于Tclk和Td的细节说明见前面)但是实际中,Td因为Tco和逻辑延时+非全局时钟线等原因,一般Td比Tclk大。所以以A点为参考点,T1时刻的数据到达B点时候,一般由T2(后一个周期)时刻产生的时钟沿到达B点采样。时间修改为 T + Tclk – Td = Tsu, 这里的Tsu放在外部芯片接口即为算出的约束值。
Th: 时钟采样沿之后,下个数据到达的时间。所以当时钟延迟大于数据延迟理解为
Tco:时钟有效沿到数据有效的时间间隔,所以一定要指明是那个点的时钟(参考时钟点)。
ALTER的FPGA中TCO约束的是以输入时钟端口到输出IO的TCO:Tclkdelay+ Td + MTco
Lattice中可以设置参考时钟,随路时钟输出点参考有tco = td +Mtco - Tclk