千兆位串行 I/O 设计 因为我们要实现板与板之间的传送,肯定需要使用不同的振荡器来驱动各自收发器的传 送时钟,所以我们需要考虑时钟修正问题。在决定数据帧的大小时,我们需要折衷两个相互 矛盾的要求。数据帧越大,开销就越小,而且数据可以拥有更多的带宽。数据帧越小,就可 以有更多的对齐符号和时钟修正符号。显然,我们需要平衡这两种要求。我们应当计算两者 各自的界限,并选取一个中间状态。 数据传输容量很容易计算。我们共有 2Gb/s 的可用带宽,其中 1.8Gb/s 用于传送数据, 所以只要开销能承载在剩余的带宽中就可以了。下面我们选用一个合适尺寸来看看其能否工 作。 如果数据帧中承载 2048 字节且开销为 10 字节(SF-2 字节,EF-2 字节,idle-6 字节), 则开销率为 10/2058,约为 5%。我们可以承受的开销率为 0.2/2 或 10%。所以就开销预算而 言,我们可以把数据帧缩小 20 倍。 如果我们需要进行时钟修正,那么我们希望数据帧小点,所以需要考虑下面所述的事项。 我们的MGT要求参考时钟的精度达到 20 ppm。如果我们把MGT设置为 2 符号宽的idle序列, 则时钟修正最多每 49,999 个符号进行一次。所以,idle字符之间的距离应当小于这个数。多 数情况下,我们希望其值小于最大idle字符距离的 1/3,我们选择的值大约为 1/24 th 。至此我 们基本上已经定义好我们的简单协议,唯一剩下的事情就是处理流量控制问题。 记住我们的开销只占用了 0.5%的时间,但是实际上有 10%的可用时间。所以我们需要 定义在剩余时间中填充什么内容以及由谁来控制填充。我们在多余的时间中填充 idle 符号, 所以实际的线路如图 4-7 所示。 图 4-7 :SF 之间的距离 需要注意的是,帧与帧之间的 idle 符号数量可能有轻微的变化,取决于使用的参考振荡 器,对于这种情况如何发生,在协议中应该有详细定义,同时协议也要定义如何去除 idle 字符。我们可以在协议中简单的定义如下:发送器的职责是在传输线路中插入足够多的 idle 字符;而接收器的职责是从接收数据流中去除所有 idle 字符、SF 字符和 EF 字符。 XILINX • 63
轻松实现高速串行 I/O • 以上是定义一个简单协议所要涉及的内容。但是如何实现此协议呢?大部分的工作由启 用 8b/10b 的 MGT 来完成。我们需要在接口处添加一些自定义的逻辑,但是不需要有处理器 和其它的软件,甚至不需要有复杂的状态机。 64 • Xilinx 图 4-8 :两板间传送 1.8Gb/s 数据的简单协议