[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA_GTX光通信连载-02aurora8b10b回环测试

文档创建者:FPGA课程
浏览次数:355
最后更新:2024-09-21
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-FPGA部分 » 2_FPGA实验篇(仅旗舰) » 5-FPGA GTX光通信
本帖最后由 FPGA课程 于 2024-9-21 15:08 编辑

​ 软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!




1概述
8B/10B编码是1983年由IBM公司的AlWidmer和PeterFranaszek所提出的数据传输编码标准,目前已经被广泛应用到高速串行总线,如IEEE1394b、SATA、PCI-Express、Infini-band、FiberChannel、XAUI、RapidIO、USB3.0的美好。8B/10B编码将待发送的8位数据转换成10位代码组,其目的是保证直流平衡,以及足够密集的电平转换。
本课程讲解“7SeriesFPGAsTransceiversWizard”IP的使用。测试方案,产生一组测试的伪随机数据序列后经光模块回传回来,对比rx与tx的数据,以此测试光通信功能。
本课程的理论部分摘录自网络文章“8B10B详解&综述”,如有侵权请联系本公司。本课程还给出了开发板到开发板的视频输出传输demo。
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公司的AlbertX.Widemer和PeterA.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的子分组编码成4bit,记为j、h、g、f;5bit的子分组编码成6bit,记为i、e、d、c、b、a,其映射关系如下图所示,4bit和6bit的子分组再组合成10bit的编码值。
edd63eb078aa4472a50033a6f0cfa202.jpg
编码时,低5bit原数据EDCBA经过5B/6B编码成为6bit码abcdei,高3bit原数据HGF经3B/4B成为4bit码fghj,最后再将两部分组合起来形成一个10bit码abcdeifghj。10B码在发送时,按照先发送低位在发送高位的顺序发送。
2931f9e3afd744daaaa9882bc8016a4e.jpg
将8bit数据分成3bit和5bit两组,分别对应10bit中的4bit和6bit,直流平衡代码的不平衡度就是通过“0”的个数减去“1”的个数来计算得到的。如果4bit和6bit的各分组中“0”和“1”的个数相等,称为完美平衡代码,或称为完美的直流平衡代码,无需补偿,但是这种情况是不可能的。因为在4bit的子分组中,16种编码中只有6种是完美平衡的,这对于3bit的8种编码值是不够的。同时,在6bit的子分组中也只有20种编码是完美平衡的,对于5bit的32种编码值也是不够的。由于4bit和6bit的两个子分组都是偶数个位数,而不平衡度不可能是“+1”或“-1”,因此,在8B/10B编码方案中还要使用不平衡度为“+2”和“-2”的值。在编码过程中,用一个极性偏差(runningdisparity,RD)参数表示不平衡度,在不平衡时用2个10bit字符表示一个8位字符,其中一个称为RD-,表示“1”的个数比“0”的个数多2个,另一个称为RD+,表示“0”的个数比“1”的个数多2个。这种不平衡差值为2的数需要采用2个10bit表示1个8bit,主要用于K码的控制字符。
dbae700de894448eb09b9977178330e6.jpg
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"多两个)这三种状况。由于数据流不停地从发送端向接收端传输,前面所有已发送数据的不一致性累积产生的状态被称为“运行不一致性(RuningDisparity,RD)”。RD仅会出现+1与-1两种状态,分别代表位"1"比位"0"多或位"0"比位"1"多,其初始值是-1。NextRD值依赖于CurrentRD以及当前6B码或者4B码的Disparity。根据CurrentRD的值,决定5B/4B和3B/4B编码映射方式,如下图所示。
88d2c37fe7984c9da55e51c5dc7362c0.jpg

662952c27fa045989070dbaac2900f4a.jpg
这样,经过8B/10B编码以后,连续的“1”和“0”基本上不会超过5bit,只有在使用comma时,才会出现连续的5个0或1。接收端的数据解码过程如下图所示:
3fc14d394f8d47548caaa9e0f34aca7e.jpg
3GTX简介
3.1GTX高速收发器结构
在7系列的FPGA中,GTX高速收发器通常使用Quad来划分,一个Quad由四个GTXE2_CHANNEL原语和一个GTXE2_COMMON原语组成。每个GTXE2_COMMON中包含一个LC-tankpll(QPLL)。只有在应用程序中使用QPLL时,才需要实例化GTXE2_COMMON。
3b4ed1f7fe3b4cce964bc90bd9a3ab14.jpg
每个GTXE2_CHANNEL由一个channelPLL(CPLL)、一个transmitter,和一个receiver组成。一个参考时钟可以直接连接到一个GTXE2_CHANNEL原语,而不需要实例化GTXE2_COMMON
d8a40f9b26cc426ba0c13b226c19bab3.jpg
GTX收发器的发送端和接收端功能是相互独立,都是由PhysicalMediaAttachment(物理媒介适配层PMA)和PhysicalCodingSublayer(物理编码子层PCS)组成。PMA内部集成了串并转换(PISO)、预加重、接收均衡、时钟发生器和时钟恢复等;PCS内部集成了8b/10b编解码、弹性缓冲区、通道绑定和时钟修正等。

550550736045469d8662f09c6f4fd452.jpg
3.2参考时钟的选择和分配
7系列FPGA中的GTX收发器提供了不同的参考时钟输入选项。参考时钟选择架构支持QPLL0和CPLL。从架构上讲,每个Quad包含四个GTXE2_CHANNEL原语,一个GTXE2_COMMON原语,两个专用的外部参考时钟引脚对,以及专用的参考时钟路由。如果使用到了高性能QPLL,则必须实例化GTXE2_COMMON如下面GTXE2_COMMON时钟多路复用器结构的详细视图所示,在一个Quad中有6个参考时钟引脚对,两个本地参考时钟引脚对:GTREFCLK0或GTREFCLK1,两个参考时钟引脚对来自上面的两个Quads:GTSOUTHREFCLK0或GTSOUTHREFCLK1,两个参考时钟引脚对来自下面的两个Quads:GTNORTHREFCLK0或GTNORTHREFCLK1。
e3411b72eb484997b66f4503c8efe2a9.jpg
类似的,下面是GTXE2_CHANNEL原语中的参考时钟多路复用器结构的详细视图。

d193608d4c23455aa39afd3786bfcc91.jpg
3.3transmitter端
结合本节课的历程,来看一下transmitter端工作流程,并行数据从设备逻辑给到TX接口,首先进入物理编码子层(PCS),经过8B/10B编码器编码之后,进入一个发送缓存区PhaseAdjustFIFO。如下所示,GTX收发器TX数据路径有两个用于PCS的内部并行时钟域:PMA并行时钟域(XCLK)和PCS并行时钟域(TXUSRCLK),如果要传输数据,XCLK速率必须与TXUSRCLK速率匹配,并且必须解决两个时钟域之间的相位差。GTX发送端提供了一个TXbuffer和一个TX相位校准电路,以解决XCLK和TXUSRCLK域之间的相位差。推荐默认使用TXBuffer,易于操作。如果对低延迟有严格要求则须旁路TXbuffer。当TXbuffer被旁路时,使用TX相位校准电路去调整XCLK和TXUSRCLK域之间的相位差,以便将数据从PCS传输到PISO。最后通过高速Serdes进行并串转换(PISO),经预/后加重,输出TX驱动程序作为高速串行数据。
cd2d90c38e984a1396f1ef10cd496c7d.jpg

3.4Receiver端
接下来看一下Receiver端工作流程,RX接收到的信号会首先经过RX均衡器,均衡器的主要作用是用于补偿信号的高频损失,LPM和DFE分别是两种不同模式的均衡器。
2199dc959aa54f22bba4e463102986b3.jpg
RX的时钟数据恢复电路是上图中的RXCDR模块,因为GTX传输不带随路时钟,因此在接收端必须去实现时钟恢复和数据恢复,时钟数据恢复电路下图所示:
4f4d4178956f4b1988776972eaa05036.jpg
GTXE2_CHANNEL/GTXE2_CHANNEL收发器采用相位旋转CDR架构。输入数据首先要经过接收机均衡阶段。均衡后的数据由边缘和数据采样器捕获。数据采样器捕获的数据被发送到CDR状态机和下游收发模块。
CDR状态机使用来自边缘和数据采样器的数据来确定传入数据流的相位,并控制相位插值器(pi)。边缘采样器的相位被锁定在数据流的过渡区域,而数据采样器的相位被定位在数据眼的中间。
CPLL或QPLL为相位插补器提供了一个基本时钟。相位插值器依次产生精细的、均匀间隔的采样相位,以允许CDR状态机具有精细的相位控制。CDR状态机可以跟踪可以从本地PLL参考时钟有频率偏移的传入数据流。
4 7SeriesFPGAsTransceiversWizard的配置
首先创建一个工程,添加7SeriesFPGAsTransceiversWizardIP

a6a93b504b0b4536bd426eea9bed182a.jpg
4.1基础配置页面
4.1.1Transceiver配置
双击打开gtip核,按如下步骤设置:
Step1:第一页设置:默认即可
785b62ed664e455382c20c34b708579c.jpg
Step2:第二页设置:红色箭头所指,首先设置Protocol为aurora8b10bsinglelane4byte,也就是对外接口为32位;设置LineRate为5G,参考时钟为125,这个是来源于板子的差分晶振,左下角黄色的地方就是我们用到的高速收发器。以下内容对于不同的开发板设置不一样,以MZ7100FC为例,MZ7100FC有2个SFP接口分别是位于GTX_X0Y06和GTX_X0Y07。利用光纤环路测试,可以使用单头的把RXTX利用光钎短接直接环路,也可以用2个带光模块的光钎环路。

3f8954afcac1463292084288bd76c1c7.jpg
Step3:速率、参考时钟设置:
Protocol里面有多种协议可以提供选择,我们这里选择Aurora8b10bsinglelane4byte,收发器是独立的,可以选择不同的编码和速度,对于GTX收发器,最大是10.3125Gbps,我们这里统一选择5Gbps。这里的参考时钟必须和开发板上的时钟一致,否则会无法通信。

cf8b547f3ebc4f419c1257b11e8c2ce9.jpg
GTX有两个参考时钟输入端口,经差分-单端转换后通过两个PLL产生收发器发送和接收时钟。若TX和RX线速率一致使用同一个PLL产生时钟,否则需要使用两个不同的PLL。开发板中差分晶振连接GTXREFCLK1,且收发速率相同,故PLLSelectionTX和RX均选择PLL0。由于MZ7100开发板上只有2个SFP接口,分别定义到了GTX_X0Y06和GTX_X0Y07,因此对于使用1个光模块的配置,选择GTX_X0Y06,对于使用2个光模块的配置为选择GTX_X0Y06,GTX_X0Y07。为了测试方便,我们给出了2种光模块的配置方法:

829f531c80fa40e4b348c6ae9cc5c7e7.jpg
Step4:页将内部数据宽度设置为20(16bit数据利用8b10b需要20bit表示),2个内部数据拼接为1个32bit外部数据,通过计算我们可以得到内部时钟为5*10e3/20=250M,而外部时钟为5*10e3/(20*2)=125M。编码方式采样8B/10B编码,这种编码方式最主要的目的是“直流平衡”,即根据特定的编码表实现数据传输过程中比特“0”和比特“1”的数量基本一致,且减少连0和连1的情况。编码后的数据流具有较多的跳变,有助于接收端时钟数据恢复(CDR)。DRP/SystemClockFrequency是动态重配置或系统工作时钟,通过DPR可以让设计者根据所选线速率和定义的协议实时调整收发器参数,这个比较复杂我们用不到,不加说明。DRP时钟选择100MHz,可通过外部PLLIP核产生,DRP时钟主要用来初始化一些GTX控制器的信号或者参数。TXUSERCLK,和RXUSERCLK时钟的选择概念必要重要,一般TXUSERCLK可以直接选择TXOUTCLK作为用户时钟,而RXUSERCLK,可以选择TXOUTCLK也可以选择RXUSERCLK,还可以选择RXPLLREFCLK作为用户时钟。这里就涉及到一个同步的概念,如果时钟不一致必须设置TX和RX的BUFFER,默认都是设置的。另外输入TX的发送时钟和RX的恢
复时钟差异交大,可能会导致RXBUFFER的溢出或者读空,而导致数据出错。比较好的解决办法就是设置RXUSERCLK为RXOUTCLK,就是利用恢复时钟作为用户时钟,这样就很好的解决了同步的问题了。

0043c0a566ee4fea9034bc5ff159c31d.jpg
Step5:设置K码为K28.5,就是我们后续编代码所使用的bc,K码用来修正数据对齐,代码部分有详细解释,其他的默认。(K28.5解码后就是BC,为什么是BC可以看前面8b10b原理介绍部分)。

b510d78cf3f944fc83ac85b800e69368.jpg
Step6:这页都是高级配置,默认不选
c083a9c3cb41463fad40bde52c804c71.jpg


Step7:CB和CC顺序
4594b640491f4372a2a0e92fc964abbc.jpg
选择支持时钟校准,并且设置每5000个字节发送一组CCSeq。因为从数据流中恢复出来的时钟和本地产生的FIFO读侧的时钟的频率不可能完全一致,所以才要进行CC处理。这个周期是根据发送侧和接收侧的时钟差算出来,然后再根据实际调试结果进行一定的修正。不同的板子不同的环境,这个值都是不同的。
Xilinx收发器IP核支持通道绑定,将多个收发器通道“绑定”成一个速率更高的传输通道,利用FIFO消除其间的延时不确定性。Clockcorrection是最后一个重要的点。先来看看RX通道的结构和弹性缓存概念。
82c4ec31502243aabdf78ea2d816b388.jpg
接收通道中同样有两个时钟域:从CDR恢复出的XCLK和接收通道工作时钟RXUSRCLK。RX通道使用RXElasticBuffer来桥接两时钟域,但由于两者细微的差异会使缓存变空或溢出。为此引入时钟矫正,在发送端周期性发送一些特殊字符,接收端在弹性缓存快满时删除这些字符,快空时复制这些字符从而保证缓存内数据维持动态平衡的状态。
a1fd72b38802445688369b43bbbea4ee.jpg
所以,GTX的发送时钟和GTX的接收后的恢复时钟,会存在一定的动态变化,这就是前面我们设置TXUSERCLK和RXUSERCLK的时候必须要考虑的问题,比如增加FIFO,解决跨时钟的问题。

Step8:可以看到TXUSRCLK和RXUSRCLK频率为250M,TXUSRCLK2和RXUSRCLK2为125M,也就是我们将来写代码要使用的时钟,和前面我们计算的一致。
aab276fd08824820844145a99506d13a.jpg
Step9:点击OK生成IP核,选中生成的GTXIP核,右击,选中openIPexampledesign。

7a2b76e0733a4637a67006f107a2bf1b.jpg

Step10:打开后工程如下图所示,gt_aurora_GT_FRAME_GEN模块产生要发送的测试帧数据;gt_aurora_GT_FRAME_CHECK模块检查回环后收到的数据是否正确;
e4912147d3c143ecb88d3ee588c3ff5a.jpg
4.1.2修改example工程
1:由于开发板的SFP屏蔽笼的tx_disable引脚都默认接了上拉电阻。要使收发回环测试可以正常进行,必须要将tx_disable引脚拉低。因此,在exampledesign的顶层模块,添加2个sfp_tx_disable引脚,且均置为0即可。如下图所示。
ff47dab8da764117917111b4d953dd85.jpg


2:将 drp_clk  直接连入 sysclk  即可,官方的例子这个时钟是引脚进来的加了 bufg ,我们用 PLL  产生即可。 修改前如下图
f9ec8d94b7df4e06900c7cbf0d0102c9.jpg
修改为:assigndrpclkini=drp_clk;
3: 接 下 来 我 们 将 在 硬 件 上 实 现 回 环 传 输 测 试 数 据 的 功 能 , 首 先 我 们 需 要 从 外 部 给 出 一 个 自 由 时 钟,hb_gtwiz_reset_all_in 复位信号是高电平有效,用户直接拉低即可。由于开发板的 SFP 屏蔽笼的 tx_disable 引脚都默认接上了上拉电阻,要使收发环路测试可以正常进行,必须要将 tx_disable 引脚拉低。
45303e2d9e65493db10495846e7a90bd.jpg
4 :在实例工程中添加必要的 ILA ,去抓取对应的信号。
79f634aa987c4e808d08981066b117ba.jpg
5硬件工程搭建

硬件使用光纤将光模块的TX和RX短接,然后通过光模块接入SFP+接口。
57796dc9d17a4f0cb3133036a7cd4d6a.jpg
6实验结果
编译完工程之后下载程序,验证光纤接口8b10b回环实验。下载完成后查看ILA的波形,当检测模块中的gt0_error_count_i信号一直为0,说明光纤接口8b10b环回实验下载验证成功。
077dba908b5442a7bf5d939297ad6856.jpg


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则