最近的项目纠结于负载电容(load capacitor)的问题。大家都认为FPGA IO的8pf寄生电容过大了,从而导致IO上的信号无法运行在我们预期的频率上。

抛开其他的不讲,我倒是对这个8pf的负载电容觉得很蹊跷。多大的负载电容就算大了?这得仔细想想了。

在数字电路中,信号从发送端传递到接受端可以视为一个充放电的过程。我们假设一种最典型的场景,即发送端是推拉发送电路而接收端是个高阻输入电路,并且接收端有寄生的电容。那么,发送端驱动高电平的时候将对接收端的电容进行充电过程,而发送端驱动低电平的时候就是让接收端的电容进行放电过程。

充放电过程可以有两种方式来实现:
1.恒流充电,即驱动器使用恒定的电流来对电容进行充放电,驱动器相当于恒流源。
2.恒压充电,即驱动器使用恒定的电压来对电容进行充放电,驱动器相当于恒压源。

那么两种情况下充放电的时间t是多少呢,这才是我们关心的。
对于情况1,t比较好计算 t=CV/I = Q/I其中C是电容的容量,V是充电目标电压,I是充电电流,Q是充电结束需要的总电荷量。
对于情况2,t的计算相对复杂,如下:因为 I=C*dV/dt; I = (V0-V)/R; 所以(V0-V)/R=C*dV/dt; 所以 RC*dV/dt + V = V0; 解这个微分方程得 V = V0(1-exp(-t/RC) 而充电到90%V0 所需要的时间则为2.2RC(RC称为时间常数)类似地,对于放电过程有 V = V0*exp(-t/RC)放电到10%*V0也需要2.2RC的时间。注:R是驱动器的输出电阻

所以对于上升沿或者下降沿时间为t0的输入信号,接收端电容C将使输入信号的边沿时间变为(t*t+(RC*RC))再开方。这里的R是驱动端电路的输出阻抗。但是,一般的IC都不直接给出这一数值,而是给出输出高低电平时的驱动电流大小I0,个人理解可以按R=V0/I0去近似估算。

在上述分析的情况下,我们来计算一下8pf电容对信号所造成的影响。使用的驱动器是LVTTL驱动器,极限输出电流是48mA,所以驱动器输出电阻近似为2.4V/48mA=50欧姆,所以2.2RC = 880ps. LVTTL驱动器空载时上升沿时间为800ps, 所以最终在接收电路看到的信号的上升沿时间近似为1190ps,这对于2.5ns bit-time也是可以以忍受的。

通过上述分析,我们可以看到8pf的负载电容在相对较高的电流驱动下也是存在将近300ps的sample window,虽然不是很大,当在做了skew calibration的基础下还是够用了的。所以接收端的负载电容应该不是造成在400Mbps数据速率情况下采样不正确的根本原因。根本原因是什么呢?Tpd.

对于像LVTTL/LVCOMS这样的逻辑门电路而言,Tpd指的是从逻辑门电路接受有效的输入信号到其输出相应的输出信号所需要的时间延迟。这个延迟不想DRAM的access delay,这是一个固有delay,每个数据bit的到来都要等待Tpd才能有相应的输出信号出去。可以发现Tpd对于信号运行频率有着至关重要的作用。如果数据持续时间小于Tpd的话,那么当一个有效变化沿到来时,逻辑门电路还来不及输出相应信号,信号的下一个有效变化沿又已经来到,从而会导致逻辑门电路的输出不正确。Tpd与时序逻辑电路里面的hold time颇为类似,但是又不尽相同. 所以5.2ns的Tpd想运行到400Mbps本来就是不靠谱的事。

其实早就应该关注Tpd这个参数了,最后是在于这个项目无关的同事无意中提起后才深入地去思考,真是惭愧啊。

上面分析了接收端的电容负载对于信号的影响,下面来分析一下传输线中间的电容负载对于信号传输的影响。

总结起来信号在传输过程中如果碰到容性负载将会分成两部分,一部分发射回驱动端,另外一部分继续向接收端传播,但是先后的边沿时间将会被加长。容值为C,传输线阻抗为Z0将对应于时间常数Z0*R/2。如下图所示:详见Johnson Howard-High Speed Digital Design的170页