02 aurora 8b10b回环测试
软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用XILINX A7/K7/Z7/ZU/KU系列FPGA
登录米联客(MiLianKe)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!
1 概述
8B/10B编码是1983年由IBM公司的Al Widmer和PeterFranaszek所提出的数据传输编码标准,目前已经被广泛应用到高速串行总线,如IEEE1394b、SATA、PCI-Express、Infini-band、FiberChannel、XAUI、RapidIO、USB 3.0的美好。8B/10B编码将待发送的8位数据转换成10位代码组,其目的是保证直流平衡,以及足够密集的电平转换。
本课程讲解"7 Series FPGAs Transceivers Wizard"IP的使用。测试方案,产生一组测试的伪随机数据序列后经光模块回传回来,对比rx与tx的数据,以此测试光通信功能。
本课程的理论部分摘录自网络文章"8B10B 详解&综述",如有侵权请联系本公司。
2 8B10B编码原理
以下是理论部分,学习完成后对于我们后面分析代码还是有所帮助。
在光纤通信中,线路编码是必要的,因为电端机输出的数字信号是适合电缆传输的双极性码,而光源不能发射负脉冲,只能用光脉冲的"有" 和"无" 来表示二进制码中的"1"和"0"。该方法虽然简单,却存在三个问题:
1)遇到数字序列中出现长连"0" 或长连"1" 时,将给光纤线路上再生中继器和终端光接收机的定时信息提取工作带来困难;
2)简单的单极性码中含有直流分量。由于线路上光脉冲中"1" 和"0" 是随机变化的,这将导致单极性码的直流成分也作随机性的变化。这种随机性变化的直流成分,可以通过光接收机的交流耦合电路引起数字信号的基线漂移, 给数字信号的判决和再生带来困难;
3)不能实现不中断通信业务下的误码检测;为解决以上问题,通常对于由电端机输出的信号码流,在未对 LED(或 LD)调制以前,一般要先进行码型变换使调制后的光脉冲码流由简单的单极性码,转换为适合于数字光纤传输系统传输的线路码。适合于光纤通信的线路码型有多种,但都要满足以下要求:
a)能保证比特序列独特性。
b)能提供足够的定时信息。
由于在光纤数字传输系统的传输中,只传送信码,而不传送时钟,因此在接收端,必须从收到的码流中提取出定时信息,以利于上述的定时提取。必须限制线路码流中同符号连续数不能过大,也就是说,应避免长连"0" 及长连"1" 的出现,提高电平跳变的密度,使定时提取较为简单。
c)减少功率密度中的高低频分量。
线路码的功率谱密度中的低频分量是由码流中的"0"、"1" 分布状态来决定的,低频分量小,说明"0"、"1"分布比较均匀,直流电平比较恒定,也就是信号基线浮动小,有利于接收端判决电路的正常工作。高频分量是由线路码的速率决定的,这在带宽(色散)限制系统中特别值得注意,在这种系统中,中继距离主要由光纤线路的总带宽(总色散)决定,如果线路码速率提高的太多,会使中继距离大大缩短。
d)要有利于减少码流的基线漂移,即要求码流中的"1"、"0" 码分布均匀,否则不利于接收端的的再生判决
e)码率增加要少,光功率代价要低。
f)接收端将线路码还原后,误码增殖要小。
线路传输中发生的一个误码,往往使接收端的解码(反变换)发生多个错误,这就是误码倍增,也叫做误码扩展或误码增值。由于误码倍增,使光接收机要达到原要求的误码性能指标,必须付出光功率代价,即光接收机灵敏度劣化。因此误码倍增系数越小越好。
g)能提供适当的冗余度。
h)低的对称抖动。
传输的比特序列必须保持低的码型相关的抖动。
i)易于实现。
数字光纤通信系统中常用的线路码型有:加扰二进码、插入比特码和 mBnB 码。
8B/10B编码最初由IBM公司的Albert X.Widemer和Peter A.Franaszek发明,并应用于ESCON(200M互连系统)中。它是mBnB编码中的一个特例。8B/10B编码方法是把8bit代码组合编码成10bit代码,代码组合包含256个数据字符编码和12个控制字符编码,分别记为Dx. y和Kx.y。通过仔细选择编码方法可以获得不同的优化特性。这些特性包括满足串行/解串行器功能必须的变换;确保"0" 码元与"1" 码元个数的一致,又称为直流均衡;确保字节同步易于实现(在一个比特流中找到字节的起始位);以及对误码率有足够的容忍能力和降低设计复杂度。
8B/10B编码方案是把8bit数据分成2个子分组: 3个最高有效位(y)和5个最低有效位( x)。 代码字按顺序排列,从最高有效位到最低有效位分别记为H、G、F和E、D、C、B、A。3bit的子分组编码成4 bit,记为j、h、g、f; 5 bit的子分组编码成6bit,记为i、e、d、c、b、a,其映射关系如下图所示,4bit和6bit的子分组再组合成10bit的编码值。
编码时,低5bit原数据 EDCBA经过5B/6B编码成为6bit码abcdei,高3bit原数据HGF经3B/4B成为4bit码fghj,最后再将两部分组合起来形成一个10bit码abcdeifghj。10B码在发送时,按照先发送低位在发送高位的顺序发送。
将8bit数据分成3bit和5bit两组,分别对应10bit中的4bit和6bit,直流平衡代码的不平衡度就是通过"0" 的个数减去"1" 的个数来计算得到的。如果4bit和6bit的各分组中"0"和"1" 的个数相等,称为完美平衡代码,或称为完美的直流平衡代码,无需补偿,但是这种情况是不可能的。因为在4bit的子分组中,16种编码中只有6 种是完美平衡的,这对于3bit的8种编码值是不够的。 同时,在6bit的子分组中也只有20种编码是完美平衡的,对于5bit的32种编码值也是不够的。 由于4 bit和6bit的两个子分组都是偶数个位数,而不平衡度不可能是"+1" 或"-1",因此,在8B/10B编码方案中还要使用不平衡度为"+2" 和"-2" 的值。在编码过程中,用一个极性偏差( running disparity,RD)参数表示不平衡度,在不平衡时用2个10 bit字符表示一个8位字符,其中一个称为RD-,表示"1" 的个数比"0" 的个数多2个,另一个称为RD+,表示"0" 的个数比"1" 的个数多2个。这种不平衡差值为2的数需要采用2个10bit 表示1个8bit,主要用于K码的控制字符。
8B/10B编码中将K28.1、K28.5和K28.7作为K码的控制字符,称为"comma"。在任意数据组合中,comma只作为控制字符出现,而在数据负荷部分不会出现,因此可以用comma字符指示帧的开始和结束标志,或始终修正和数据流对齐的控制字符。
5B/6B编码和3B/4B编码的映射有标准化的表格,可以通过基于查找表的方式实现。使用 "不一致性(Disparity)"来描述编码中"1"的位数和"0"的位数的差值,它仅允许有"+2"( "0"比"1"多两个)、"0"( "0"与"1"个数相等)以及"-2"("1"比"0"多两个)这三种状况。 由于数据流不停地从发送端向接收端传输,前面所有已发送数据的不一致性累积产生的状态被称为"运行不一致性(Runing Disparity,RD)"。RD仅会出现+1与-1两种状态,分别代表位"1"比位"0"多或位"0"比位"1"多,其初始值是-1。Next RD值依赖于Current RD以及当前6B码或者4B码的Disparity。根据Current RD的值,决定5B/4B和 3B/4B编码映射方式,如下图所示。
这样,经过8B/10B编码以后,连续的"1"和"0"基本上不会超过5bit,只有在使用comma时,才会出现连续的5个0或1。接收端的数据解码过程如下图所示:
3 GTP简介
3.1 GTP高速收发器结构
在7系列的FPGA中,GTP高速收发器通常使用Quad来划分,一个Quad由四个GTPE2_CHANNEL原语和一个GTPE2_COMMON 原语组成。每个GTPE2_COMMON中包含两个PLL(PLL0/PLL1)。只有在应用程序中使用PLL时,才需要实例化GTPE2_COMMON。
每个GTPE2_CHANNEL由一个transmitter,和一个receiver组成。一个参考时钟可以直接连接到一个GTPE2_CHANNEL原语,而不需要实例化GTPE2_COMMON
GTP收发器的发送端和接收端功能是相互独立,都是由Physical Media Attachment(物理媒介适配层PMA)和Physical Coding Sublayer(物理编码子层PCS)组成。PMA内部集成了串并转换(PISO)、预加重、接收均衡、时钟发生器和时钟恢复等;PCS内部集成了8b/10b编解码、弹性缓冲区、通道绑定和时钟修正等。
3.2 参考时钟的选择和分配
7系列FPGA中的GTP收发器提供了不同的参考时钟输入选项。参考时钟选择架构支持PLL0和PLL1。GTP COMMON中时钟的选择:common中的每一个PLL时钟来源都包含7个分别为:一个用于测试的时钟,两个外部参考时钟,两个东向参考时钟,两个西向参考时钟,通过PLL0/1REFCLKSEL 来选择具体使用到的时钟参考源。
3.3 transmitter端
结合本节课的历程,来看一下transmitter端工作流程,并行数据从设备逻辑给到TX接口,首先进入物理编码子层(PCS),经过8B/10B编码器编码之后,进入一个发送缓存区Phase Adjust FIFO。如下所示,GTP收发器TX数据路径有两个用于PCS的内部并行时钟域:PMA并行时钟域(XCLK)和PCS并行时钟域(TXUSRCLK),如果要传输数据,XCLK速率必须与TXUSRCLK速率匹配,并且必须解决两个时钟域之间的相位差。GTP发送端提供了一个TX buffer和一个TX相位校准电路,以解决XCLK和TXUSRCLK域之间的相位差。推荐默认使用TX Buffer,易于操作。如果对低延迟有严格要求则须旁路TX buffer。当TX buffer被旁路时,使用TX相位校准电路去调整XCLK和TXUSRCLK域之间的相位差,以便将数据从PCS传输到PISO。最后通过高速Serdes进行并串转换(PISO),经预/后加重,输出TX驱动程序作为高速串行数据。
3.4 Receiver端
接下来看一下Receiver端工作流程,RX接收到的信号会首先经过RX均衡器,均衡器的主要作用是用于补偿信号的高频损失, LPM和DFE分别是两种不同模式的均衡器。
RX的时钟数据恢复电路是上图中的RX CDR模块,因为GTP传输不带随路时钟,因此在接收端必须去实现时钟恢复和数据恢复,时钟数据恢复电路下图所示:
GTPE2_CHANNEL/GTPE2_CHANNEL收发器采用相位旋转CDR架构。输入数据首先要经过接收机均衡阶段。均衡后的数据由边缘和数据采样器捕获。数据采样器捕获的数据被发送到CDR状态机和下游收发模块。
CDR状态机使用来自边缘和数据采样器的数据来确定传入数据流的相位,并控制相位插值器(pi)。边缘采样器的相位被锁定在数据流的过渡区域,而数据采样器的相位被定位在数据眼的中间。
PLL0或PLL1为相位插补器提供了一个基本时钟。相位插值器依次产生精细的、均匀间隔的采样相位,以允许CDR状态机具有精细的相位控制。CDR状态机可以跟踪可以从本地PLL参考时钟有频率偏移的传入数据流。
4 7 Series FPGAs Transceivers Wizard 的配置
首先创建一个工程,添加7 Series FPGAs Transceivers Wizard IP
4.1 基础配置页面
双击打开 gt ip 核,按如下步骤设置:
Step1:第一页设置:默认即可
Step2:第二页设置:红色箭头所指,首先设置 Protocol 为 aurora 8b10b single lane 4 byte ,也就是对外接口为 32 位;
设置 Line Rate 为 5G,参考时钟为 125,这个是来源于板子的差分晶振,左下角黄色的地方就是我们用到的高速收发器。以下内容对于不同的开发板设置不一样,MA703 有 2 个 SFP 接口分别是位于GTP_X0Y0 和 GTP_X0Y1。利用光纤环路测试,可以使用单头的把 RX TX 利用光钎短接直接环路,也可以用 2 个带光模块的光钎环路。
Step3:速率、参考时钟设置:
Protocol 里面有多种协议可以提供选择,我们这里选择 Aurora 8b10b single lane 4byte,收发器是独立的,可以选择不同的编码和速度,对于 GTP 收发器,最大是 6.25Gbps,我们这里统一选择 5Gbps。这里的参考时钟必须和开
发板上的时钟一致,否则会无法通信。
GTP有两个参考时钟输入端口,经差分-单端转换后通过两个PLL产生收发器发送和接收时钟。若TX和RX线速率一致使用同一个PLL产生时钟,否则需要使用两个不同的PLL。开发板中差分晶振连接GTPREFCLK1,且收发速率相同,故PLL Selection TX和RX均选择PLL0。MA703有2个SFP 接口分别是位于GTP_X0Y0和GTP_X0Y1,因此对于使用1个光模块的配置,选择GTP_X0Y0,对于使用 2 个光模块的配置为选择GTP_X0Y0,GTP_X0Y1。为了测试方便,我们给出了2种光模块的配置方法:
Step4:将内部数据宽度设置为20(16bit数据利用8b10b需要20bit 表示),2个内部数据拼接为1个32bit外部数据,通过计算我们可以得到内部时钟为5*10e3/20=250M,而外部时钟为5*10e3/(20*2)=125M。
External data width就是用户数据向transceiver发送的位宽(16,32,64bit)。然后经过TX8B10BEN,使用8b10b编码,位宽变为20,40,80bit,不使用8b10b编码位宽不改变(16,32,64bit),即TX DATA WIDTH。然后经过一个内部ip转换,由TX INT DATAWIDTH控制,内部数据只能是20,40,即Internal data width。
DRP/System Clock Frequency是动态重配置或系统工作时钟,通过DPR可以让设计者根据所选线速率和定义的协议实时调整收发器参数,这个比较复杂我们用不到,不加说明。DRP时钟选择100MHz,可通过外部PLL IP核产生,DRP时钟主要用来初始化一些GTP控制器的信号或者参数。TXUSERCL和RXUSERCLK时钟的选择概念必要重要,一般TXUSERCLK可以直接选择TXOUTCLK作为用户时钟,而RXUSERCLK,可以选择TXOUTCLK也可以选择RXUSERCLK,还可以选择RXPLLREFCLK作为用户时钟。这里就涉及到一个同步的概念,如果时钟不一致必须设置TX和RX的BUFFER,默认都是设置的。另外输入TX的发送时钟和RX的恢复时钟差异交大,可能会导致RX BUFFER的溢出或者读空,而导致数据出错。比较好的解决办法就是设置RXUSERCLK为RXOUTCLK,就是利用恢复时钟作为用户时钟,这样就很好的解决了同步的问题了。
Step5:设置K码为 K28.5,就是我们后续编代码所使用的bc,K码用来修正数据对齐,代码部分有详细解释,其他的默认。(K28.5解码后就是BC,为什么是BC可以看前面8b10b原理介绍部分)。
Step6:这页都是高级配置,默认不选
Step7:CB 和 CC 顺序
选择支持时钟校准,并且设置每5000个字节发送一组CC Seq。因为从数据流中恢复出来的时钟和本地产生的FIFO读侧的时钟的频率不可能完全一致,所以才要进行CC处理。这个周期是根据发送侧和接收侧的时钟差算出来,然后再根据实际调试结果进行一定的修正。不同的板子不同的环境,这个值都是不同的。
Xilinx 收发器IP核支持通道绑定,将多个收发器通道"绑定"成一个速率更高的传输通道,利用FIFO消除其间的延时不确定性。Clock correction是最后一个重要的点。先来看看RX通道的结构和弹性缓存概念。
接收通道中同样有两个时钟域:从CDR恢复出的XCLK和接收通道工作时钟RXUSRCLK。RX通道使用RX Elastic Buffer来桥接两时钟域,但由于两者细微的差异会使缓存变空或溢出。为此引入时钟矫正,在发送端周期性发送一些特殊字符,接收端在弹性缓存快满时删除这些字符,快空时复制这些字符从而保证缓存内数据维持动态平衡的状态。
所以,GTP的发送时钟和GTP的接收后的恢复时钟,会存在一定的动态变化,这就是前面我们设置 TXUSERCLK和RXUSERCLK的时候必须要考虑的问题,比如增加 FIFO,解决跨时钟的问题。
Step8:可以看到TXUSRCLK和RXUSRCLK频率为250M,TXUSRCLK2和RXUSRCLK2为125M,也就是我们将来写代码要使用的时钟,和前面我们计算的一致。
Step9:点击OK生成IP核,选中生成的GTP IP核,右击,选中open IP example design。
Step10:打开后工程如下图所示,gt_aurora_GT_FRAME_GEN 模块产生要发送的测试帧数据;gt_aurora_GT_FRAME_CHECK 模块检查回环后收到的数据是否正确;
4.2 修改 example 工程
由于开发板的 SFP 屏蔽笼的 tx_disable 引脚都默认接了上拉电阻。要使收发回环测试可以正常进行,必须要将tx_disable 引脚拉低。因此,在 example design 的顶层模块,添加 2 个sfp_tx_disable引脚,且均置为 0 即可。如下图所示。
3:将 drp_clk 直接连入 sysclk 即可,官方的例子这个时钟是引脚进来的加了 bufg,我们用 PLL 产生即可。
修改前如下图
修改为:assign drpclk_in_i = sysclk;
5 硬件连线
硬件使用光纤将光模块的TX和RX短接,然后通过光模块接入SFP接口。
6 实验结果
编译完工程之后下载程序,验证光纤接口8b10b回环实验。下载完成后查看ILA的波形,当检测模块中的gt0_error_count_i信号一直为0,说明光纤接口8b10b环回实验下载验证成功。
本文来米联客(milianke),作者:米联客(milianke),转载请注明原文链接:https://www.cnblogs.com/milianke/p/17936529.html