本页是介绍多吉比特收发器(Multi-Gigabit Transceiver,MGT)的系列文章的第一篇,也是对整个系列将要介绍的内容的概览。
简介
多吉比特收发器(MGT)在计算机或电子系统内部不同部分之间的通信中起着重要作用。计算机内部一些常见接口都基于 MGT,例如 PCIe 和 SATA。还有一些常用接口用于计算机与外设之间的通信,例如千兆以太网、SuperSpeed USB、Thunderbolt 和 DisplayPort。
MGT 也用来连接电子元件,比如连接两片 FPGA。这种情况下,通信通常基于某种较少为人所知的协议,甚至是非标准协议。但 MGT 也可以用来把 FPGA 连接到其他类型的元件,或者用于其他元件之间的相互连接,比如借助 Xillyp2p。
例如,光纤收发器往往是标准模块(尤其是 SFP+ 封装),可以直接与 MGT 对接,如这个示例设计所示。一些高速 ADC/DAC 也使用 MGT 来传输采样数据(通常基于 JESD204 协议)。还有一些协议用于传输视频数据(例如 MIPI 的某些物理层协议)。
尽管 MGT 经常用于双向协议,但每个 MGT 实际上由两个独立部分组成:一个发送器和一个接收器。因此可以让其中一个部分关闭,从而把 MGT 用于单向传输。在大多数 FPGA 的 MGT 中,发送器和接收器的参数也可以独立配置。
总之,MGT 的应用非常广泛。很多时候,接口的名字并不会让人想到其中用了 MGT(例如千兆以太网、SATA 和 DisplayPort),但它们的物理层就是由 MGT 构成的。
值得一提的是,Xilinx(之后并入 AMD)给自己的 MGT 起了不同的名字:RocketIO、GTX、GTH、GTY、GTP、GTM 等。每个名字都对应收发器的一种具体硬件实现,因此根据名字可以大致了解该收发器的数据速率以及其他性能特性。
本系列文章将介绍 MGT 的基础知识,以及一些与之相关的常用术语,目的是帮助读者更容易读懂技术文档,尤其是能够判断哪些参数与自己的项目有关,哪些无关。
什么是 MGT?
需要认识到一个重点:在所有复杂功能的背后,MGT 本质上只是一个 SERDES(串行器/解串器),也就是一个负责接收和发送数据的电子功能模块。MGT 对外的电气接口由两根导线组成,它们构成一对差分线。当第一根线(“正”线)上的电压高于另一根线(“负”线)上的电压时,物理状态对应为逻辑 1;否则为逻辑 0。这与 LVDS 等差分接口的原理相同。
MGT 与 SERDES 的另一个相似之处是,MGT 与应用逻辑之间的接口是一个并行字:在应用逻辑时钟的每个周期内,应用逻辑与 MGT 之间会传输若干位数据。这样做是必要的,因为数据速率远高于 FPGA 能够达到的最高时钟频率。
不过,普通 SERDES 与 MGT 之间也有一些重要区别。下面列举其中几点:
- MGT 能支持的数据速率远高于普通 SERDES。
- SERDES 的接收器需要发送端把时钟和数据流一起送过来。而 MGT 的接收器则可以只依靠数据流信号本身:它会恢复出一个与该数据流信号匹配的时钟,并用这个时钟来代替。这种能力称为时钟数据恢复(clock data recovery,CDR)。即使 MGT 接收器能拿到发送端的时钟,这个时钟也只作为参考时钟使用,而不是数据时钟本身。
- 在使用 MGT 的数据链路上,比特错误是允许出现且正常的。误码率(Bit Error Rate,BER)通常预期低于 10-12 或 10-15。如果普通 SERDES 出现一个比特错误,一般会被当作故障;但 MGT 不是这样。
- 使用 MGT 时,对在这两根导线上传输的数据流内容会有一些限制。数据流必须始终是直流平衡(DC balanced)的。也就是说,数据流中逻辑 0 和逻辑 1 的数量平均起来必须相等。此外,通常还要求发送的各个比特在统计上相互独立。后面还会详细说明这一点。
- MGT 能够产生和检测带外信号(out-of-band signals,OOB)。当正常的数据流为了省电而被关闭时,会发送这些信号。它们的主要用途是唤醒对端的接收器,以便恢复数据位的传输。
那么,MGT 为什么会这么复杂?
凡是在 FPGA 项目中配置过 MGT 模块的人都知道,这里有很多参数和选项。可为什么非要这样呢?
其实未必需要这么复杂:如这个示例设计所示,如果只是把 MGT 当作 SERDES 来用,很多复杂之处都可以省掉。
然而,使用 MGT 通常还是很复杂,原因主要有三点。第一,MGT 模块实现了许多功能模块,这些功能本来可以在 FPGA 的逻辑结构(logic fabric)中实现,但为了效率,MGT 把它们直接包含在了自己内部。例如,所有 MGT 都能对8b/10b 进行编码和解码,尽管这个任务本来可以由应用逻辑完成。只是因为这种编码技术太常用,所以让 MGT 直接处理更为方便。
第二个原因与时钟有关:MGT 正常工作需要多个时钟。更麻烦的是,相比 FPGA 逻辑结构使用的时钟,MGT 对时钟质量的要求更高,尤其是对抖动(jitter)的要求。有时还会使用 SSC(Spread Spectrum Clocking,扩频时钟),这让事情变得更加复杂。
所以,有时候把时钟处理好,难度一点都不亚于为 MGT 选择合适的参数。
第三个原因是,MGT 在设计上要支持好几种标准通信协议。于是,某些特定协议所需功能特性的名字往往就直接取自该协议的规范。对于不了解相关协议的人来说,这些术语毫无意义。这就使人们在为 FPGA 配置 MGT 模块时,很难决定到底要开启哪些功能。
以上问题都会在本系列后面的文章中详细讨论。
需要注意的问题
在大多数应用场景中,MGT 是作为另一种成熟协议的物理层来用的,尤其是 PCIe。在这种情况下,FPGA 工具会处理所有细节,你并不需要太了解底层发生了什么。
不过,如果你打算把自己的应用逻辑直接接到 MGT 上,就必须知道这种逻辑要应对哪些挑战。其中一些问题可以由专门用于 FPGA 之间通信的协议来解决。
下面简要列出一些需要重点考虑的问题。本系列后面的文章会对每一条做更详细的介绍。
- 字对齐(word alignment):和任何 SERDES 一样,MGT 并不知道一个字节或一个更长的字从哪里开始。对于 SERDES,这个问题通常通过“比特滑动”(bit slipping)来解决:让并行字一次移动一个比特,直到收到的数据流变得合理为止。基于 MGT 的协议则通常依靠一个同步字(synchronization word)来实现这一目的。
- 物理导线上传输的数据必须保持直流平衡。最简单的解决办法是使用 8b/10b 编码,但也存在其他选择,有时甚至更合适。
- 加扰(scrambling):在接收端的 MGT 上使用均衡器(equalizer)几乎总是一个好主意。均衡器可以补偿物理介质的非理想特性,从而降低误码率(BER)。在数据速率高、使用低成本线缆或传输距离较长时尤其如此。不过,某些类型的均衡器要求传输的数据在统计上是随机的:也就是说,发送的数据流中,一个比特与另一个比特之间不允许有关联。通常的解决办法是使用加扰器(scrambler),将有效载荷数据与一个伪随机比特序列做异或(XOR);接收端用同样的伪随机序列做异或,从而恢复出原始数据流。
- 比特错误:数据到达接收端 MGT 时可能已经含有错误。消耗这些数据的逻辑在设计上必须能够处理这种错误。在某些应用中,错误被认为足够少,可以忽略(例如在传输原始视频数据且 BER 低于 10-15 时)。在另一些应用中,则需要差错检测和/或重传机制,以确保数据链路可靠。
- 时钟频率差异:当 MGT 接收数据流时,该信号是基于对端时钟(即发送端时钟)的。这个时钟的频率可能与接收端可用的时钟略有差异。而 MGT 与应用逻辑之间的接口往往以本地时钟为基准。因此,如果发送端时钟比接收端时钟快,就意味着 MGT 接收数据的速度比它能交给应用逻辑的速度快。于是,多出来的数据会在 MGT 模块内部堆积,最终出现某种溢出(overflow)。反过来,如果到达的数据速率低于本地时钟,MGT 就无法在每个时钟周期都向应用逻辑交付数据。即使发送端把参考时钟连同数据流一起送给接收端,这些问题也照样会出现:时钟频率的轻微波动就足以造成类似问题。协议通常借助空闲字(idle word)来解决这个问题。
- 功耗:MGT 往往比较耗电。一部分是因为数据速率高,另一方面,高质量的 PLL(锁相环)往往也非常耗电。因此,在 MGT 不使用时(哪怕只是很短的一段时间)把它关掉,常常是可取的。例如,SuperSpeed USB 链路如果在短至 50 μs 的时间内没有数据发送,就会关闭数据流;需要再次通信时,再通过 OOB 握手来恢复。
PMA、PCS 与时钟
这个框图展示了 MGT 的组成部分以及它与应用逻辑之间的交互:
MGT 的功能通常被划分为三个部分:
- 时钟:如上所述,MGT 正常工作需要多个时钟。即使 FPGA 工具会自动配置这些时钟的参数,你仍然有必要了解这些时钟是怎样产生的。
- PMA(Physical Medium Attachment,物理介质连接层):这一部分包含 MGT 的 SERDES,以及各种模拟信号子系统(OOB 信号、接收端检测、均衡器、预加重等)。时钟数据恢复(CDR)也在这里实现。
- PCS(Physical Coding Sublayer,物理编码子层):这一部分包含一些有助于实现通信协议的逻辑:编码器和解码器、字对齐、位宽转换逻辑(Gearbox)、FIFO 等。PCS 中的大部分功能其实也可以在 FPGA 的逻辑结构中实现,但放到 MGT 内部实现会更简单、更高效。
这些内容会在本系列文章中进一步展开。
PIPE 接口
PIPE 标准值得一提:它定义了 MGT 与实现 PCIe、SuperSpeed USB 或 SATA 的逻辑之间的连接,包括用于传输数据、控制信号和状态信号的端口。
在这个标准中,MGT 被称为 PHY 层,协议则被称为 MAC 层。定义以太网、USB 1.x 和 USB 2.0 的标准也使用这套术语。这些标准通常由两颗独立的芯片来实现。例如,要在处理器芯片上实现以太网,MAC 层就做在该芯片内部,PHY 层则放在另一颗独立的芯片中。PIPE 标准也是按同样的思路编写的,只不过 PCIe、SuperSpeed USB 或 SATA 实际上几乎总是完整地集成在同一颗芯片上。PIPE 标准所定义的 MAC 层与 PHY 层之间的连接发生在芯片内部,外界很少能够看到。
PIPE 标准的一个重要影响是:主流 FPGA 的 MGT 都一定会实现 PCIe 所要求的 PIPE 接口。用于 SATA 的 PIPE 接口也常常得到支持。在实现这两种协议时,这显然很有用;但另一个重要的好处是,不同 FPGA 上 MGT 的接口都很相似。尤其是有一些功能单元几乎存在于所有 MGT 中。
总结
本页对 MGT 及其复杂性做了一个概述。在本系列后面的文章中,会讲到上面提到的许多概念。但在此之前,我们先简要介绍一下在连接两片 FPGA 的 MGT 时常用的协议。
