共同时钟向源同步时钟的演变及时序分析
[i=s] 本帖最后由 袁荣盛 于 2009-8-19 00:05 编辑 [/i][b][color=Blue]最近写的一篇文档,与大家共勉
水平有限,失误在所难免
望不吝指教[/color][/b]
关于高速信号的时序分析,主要针对两种最常见的同步时序系统:共同时钟同步系统与源同步系统。
[b][size=5]共同时钟同步原理及时序分析[/size][/b]
所谓共同时钟,就是在数据传输过程中,驱动端和接受端共享一个时钟,而这个时钟是由外部的一个器件提供,并且是同一个缓冲器输出的同相位时钟信号。如图1所示:
[attach]576[/attach]
图1:共同时钟拓扑结构
OSC提供时钟输入,CLK_BUFFER则分兵分两路把时钟信号分别输出为CLK_A和CLK_B到驱动端和接收端,暂时不考虑时钟A和B在Buffer内部的Skew与在PCB板上由于走线长度不统一(当然也包括时钟信号接收端的负载不同)所造成的总的Skew,即我们认为时钟A和B在理想状态下同时到达了TRANS和RECEIVE。当CLK_B到达TRANS后,在第一个时钟的上升沿,TRANS会将数据Dt锁存到Qt等待输出,直到Qt输出电平达到有效参考电平Vmeas(通常是高电平的一半左右),这段时间我们就称之为驱动端数据信号的Tco。
Qt输出数据信号,通过总线传输到RECEIVE的Dr,在CLK_A的第二个时钟上升沿到来之前把数据送至芯片组内部。不难看出,如果要使得系统正常工作,必须在一个时钟周期内让数据信号从驱动端发送到接收端,即理论上图1中的Qt到Dr的斜线通道的传输延时要小于一个时钟周期。如果传输延时大于一个时钟周期,则接收端的第二个CLK信号的上升沿到来时,正确的数据还在传输过程中,就会导致由于数据信号建立时间不足而导致错误的发生。这就是接收端的数据对建立时间的要求。
上述分析得出结果就是数据信号要提前CLK_A的第二个上升沿到来,那么要提前多少呢?这就要满足接收端的setup time。这就要求传输线尽可能地短,但是太短的传输线又带来另一个问题,就是如果数据信号提前CLK_A的第二个上升沿太多的时间,那么时钟的上升沿对数据信号进行锁存的时候,数据信号没有足够的hold on time来保证被正确地采样,同样也会导致数据出错。
综上所述,共同时钟的时序要求就是:数据信号传输线不能太长或者太重,太长导致数据来得太慢,接收端没有足够的数据建立时间;当然数据信号传输线也不能太短,太短导致数据信号提前接收端时钟的第二个上升沿太多,没有足够的数据保持时间。这就是共同时钟的一个最重要的时序要求。
在实际的计算中,我们还会考虑到CLK_BUFFER内部的时钟固定偏斜,即CLK_A和CLK_B的Tco之间的差值,时钟抖动Jitter,还需要控制时钟信号A和B在PCB板上的传输延时要尽可能相等,要对他们做等长,并且走线要一致。
Tcycle:时钟的周期
Tco_clkb:时钟B在CLK_BUFFER内部从CLK_IN开始到CLK_B输出有效延时
Tflt_clkb:时钟B在PCB板上的飞行时间,即从CLK_BUFFER输出有效电平到TRANS接收到的CLK信号达到有效电平
Tco_data:TRANS中数据从CLK_B输入TRANS开始到寄存器输出数据到达有效电平的延时
Tflt_data:数据信号在PCB板上的飞行时间,从TRANS输出有效电平开始到RECEIVE接收到数据信号的延时
Tco_clka: 时钟A在CLK_BUFFER内部从CLK_IN开始到CLK_A输出有效延时
Tflt_clka:时钟A在PCB板上的飞行时间,即从CLK_BUFFER输出有效电平到RECEIVE接收到的CLK信号达到有效电平
Jitter:接收端RECEIVE的时钟抖动
Tsetup:数据的建立时间
Tsetup margin:建立时间裕量
Thold:数据的保持时间
Thold margin:保持时间裕量
[attach]577[/attach]
图2:共同时钟数据建立时序分析
第一个输入时钟开始到数据接收的总延时为
Tdata_delay:Tco_clkb+Tflt_clkb+Tco_data+Tflt_data
接收时钟CLK_A下一个时钟周期的总的延时为
Tclk_delay:Tcycle+Tco_clka+Tflt_clka
再加上建立时间、建立裕量与抖动的时间可以得出如下计算公式
Tdata_delay+Tsetup+Tsetup margin+Tjitter=Tclk_delay
因为要保证Tsetup margin>0
所以得出:
Tclk_delay-(Tdata_delay+Tsetup+Tjitter)>0
代入Tdata_delay和Tclk_delay的关系式
Tcycle+Tco_clka+Tflt_clka-(Tco_clkb+Tflt_clkb+Tco_data+Tflt_data+Tsetup+Tjitter)>0
为了保证最恶劣的结果都能满足条件,我们把上式中前面的两个参数Tco_clka和Tflt_clka取最小值,把式中括号内的参数Tco_clkb、Tflt_clkb、Tco_data、Tflt_data都取最大值,Jitter取正值。得到如下的关系式:
Tcycle+Tco_clka_min+Tflt_clka_min-(Tco_clkb_max+Tflt_clkb_max+Tco_data_max+Tflt_data_max+Tsetup+Tjitter)>0
化简得到:
Tcycle+[Tco_clka_min+Tflt_clka_min-(Tco_clkb_max+Tflt_clkb_max)]-(Tco_data_max+Tflt_data_max+Tsetup+Tjitter)>0
而上式中的Tco_clka_min+Tflt_clka_min-(Tco_clkb_max+Tflt_clkb_max)=Tskew,即为CLK_A和CLK_B的总偏斜。总偏斜分为器件内部固定偏斜与PCB走线造成的偏斜两部分。
器件内部的固定偏斜为Tco_clka_min-Tco_clkb_max,这个参数是固定的
PCB走线造成的偏斜为Tflt_clka_min-Tflt_clkb_max,这个参数是可调的,单从建立时间来说,我们希望这个值越大越好。
上式中的后面的参数还有一个参数Tflt_data_max是可调的,但从建立时间来说,我们希望这个值越小越好,即Data的走线越短越好,接收端的负载越轻越好。
下面再来分析一下保持时间的时序要求
[attach]578[/attach]
图3:共同时钟数据保持时序分析
同样,得出两组方程式
CLK_A的延时为:
Tclka_delay=Tco_clka+Tflt_clka 注意这里的方程式与建立时间的不同,少了一个Tcycle,因为在数据接收端的参考时钟是第二个上升沿
数据延时为:
Tdata_delay:Tco_clkb+Tflt_clkb+Tco_data+Tflt_data
保持时间、保持时间裕量、抖动的关系式为:
Tdata_delay=Tclka_delay+Thold+Thold margin+Tjitter
同样要保证Thold margin>0
所以得出如下的关系式:
Tdata_delay-(Tclka_delay+Thold+Tjitter)>0
代入上述方程得到:
Tco_clkb+Tflt_clkb+Tco_data+Tflt_data-(Tco_clka+Tflt_clka+Thold+Tjitter)>0
为了满足最坏的条件,上式中前面的参数Tco_clkb、Tflt_clkb、Tco_data、Tflt_data全部取最小值,而后面的参数Tco_clka和Tflt_clka要取最大值,得到如下的关系:
Tco_clkb_min+Tflt_clkb_min+Tco_data_min+Tflt_data_min-(Tco_clka_max+Tflt_clka_max+Thold+Tjitter)>0
化简得到:
Tco_clkb_min+Tflt_clkb_min-(Tco_clka_max+Tflt_clka_max)+Tco_data_min+Tflt_data_min-(Thold+Tjitter)>0
上式中Tco_clkb_min-Tco_clka_max为CLK_BUFFER内部的时钟偏斜,是固定的。
Tflt_clkb_min-Tflt_clka_max是PCB板上布线所产生的时钟偏斜,我们希望这个结果越大越好
同时希望Tflt_data_min越大越好,负载越重越好。与建立时序分析时正好相反。
综合建立时序与保持时序,得出如下两组关系式:
Tcycle+[Tco_clka_min+Tflt_clka_min-(Tco_clkb_max+Tflt_clkb_max)]-(Tco_data_max+Tflt_data_max+Tsetup+Tjitter)>0
Tco_clkb_min+Tflt_clkb_min-(Tco_clka_max+Tflt_clka_max)+Tco_data_min+Tflt_data_min-(Thold+Tjitter)>0
其中有几个数据是可调的,即(Tflt_clka_min-Tflt_clkb_max)、(Tflt_clkb_min-Tflt_clka_max)、Tflt_data_max、Tflt_data_min,如果保证时钟走线延时相等,则(Tflt_clka_min-Tflt_clkb_max)=0、(Tflt_clkb_min-Tflt_clka_max)=0,要使得上述两组不等式同时成立,必须保证Tflt_data值在一定的区间内。若这种情况下方程式无解,则必须要考虑调整CLK_A和CLK_B的飞行时间。
[b][size=5]共同时钟向源同步时钟的演变及时序分析[/size][/b]
接下来对共同时钟做进一步的改进,从正常的共同时钟系统来看,我们希望CLK_BUFFER出来的两根CLK信号到驱动端和接收端的飞行时间尽可能相等,因为这样有助于我们进行时序计算,从而进行走线约束。但是发现,当数据信号长度被约束在一个时钟周期的延时里,如果数据信号的走线一定,要想提高系统时钟的频率,那么势必降低了系统的时钟裕量,从而要求数据信号走线延时降低。当达到一定的条件时候,再上升系统时钟频率,建立时序与保持时序的不等式的结果将是无解。那么出现这种情况怎么办呢?上述分析也提到了,要考虑调整CLK_A和CLK_B的飞行时间,来满足裕量。
从建立裕量不等式来看,我们希望(Tflt_clka_min-Tflt_clkb_max)值越大越容易满足要求,而从保持时序不等式来看,又希望(Tflt_clkb_min-Tflt_clka_max)值越大越好。这是一对矛盾的表达式,那么我们是否有其他的方法来同时满足接收端得建立时序要求和保持时序的要求?我们可以暂时控制其中一个表达式,让其最大化满足建立时序和保持时序其中一个要求,然后再想办法满足另一个时序。取Tflt_clkb为0,这时,建立裕量可以最大化满足,而保持裕量却被最大化消减了,甚至保持裕量会出现负值。
[attach]579[/attach]
图4:共同时钟拓扑结构-源同步时钟拓扑
为了说明源同步时钟是由共同时钟系统演化而来,我们把CLK_BUFFER植入驱动端内部,那样就变成了系统时钟,我们可以不考虑系统时钟的输入,当然图4中的CLK_B将不复存在,而CLK_A变成了驱动端和接收端的内部时钟,这样的系统称之为内时钟系统。我们暂时不考虑内部的时钟偏斜,在驱动端,时钟分成两路,一路触发驱动端的数据信号,而另一路则先经过PLL,再传输到接收端。为什么这里采用PLL呢?理论上,只要我们调整数据信号走线和时钟信号走线也能满足时序要求,但是很明显,使用PLL进行时序控制使得时序裕量更加准确,且调试方便。
[attach]580[/attach]
图5:内时钟拓扑
为了简便分析,不考虑时钟抖动Jitter,这种情况下,时钟Buffer被当作是系统时钟,Tco_clk就不存在了,Tflt_clkb为0后的建立时序裕量不等式为:
Tdelay+Tclk_flt-Tco_data-Tdata_flt-Tsetup>0
Tdelay:驱动端时钟输出延后系统时钟的时间
Tclk_flt:时钟的飞行时间
Tco_data:驱动端时钟开始到数据输出有效的时间
Tdata_flt:数据信号的飞行时间
Tsetup:接收端数据信号的建立时间
[attach]581[/attach]
图6:内时钟建立时序图
接下来再来分析一下接收端的保持时序裕量,不等式中Tcycle为系统时钟CLK周期
Tcycle+Tco_data+Tdata_flt-Tdelay-Tclk_flt-Thold>0
[attach]582[/attach]
图7:内时钟保持时序图
综上两个不等式可以得出约束
Tdelay+Tclk_flt-Tco_data-Tdata_flt-Tsetup>0
Tcycle+Tco_data+Tdata_flt-Tdelay-Tclk_flt-Thold>0
如果Tdelay等于一个时钟周期,则上述不等式可化简为:
Tcycle+Tclk_flt-Tco_data-Tdata_flt-Tsetup>0 (1)
Tco_data+Tdata_flt-Tclk_flt-Thold>0 (2)
我们都知道源同步系统不关系数据信号的Tco,即上述不等式中的Tco_data,那么我们令下图中,驱动端数据在驱动端时钟发出前有效的时间为Tvb,之后有效的时间为Tva。
[attach]583[/attach]
图8:输出时钟与输出数据关系
根据图6:内时钟建立时序图可以求出
Tvb=Tdelay-Tco_data
=>Tco_data=Tdelay-Tvb=Tcycle-Tvb
带入上述(1)式中
Tcycle+Tclk_flt-(Tcycle-Tvb)-Tdata_flt-Tsetup>0
=>Tclk_flt+Tvb-Tdata_flt-Tsetup>0 (3)
根据图7:内时钟保持时序图可以求出
Tva=Tcycle+Tco_data-Tdelay
=>Tco_data=Tdelay+Tva-Tcycle
代入上述(2)式中
Tdelay+Tva-Tcycle+Tdata_flt-Tclk_flt-Thold>0
由于Tcycle=Tdelay
所以Tva+Tdata_flt-Tclk_flt-Thold>0 (4)
对照上述两个不等式组,考虑到最坏的情况,把表达式中正值取最小值,而前面带负号的数取最大值,得到
Tclk_flt_min+Tvb_min-Tdata_flt_max-Tsetup_max>0
Tva_min+Tdata_flt_min-Tclk_flt_max-Thold_max>0
从源同步时序分析中可以看出,裕量关系式和CLK、DATA的走线长度并没有直接关系,而是与他们之间的差值有关系,并且需要注意的是,一定是接收端先接收到数据信号,并达到一定的时间再接收到CLK信号,从而对数据信号进行锁存。而驱动端的数据信号也需要CLK来触发,所以对CLK信号的处理就显得尤其关键。从DDR开始,时钟设计中加入了选通信号,其也是上述内时钟系统的演化,只不过把内时钟系统里的输出CLK换成Strobe。而CLK与选通信号Strobe之间又是内时钟系统。有了选通信号之后,数据信号就需要参考选通信号了而不是CLK,其基本原理都没有改变。
以上的共同时钟时序分析与源同步时钟分析重点在于分析时序图,并且根据时序图一步一步推导出建立裕量和保持裕量的关系式,当然重要的不是记住几个公式,而是要理解其推导过程,本文着重从共同时钟向源同步时钟的演变过程。
[attach]584[/attach] 版主你太有才了! 老袁很强大啊。
有一点,在源同步的时候,你只考虑了Tco_data,还要考虑Tco_clk 在通常情况下,datasheet里面很少有单独给data/clk的tco.一般给的是输出建立时间和保持时间.
呵呵. 理论计算上当然要算data和clock的Tco,在实际当中,一般给Tva,Tvb或者输出端的skew等 [quote]老袁很强大啊。
有一点,在源同步的时候,你只考虑了Tco_data,还要考虑Tco_clk
[size=2][color=#999999]Triton 发表于 2009-8-19 22:48[/color] [url=http://www.pcbsi.com/redirect.php?goto=findpost&pid=2771&ptid=538][img]http://www.pcbsi.com/images/common/back.gif[/img][/url][/size][/quote]
这里的源同步(无选通信号)还需要Tco么?
我分析时序的时候直接从系统时钟出来的时钟信号为基准,可能驱动端得芯片内部两路时钟存在一定的skew
即系统时钟出来到数据buffer和时钟到延时这段距离
没有选通的源同步可以认为Tco_clk为0
我是这么理解的 如果输出端是skew,通常意味着在接收端有DLL模块!那这样子是否也需要把DLL的定时误差给算进去? 把DLL延时做在接收端也是一种时钟的设计方法
这样要保证驱动端得输出时钟和数据信号要保持一致同相
其实分析案例中的数据回传(即CPU读操作)时就是这种传输方式
就好像内存控制器的数据和选通的时序关系一般需要做一定的延时
而SDRAM则需要数据和选通信号之间要保持同相
至于各种误差
Skew、Jitter在实际操作中还是以估算为主
由于项目和水平有限,并没有对其做深入的定值分析 data和clock是从两个buffer出来的,是buffer就有Tco这个概念! 今日去培训
偶遇我心仪公司的几个同行
分别来自南京分公司A和上海分公司B
A问B,既然来了就谈谈时序呗
为什么源同步要关注Tvb和Tva呢?
为什么DDR数据线参考DQS呢?为什么在驱动端一定要延时1/4波长相位呢?......
B一一作了解答,语气比较学术
并且也没有太过匪夷所思的言论
原来他们也在学时序,呵呵:lol 学习了…… 我希望有网友能找出文中的不足之处
说实话这篇文档是在思维处于时而呆滞时而亢奋的状态下完成的
文中有很多比较含糊的东西
希望不会对您造成误解
我故意模糊化了源同步时钟与内部时钟系统的区别
因为我担心在外部时钟向源同步时钟的演变过程中,多加一个内部时钟系统会增加文档的迷惑性
会让读者产生错觉,所以我跳过了中间的发展时期
也即我们现在设计中最常用的内部时钟系统
有感兴趣的兄弟姐妹可以跟帖讨论之
当然还可以讨论异步时钟、嵌入式时钟系统、附带发送时钟系统等等 [quote]今日去培训
偶遇我心仪公司的几个同行
分别来自南京分公司A和上海分公司B
A问B,既然来了就谈谈时序呗
为什么源同步要关注Tvb和Tva呢?
为什么DDR数据线参考DQS呢?为什么在驱动端一定要延时1/4波长相位呢?......
B ...
[size=2][color=#999999]袁荣盛 发表于 2009-8-20 23:02[/color] [url=http://www.pcbsi.com/redirect.php?goto=findpost&pid=2805&ptid=538][img]http://www.pcbsi.com/images/common/back.gif[/img][/url][/size][/quote]
什么培训啊? [b] [url=http://www.pcbsi.com/redirect.php?goto=findpost&pid=2918&ptid=538]12#[/url] [i]袁荣盛[/i] [/b]
你所谓的内部时钟,和源同步时钟不是一个概念啊 把DLL延时做在接收端也是一种时钟的设计方法
这样要保证驱动端得输出时钟和数据信号要保持一致同相
其实分析案例中的数据回传(即CPU读操作)时就是这种传输方式
就好像内存控制器的数据和选通的时序关系一般需要做一定的延时
而SDRAM则需要数据和选通信号之间要保持同相
至于各种误差
Skew、Jitter在实际操作中还是以估算为主
由于项目和水平有限,并没有对其做深入的定值分析 版主,你太有才了,谢谢你的资料! lou zu bucuo ma, 对于做SI的兄弟姐妹,这个静态时许分析法,是必须要掌握的,不过对于ddr2/3这类高速总线,就必须采用动态时序分析,主要是挖掘DATASHEET内多余的TCO. 您真強阿, 順便請問一下,DDR2的timing analysis 及 仿真用的Timing model 如何得到? 学习学习!谢谢 老大,按照你的方法我得出的结论是sdram时钟线与数据线可以差3000mil以内好像都没有问题
页:
[1]
2