本文介绍Xilinx GT的一些概念,对GT没有概念可是有时刻的童鞋引荐先看一下此文(Xilinx 7系列FPGA 高速收发器GTX/GTH的一些根本概念),弥补一些根底概念。
跟着高速数据传输的遍及,Serdes现已成为FPGA上重要的I/O接口。而线速率也不断的进步。更高的线速率也就带来了更大的通道衰减影响。一般,Serdes接纳端需求翻开内部的均衡来对高速串行信号进行处理,确保内部的有用信号能够比及扩大而噪声能够被按捺,并终究恢复出正确的数据。
一般,高速信号抵达接纳端的Pin方位,称为远端;进入Pin后,被接纳端的均衡处理之后的信号,称为近端。在一些均衡才干比较优异的Serdes上(例如Xilinx的GTX/GTH),远端处的眼图(能够经过高速示波器进行丈量)无法打开,可是近端处的眼图能够彻底打开。这便是均衡器无法忽视的重要作用。
这也带来一个问题,便是怎么丈量眼图。针对远端眼图,能够经过高速示波器来进行丈量。可是这个丈量在许多状况下并不简略,比方没有满足高速的示波器,或许因为FPGA多为BGA封装导致Serdes的RX Pin没有适宜的测验点来进行测验。而近端眼图,因为近端的界说便是在Serdes的PMA内部,所以没有运用高速示波器直接丈量眼图的或许。那么怎么点评近端眼图,就成了一个问题。
Xilinx 7系列(及今后)的GTX/GTH中供给了2D眼图丈量的功用,一般称号为2D eye scan,能够用来丈量近端眼图。Xilinx供给的GT测验东西ibert中,便是运用这个功用进行眼图的丈量。
图片来自UG908
关于GT的根本结构和eye scan的详细原理,因为文档现已做了充沛的描绘,这儿就不重复赘述了。下文将会用简略浅显的言语来描绘2D eye scan的根本原理,起点是易于了解。所以在准确性和谨慎程度上必定有所短缺,这儿先说一声抱愧。
从字面剖析,2D eye scan的意思便是二维眼图扫描。二维的意思自然是横纵两个坐标。所以眼图扫描的根本原理便是将二维眼图的最大规模坐标化,将眼图全体变为一个二维矩阵区域。
眼图扫描的进程便是顺次遍历眼图的二位矩阵区域,并和眼图扫描的正中间区域做比照,记载过错值,然后依据过错值,用不同的色彩来制作当时二位矩阵中某个点,终究组成一个眼图。
用更浅显的话来解说,便是眼图被划分为一个分辨率是N*M的图片。丈量眼图的时分会顺次遍历N*M个点,并和中心点的数据做比照。屡次比照后记载值不相同的次数,即误码率。当遍历完N*M个点之后,依据每个点记载的误码率来用不同的色彩制作一副图,即为眼图。
图片来自UG476
从上图的左面能够看到,每一个点相对中心点都有一个水平偏移量和笔直偏移量,这就等价于每个点的坐标值(至于0,0点在左下角仍是在中心点都仅仅简略的坐标改换罢了)。
从图中的右边能够看到,终究眼图的色彩是依据误码率制作的,结合前文来自UG908的截图,能够清楚的看到当误码率越低,色彩越倾向蓝色(深蓝色);当误码率越高,色彩越倾向赤色。理论上,越挨近中心的点,误码率越低,所以越偏蓝色,而越挨近外围的点,误码率越高,所以越偏赤色。所以实践获取的眼图姿态,是中心蓝色,四周赤色的眼图。
所以从原理上说,2D眼图的丈量进程其实是遍历整个N*M的点阵,核算每一个点与中心点数据值的误码率。当得到点阵误码率的数据之后,后边仅仅是绘图以便漂亮显现的工作。
详细的丈量细节能够参阅UG476的第四章。这儿直接给出定论,内置的2D eye scan是逐一点进行丈量的,所以每次丈量只需一组坐标值。从微观看来,逐点丈量因为是串行的,所以是比较慢的。可是从微观来看,全体丈量速度是比较快速的。
别的一个长处便是,眼图的丈量不需求特别的装备和数据,也不会对数据链路带来任何负面影响。因为是和中心点数据的比照,所以不管GT跑的是什么数据流,都能够进行丈量,也没有影响。这就扩展了这一功用的运用规模。例如ibert的误码率只能核算PRBS,无法用于实践数据的核算/测验。而这一功用能够实时测验,不影响GT正常事务的运转。将这一功用集成到终究版别中,能够作为实时监控高速链路质量的一个参阅规范。
假如GT无法正确回复出数据,则中心点的数据不会安稳。这样核算出来的成果也不会安稳的显现为一个眼睛的图画,而是一个古怪的图画。假如GT能正确恢复出数据,那么中心点一定是安稳的数据,所以不管眼图是否打开,打开多大,大体的形状仍是一个眼睛的图画。从而,眼图打开的巨细就代表信号质量的好坏。所以2D eye scan的成果对链路信号质量的判别,对错常有协助的。
因为是逐点测验,所以这个进程相对来说更适合依据CPU/MCU的软件来完结。Xilinx供给了两个XAPP来完结该功用,其间心的操控都是交给MCU软核MicroBlaze来完结的。
https://www.xilinx.com/support/documentation/applicaTIon_notes/xapp743-e.。。
https://www.xilinx.com/support/documentaTIon/applicaTIon_notes/xapp1198-。。.
下面介绍一下详细的操作进程。
首要,eye scan的详细操作是需求运用DRP的端口,这一端口也是简略和CPU接口适配的。
运用DRP端口的长处是,首要进程不占用FPGA可编程逻辑资源。价值是这个结构更适合MCU接口的完结,假如运用一般逻辑资源完结,会需求规划接口。
1.部分默许端口能够直接连接到地,例如:
EYESCANMODE
EYESCANTRIGGER
EYESCANRESET端口假如不需求运用,也是能够连接到地。
2.下面几个信号设置为1
ES_SCAN_EN
PMA_RSV2[5]
ES_ERRDET_EN
ES_QUAL_MASK=(80’b1)
3.依据位宽(RX_INT_DATAWIDTH)设置ES_SDATA_MASK
40-bit 位宽: ES_SDATA_MASK = (40‘b1, 40’b0)
32-bit位宽: ES_SDATA_MASK = (40‘b1, 32’b0, 8‘b1)
20-bit位宽: ES_SDATA_MASK = (40’b1, 20‘b0, 20’b1)
16-bit位宽: ES_SDATA_MASK = (40‘b1, 16’b0, 24‘b1)
4.依据误码率设置ES_PRESCALE,关于这个参数的值,能够暂时越过,等看完下文,了解原理之后再挑选适宜的值写入。
上述设置只需求设置一次即可。其间要留意,ES_QUAL_MASK和ES_SDATA_MASK都是80bit数据,需求分屡次才干写入。7系列的GTX/GTH,DRP数据位宽为16bit,所以需求5次才干完结80bit的写入。
开端遍历每一个点(即每一对横纵坐标)。横轴由ES_HORZ_OFFSET操控,纵轴由ES_VERT_OFFSET操控。
1.对每个点,将纵坐标写入ES_VERT_OFFSET
这儿需求留意,ES_VERT_OFFSET和ES_PRESCALE的地址是相同的,高5bit是给ES_PRESCALE运用,低9位给ES_VERT_OFFSET运用。关于ES_VERT_OFFSET,0-7bit作为地址运用。第8位作为一个操控位,先填入0。DFE条件下后续还需求用到。
2.将横坐标写入ES_HORZ_OFFSET
3.将ES_CONTROL的低两位设置为2’b01
这儿需求先读取出来,然后将低位设置位01,高位不变,再写入ES_CONTROL寄存器中。
4.循环查询es_control_status寄存器的值,假如发现最低位是1,标明采样/记错计数器溢出了,该点核算完毕(关于两个计数器的意义,下文在做评论)。此刻能够将ES_CONTROL的最低两位设置为2‘d00,以便于下一个点的丈量。
5.读取ES_ERROR_COUNT和ES_SAMPLE_COUNT寄存器的值,分别为记错寄存器和采样寄存器。
6.核算一下误码率
误码率的核算公式为,误码数目 / 采样数目。
误码数目即为ES_ERROR_COUNT的值,假如该值为0,则误码率直接为0。
采样数目的核算则相对担任。详细公式为:
SAMPLE\_COUNT=ES\_SAMPLE\_COUNT\TImes2^{(ES\_PRESCALE+1)}\times RX\_INT\_DATAWIDTH
能够看到,详细的采样数和ES_SAMPLE_COUNT的值是有一个非线性的核算联系。
经过上述公式能够核算出采样数的值,然后参加运算即可获取误码率这一数据。
7.当运用DFE的时分,需求将ES_VERT_OFFSET的第八位设置为1(前文描绘设置为0),然后从头测验一边,核算出另一个误码率,和设置为0的误码率取一次均匀才为终究的误码率。
这样就完结一个点的测验了。
所以测验的大体流程便是先设置好一些固定的参数,然后设置横纵坐标,开端测验。等测验完毕后获取采样数和过错数两个值,核算误码率即可。DFE形式下需求将纵坐标的一位取反后从头测算一下,然后两个误码率取均匀。
这儿就能看出来测验的详细细节。内部测验供给了两个计数器,一个用于核算采样次数,另一个用于核算过错次数。测验进程其实便是进行屡次的数据比照。比照一次,采样次数加1,假如数据不对,则过错次数也加1。比及两个计数器有一个溢出的时分就能够完毕核算了。这样会有两种状况。
1.过错计数器溢出,采样计数器没有溢出,此刻过错值比较大,能够确保精度。
2.采样计数器溢出,过错计数器没有溢出,此刻采样值比较大,误码率往往比较低。
因为两个技能器溢出值相差十分大,所以不或许一起溢出。假如都没有溢出,那么测验就不会中止。
用这种办法,能够获取一个比较好的测验精度成果,也便于测验流程的操控。
别的,了解了这一流程,并调查采样值的核算公式,就能反推出ES_PRESCALE比较适宜的值。
经过逐点的丈量,就能够获取完好的眼图数据,然后进行绘图即可。
2D eye scan的原理就剖析完了。
下面剖析一下实践操作中的一些问题。
1.ES_PRESCALE:假如确认这个值
这个参数实践操控的是采样数的核算成果。一般状况下,经过公式反推,选区一个固定值就好。可是实践状况下,假如运用动态的操控,能够进步精度。关于这部分的评论就十分深入了。有爱好的童鞋能够再了解2D eye scan之后进行研究。
2.采样点的数量:一定要逐点吗
从手册中能够查询到ES_HORZ_OFFSET和ES_VERT_OFFSET的规模。实践操作中,其实并不需求逐点测验。从图片的视点触发,逐点(或许点距离较小)的优点便是图片的分辨率较高。一起坏处便是花费的时刻较长。一般运用中并不需求十分高的眼图分辨率,尤其是并不需求将眼图漂亮的制作出来的条件下,恰当加大距离能够快速获取眼图的根本信息。依据根本信息再考虑是否进步精度,改动参数等操作,更为适宜。ibert中也供给了调整采样点距离的选项。
3.关于ibert眼图显现的漂亮性和眼图的显现
依据上述剖析,眼图终究成果其实是一个颗粒感比较强的图片。ibert中较为滑润/漂亮的眼图其实是美化过的成果。右键点击眼图弹出的菜单中能够挑选没有没画过的点阵图。
ibert制作的滑润眼图
ibert的原始点阵眼图,每个点为细长的横条形状
以上两张图为同一次丈量后调整ibert显现参数获取的不同作用,能够看到ibert默许显现是经过了美化的。而原始图便是一个颗粒感很强的点阵图。
下图为自行规划/完结2D eye scan后自行制作的眼图。
自行完结2D eye scan丈量后制作的眼图
原始数据现已有了的状况下,眼图的制作其实仅仅一个绘图的软件规划。考虑到大部分FPGA开发者或许并不擅长于图形界面的开发,所以引荐了解一下tk绘图。不过更好的计划是让专业的人做专业的工作。经过根本的数据,即便没有绘图,也能做许多工作了。
4.DRP怎么操控
官方引荐的计划是运用MCU来进行操控,比方MicroBlaze的软核。
别的能够经过JTAG,由PC建议操控。原厂计划为AXI JTAG。
自己是经过TCL和JTAG来操控VIO接口,从而操控DRP端口的。关于这个计划,除了操控DRP端口,还能够操控BRAM。详细能够参阅专栏文章:Vivado功用完善:怎么用Tcl/VIO更新BRAM中的数据
5.寄存器的地址
上文的描绘中最大的问题便是没有介绍寄存器和相关的地址。关于各个寄存器的称号再文章现已给出了。详细的地址能够参阅UG476的附录D(一般都是最终一个附录)。
ES_QUAL_MASK 0x031~0x035
ES_SDATA_MASK 0x036~0x03A
PMA_RSV2 0x082
ES_ERRDET_EN 0x03D
ES_EYE_SCAN_EN 0x03D
ES_CONTROL 0x03D
ES_PRESCALE 0x03B
ES_VERT_OFFSET 0x03B
ES_HORZ_OFFSET 0x03C
es_control_status 0x151
ES_ERROR_COUNT 0x14F
ES_SAMPLE_COUNT 0X150
这儿给出7系列GT的部分寄存器地址。
整套计划能够移植到UltraScale/UltraScale+的GT上,需求留意的是,寄存器地址需求从头核对一下。能够确认许多寄存器的地址/界说都不相同。