[FPGA 实现及PCIe IP 核知识点] 全国99.9%不会计算PCIe TX EQ,你会吗?-Altera-Intel社区-FPGA CPLD-ChipDebug

[FPGA 实现及PCIe IP 核知识点] 全国99.9%不会计算PCIe TX EQ,你会吗?

(本文介绍了如何通过设计Pattern,然后量测相应信号的峰峰值来计算De-emphasis,Preshoot和Boost。同时验证了PCIe Spec中的Tx Preset Ratios and Corresponding Coefficient Values表格中的内容)

以下内容默认你已经阅读过该篇文章:[PCIe] 什么是TX均衡系数?
下面我们先看看PCIe协议里的一张图:

1.png

这张图的下面,列举了如何通过Va,Vb,Vc和Vd来计算Preshoot,De-emphasis和Boost的公式。所以,如何得到Va,Vb,Vc和Vd这几个输入参数才是关键。在真实的环境中,这些值都能够通过构造部分码型(Pattern),然后测量得到。因为Spec中叙述的不是特别的清楚,我们这里来展开介绍一下这几个输入参数究竟如何得到:
首先,上图的波形实际上代表着一系列的01代码,如果我们将红色的作为差分对的P,蓝色作为差分对的N,那么这一系列的01代码的逻辑值从左到右是0_1100_1111_1100_0001_0001b。同时,最左边的bit出现的最早,依次往右逐bit的输出。

其次,我们来看看Vd,原文中对Vd的表述是Maximum Swing,也就是TX发送Pattern时能够达到的最大振幅。如何能够获得最大振幅的值呢?等看完了整篇文章你就能够得到推导过程。这里我们先说说方法,当你输入类似010101…这种Pattern的时候其峰峰值就是Vd。

从图上可以看出,当出现Pattern类似1111_0000的时候,最后一个1会比之前的1从幅值上要高一点点,这个增益被定义为Preshoot,而这个稍微高一点点的峰峰值就是Vc。从ABC角度来看就是110b,或者001b,这其中B位的振幅相比A的振幅就是preshoot。

然后,我们来看看Vb,Vb实际就是长1或者长0中间的相对平缓的那一段的峰峰值。从ABC角度来看就是111b或者000b,因为左右两边的bit和自身一致,无论是前一个bit还是后一个bit的贡献均与本bit的方向相反,所以大家会看到Vb是这几个值中最小的那个。

最后是Va,Va实际是在例如1000b或是0111b(ABCD)中,B相对C的增益,这里把D写出来是确保C的高度能够确定在Vb高度。从图上可以看出来,Va比Vb要大,所以该增益实际是一个负值。这也是为什么我们在谈de-emphasis值的时候都是负的原因。例如-6dB等。

如果以上的内容,你通过亲自演算已经掌握,那么我们再来研究下面的TX Preset Ratios和相应的Coefficients就容易多了。TX Preset即TX Equalization的预设值,通常在微调TX Equalization之前,TX需要按照预设值来设置自己的Equalization参数。而PCIe协议提供的这份表格正好能让我们通过它来验证上面学习到的内容。

2.png

因篇幅问题,我们举例P7的演算和验证过程,其他Preset希望大家选取一到两个温习整个计算过程。验证过程如下,根据PCIe协议规定,P7的preshoot需要设置在3.5dB,而De-emphasis需要设置在-6dB。通过这个规定,我们是否能够推算出C-1,C0和C+1的值,是否能够计算出Va/Vd,Vb/Vd和Vc/Vd的值?

首先,设C-1的绝对值为x,C0的绝对值为y,C+1的绝对值为z。那么对于某个bit,例如bit B,如果其逻辑值为+1,则B对其更早一个bit A的贡献将是(-1)xVd。B对晚其一个bit C的贡献是(-1)zVd。如果B的逻辑值为-1,那么B对A的贡献将是xVd,对C的贡献将是zVd。对于B的输出来说,其Voltage由三个部分组成,分别是(B逻辑值)yVd ,(A逻辑值)(-1)zVd和(C逻辑值)(-1)xVd。其中,(-1)的含义是x和z的贡献均与当前逻辑值的方向相反,A与z相乘的含义是,A的C+1对B才会有贡献。C与x相乘的含义也一样,C的C-1对B才会有贡献。为了计算方便,我们将Vd归一化,用1代替。

接下来,我们计算Va的值:(Pattern = 011b,注:0在下面用-1代替)

Va = (-1)(-1)z + (1)y + (1)(-1)*x = z + y – x

然后计算Vb的值:(Pattern = 111b)
Vb = (1)(-1)z + (1)y + (1)(-1)*x = -z + y – x

然后计算Vc的值:(Pattern = 110b)
Vc = (1)(-1)z + (1)y + (-1)(-1)*x = -z + y + x

最后计算Vd的值:(Pattern = 010b)
Vd = (-1)(-1)z + (1)y + (-1)(-1)*x = z + y + x
可以看出,x+y+z实际上就是1。

通过preshoot和de-emphasis的公式我们可以得到:

3.png

因此:

4.png

注:以上均为近似值。

我们把上面的等式化简一下,将y用x和z代替,然后找出x和z的关系:

        Va = 2Vb

        2Vc = 3Vb



z + y - x =  2(-z + y - x)
2(-z + y + x) = 3(-z + y - x)


=>
y-3z-x=0
y-z-5x=0


=>
3z+x=z+5x


=>
z = 2x
y = 3z+x = 7x

我们将z和y均用x代替,然后让他们加起来等于1:
7x + 2x + x = 1
于是得到:
x=0.1,y=0.7, z=0.2
C-1= -0.1,C+1 = -0.2,C0 = 0.7

接下来Va就比较好计算了,代入:

Va = (-1)*(-1)*z + (1)*y + (1)*(-1)*x = z + y - x = 0.8
Vb = (1)*(-1)*z + (1)*y + (1)*(-1)*x = -z + y - x = 0.4
Vc = (1)*(-1)*z + (1)*y + (-1)*(-1)*x = -z + y + x = 0.6

Reference:

PCIExpress® Base Specification Revision 5.0 Version 1.0

请登录后发表评论

    没有回复内容