10G光通信 64B66B编解码 配置方法及其工作原理

1 配置IP核

【vivado PG学习】1 PG168:7 Series FPGAs Transceivers学习笔记4.1 生成IP核介绍了如何生成IP核,包含每一页的详细配置选项的含义。

以10G 64/66B为例,具体配置过程可以参考师兄大佬的博客xilinx IP核配置,一步一步验证Xilinx Serdes GTX最高8.0Gbps

这里再记录一下:

1.1 Page1:GT Selection:

在这里插入图片描述

GT Type:
收发器类型硬件决定,是啥就选啥。

Shared Logic:

尽量选择共享,这样QPLL,缓冲器,复位逻辑等放在IP 核外面的参考设计文件中,方便配置。

1.2 Page2:Line Rate,RefClk Selections:

在这里插入图片描述

Protocol:

这里的协议指的是一些预定义的协议的IP核默认设置,翻译成草案更合适。协议包括8/10b,64/66b等。这里选空白开始Start from scratch就行,反正后面也要自己配置一些选项。

Line Rate:
选10G。这里是有范围的。

极限范围:

查阅《DS182:Kintex‐7 FPGAs Data Sheet: DC and AC Switching Characteristics》

在这里插入图片描述

有效范围:
在这里插入图片描述

Vivado Lab Tools
勾选的话就是自动加一些ILA和VIO IP核,这里嫌自己添加麻烦可以钩,但是自动加的位宽、信号个数可能不是很满意。特别是会加很多杂七杂八的wire,丑。

PLL Selection
线速率小于等于6.6Gbps就可以选择QPLL(Quad PLL)或CPLL(Channel PLL),线速率大于6.6Gbps就只能选QPLL了。

TX/RX Reference Clock(MHz)Use GTX XxYxTX/RX Clock Source这几个选项跟硬件有关,需要参考两个文档:

  1. PCB的原理图。

  2. 《UG476:7 Series FPGAs GTX/GTH Transceivers》APPX.A Placement Information by Package章节。

//--------------------配置方法-------------------begin
在这里插入图片描述

  • ① 打开文档。
  • ② 找到目标的器件系列。
  • ③ 找到目标的器件。
  • ④ 找到原理图上对应的GTX位置。比如我的原理图上光口的信号接到了MGTXT(R)XP(N)0_115,那我就要选中左下角图像界面的GTX_X0Y0,然后勾选Use GTX X0Y0.
  • ⑤ 找到所选的GTX对应的Quad的参考时钟。比如原理图上MGTREFCLK1P(N)_115接了156.25MHz的时钟输入,那我TX/RX Reference Clock(MHz)就要选156.25MHz,TX/RX Clock Source就要选REFCLK1 Q0(REFCLK11代表MGTREFCLK1P(N),Q0代表 115 bank)。如果本Quad没有想要的时钟,也可以选相邻Quad的参考时钟。

//--------------------配置方法-------------------end

1.3 Page3:Encoding and Clocking

在这里插入图片描述

External Data Width(Bits)
设置外部数据位宽,也就是我们要发送的数据的位宽,这里选32bit。

DRP/System Clock Frequency
这个是IP外部一些支持模块(QPLL,复位等)的工作时钟,可以用外部MMCM或PLL产生的时钟或者外部引脚输入的时钟,这里我直接用的外部时钟,频率为25MHz。

Enable T(R)X Buffer
我们使能输入缓冲器。不然时钟比较难对齐。工作原理见输入/输出缓冲器工作原理

EnCoding/Decoding

设置编码方式及序列计数器工作模式,我们选择64B/66B with Int Seq Ctr 64B/66B编码,内部序列计数器工作模式。工作原理见两种序列计数器工作原理

Option Ports
都是关于8B/10B的一些端口,这里肯定全部取消咯。

Synchronization and Clocking : Option Ports
能取消的全取消咯,简化端口。

输入/输出缓冲器工作原理

//-------------输入/输出缓冲器工作原理-----------------begin

TX Buffer
为了深入理解Buffer的作用,首先要学习Tx的时钟域。

在这里插入图片描述

GTX/GTH收发器TX数据路径在PCS中有两个内部并行时钟域:PMA并行时钟域(XCLK)和TXUSRCLK域。为了传输数据,XCLK速率必须匹配TXUSRCLK速率,并且必须解决两个域之间的所有相位差。

该GTX/GTH发送器包括TX buffer和TX相位校正电路,以解决XCLK和TXUSRCLK域之间的相位差。当TX buffer被绕过(TX Buffer Bypass)时,使用TX相位校正电路。所有TX数据通路必须使用TX buffer或TX相位校正电路。缓冲 和 相位对齐 之间的权衡:

TX BufferTX Phase Alignment
易用性建议使用TX buffer。它简单,易于操作。相位校正是一个高级特性,需要额外的逻辑和额外的时钟源限制。TXOUTCLKSEL必须选择GTX/GTH收发器参考时钟作为TXOUTCLK驱动TXUSRCLK的源
延时如果低延迟是关键,则必须绕过TX buffer相位校正在TX数据路径中使用更少的寄存器来实现更低的确定性延迟。
TX 线与线的抗偏斜TX相位校正电路可用于减少独立的GTX/GTH收发器之间的偏斜。所有相关的GTX/GTH收发器必须使用相同的线路速率。

总之,没有各通道之间的同步需求那就别瞎搞,使能Buffer就完事了。

TX Buffer的使用:

TXBUFSTATUS显示overflow或underflow状态时,应该重置TX buffer。TX buffer可以通过使用下列信号复位:GTTXRESET, TXPCSRESET,或当TXBUF_RESET_ON_RATE_CHANGE = TRUE时GTX/GTH收发器内部产生的对速率变化的TX buffer复位信号。断言GTTXRESET会触发一个序列,重置GTX/GTH的整个发射器。这些设置用于使TX buffer解决XCLK和TXUSRCLK域之间的相位差:

  • TXBUF_EN = TRUE
  • TX_XCLK_SEL = TXOUT

绕过Buffer
功能:
绕过TX缓冲区是7系列GTX/GTH收发器的高级功能。TX相位校正电路用于调整PISO并行时钟域与TX XCLK域之间的相位差,将数据从PCS传输到PISO。它还通过不断调整TXUSRCLK来补偿温度和电压变化来执行TX延迟校正。联合TX相位和延迟校正可以由GTX收发器自动执行或由用户手动控制。对于GTH收发器,这个功能必须由用户手动控制。

绕过TX Buffer的工作模式
TX相位校正可以在一个通道(单通道)或共享一个TXOUTCLK(多通道)的一组通道上执行。对于GTX收发器,TX Buffer Bypass 支持 single-lane 自动(Auto)模式和 multi-lane 手动( Manual)模式。

Tx Buffer BypassGTX 收发器GTH 收发器
single-lane自动或手动手动
multi-lane手动手动

因为不常用这里不展开说。具体的配置端口和属性可以看《UG476:7 Series FPGAs GTX/GTH Transceivers》

输入缓冲器与输出功能类似。

//-------------输入/输出缓冲器工作原理-----------------end

两种序列计数器工作原理

//-------------两种序列计数器工作原理-----------------begin

这里以64B/66B编码方式为例,有64B/66B with Int Seq Ctr64B/66B with Ext Seq Ctr 两种模式。

简单介绍: 这是Tx Gearbox的两种操作模式。外部序列计数器(Ext Seq Ctr)工作模式必须在用户逻辑中实现序列计数器。第二种模式使用内部序列计数器(Int Seq Ctr)。GTH收发器不支持内部序列计数器模式。TX变速箱支持2字节、4字节和8字节接口到FPGA逻辑。

外部序列计数器工作模式:

在这里插入图片描述

当gearbox正常工作模式(GEARBOX_MODE[2] = 1’b0)时需要TXSEQUENCE [6:0], TXDATA[63:0], 和 TXHEADER[2:0] 三个输入。用户逻辑需要一个二进制计数器驱动IP核的TXSEQUENCE端口。对于64B/66B编码,计数器从0-32循环计数(值得注意的是这里指的是64/66B,如果64/67B,则是0-66循环计数)。并且把未使用的位TXSQUENCE [6] 和 TXHEADER [2] 置为0。**循环计数的范围与输入位宽无关。**然而,当使用TX_DATA_WIDTH与TX_INT_DATAWIDTH相同的模式(例如,一个4字节的接口(TX_DATA_WIDTH = 32)和一个4字节的内部数据宽度(TX_INT_DATAWIDTH= 1)时,计数器必须每两个TXUSRCLK2周期增加一次。这是因为32位数据位宽每64个数据等待两个周期,所以每两个时钟周期加一。

在TX_DATA_WIDTH和TX_INT_DATAWIDTH相同的模式下,每64个数据有两个TXUSRCLK2周期的数据暂停,在TX_INT_DATAWIDTH是TX_DATA_WIDTH的两倍的模式下,每64个数据有一个TXUSRCLK2周期的数据暂停。

在这里插入图片描述

我们配置为TX_DATA_WIDTH = 32,TX_INT_DATAWIDTH = 1(1倍),所以TXSEQUENCE计数频率为2*TXUSRCLK2,在计数为32时暂停输入(就算输入也会舍弃)。

下面是TX_DATA_WIDTH = 64,TX_INT_DATAWIDTH = 1(1倍)的时序图,我们的工作模式也是类似的,只不过技术频率为两倍:

在这里插入图片描述

外部序列计数器正常工作模式(GEARBOX_MODE[2] = 1’b0)发送64/66 数据时(TX_DATA_WIDTH = 32,TX_INT_DATAWIDTH = 1(1倍))的序列如下:

  1. 应用 GTTXRESET 然后等待复位周期完成。
  2. 在重置期间,对TXSEQUENCE应用6’h00,适当的头数据TXHEADER,初始数据到TXDATA。这种状态可以无限期地保持,直到数据传输准备就绪。
  3. 计数0时,驱动器数据到TXDATA,头信息到TXHEADER。对于一个4字节接口(TX_DATA_WIDTH = 32),驱动第二个4字节到TXDATA,而计数仍然为0。
  4. 当在TXDATA上驱动数据时,序列计数器增量为1。
  5. 应用8字节的数据后,计数器增加到2。TXDATA上的驱动器数据和TXHEADER上的头信息。
  6. 计数32时,停止数据传送。

内部序列计数器工作模式(只有GTX收发器支持):

在这里插入图片描述

当工作与内部序列计数器工作模式时,需要TXSTARTSEQ输入与 TXGEARBOXREADY 输出。以及与数据相关的 TXDATATXHEADER 输入。这个模式没有TXSEQUENCE,除了有一个TXGEARBOXREADY输出外与外部序列计数器模式类似。

TXSTARTSEQ输入指示TX gearbox,当复位后的有效数据的第一个字节。
当在复位条件之后应用有效数据的第一个字节时,TXSTARTSEQ被置为高。TXDATATXHEADER输入必须在复位后保持稳定,TXSTARTSEQ必须保持为低直到数据连续输入。复位完成之后等待第一个有效数据的时间没有规定,可长可短。TXSTARTSEQ在有效数据的前2、4或8字节(也就是指不同位宽的第一个数据)被置为高,在这之前不能拉高。在数据的第一个字节之后,TXSTARTSEQ可以为任意值。

在数据输入完(直到需要暂停的数据个数,32或64个)后,TXGEARBOXREADY在两个或三个TXUSRCLK2周期中被置为低,这取决于TX_DATA_WIDTH和TX_INT_DATAWIDTH,对于TX_DATA_WIDTH是TX_INT_DATAWIDTH的两倍的模式,TXGEARBOXREADY在两个TXUSRCLK2周期后被置为低。对于具有相同TX_DATA_WIDTH和TX_INT_DATAWIDTH的模式,它对三个TXUSRCLK2周期后被置为低。

TXGEARBOXREADY被置为低时,还可以输入一个TXUSRCLK2周期(D_j)的数据,然后就必须停止数据输入。1周期延迟是固定的,不能更改。经过一个延时周期(D_k1)后,数据必须保持到TXGEARBOXREADY变为高(D_k2),然后就可以输入新数据了(D_l)。对于这种操作模式,数据的数量与使用外部序列计数器模式为64B/67B或64B/66B时相同。这里要注意我们的模式是两个周期的延时。

在这里插入图片描述

GTX 收发器 内部序列计数器工作模式传输的序列:

  1. 保持 TXSTARTSEQ 为低电平。
  2. 使能一下GTTXRESET复位然后等待复位周期完成。
  3. TXGEARBOXREADY会被IP核拉高。
  4. 在复位期间,将适当的头数据放在TXHEADER上,初始数据放在TXDATA。这种状态可以无限期地保持以备数据传输。
  5. 拉高TXSTARTSEQ,并将第一个有效的头信息放在TXHEADER上,数据放在TXDATA上。
  6. 继续输入头信息和数据,直到TXGEARBOXREADY被IP核拉低。
  7. TXGEARBOXREADY变为低时,驱动最后的2、4或8字节的数据(也就是最后一个数据)和报头信息。
  8. 基于TX_DATA_WIDTHTX_INT_DATAWIDTH设置,数据保持一个或两个TXUSRCLK2周期的。
  9. 在下一个TXUSRCLK2周期中,驱动TXDATA上的数据输入。TXGEARBOXREADY在前一个的TXUSRCLK2周期上被置为高。

//-------------两种系列计数器工作原理-----------------end

1.4 page4: Comma Alignment and Equalization

在这里插入图片描述

Comma Detection
一些判定分隔符的选项,分隔符也是默认的,其他默认就好。

Optional Ports
我们用不上,所以全部取消勾选,简化端口。

RX Equalization
设置接收端的均衡模式。这里我们选择DFE模式。选择的参考见LPM和DFE模式之间的选择

均衡模式

//-------------均衡模式工作原理-----------------begin
RX 均衡器(DFE和LPM)

功能:
串行链路误码率(bit error rate,BER)性能是发射器、传输媒介和接收器的关系函数。传输媒介或信道是有带宽限制的,通过它的信号受到衰减和失真。

有两种类型的自适应滤波可用于GTX/GTH接收器,这取决于功率和性能之间的系统水平权衡。

GTX/GTH接收器具有低功耗的自适应模式,即低功耗模式(low-power mode,LPM)。

为了均衡损耗更大的信道,可以使用DFE模式。与使用线性均衡器相比,DFE通过提供更接近的滤波器参数调整,可以更好地补偿传输信道损耗。然而,DFE不能删除传输位的前光标( pre-cursor),它只补偿后游标(post cursor)。线性均衡器允许前光标和后光标增益。GTX/GTH RX DFE模式是一种离散时间自适应高通滤波器。DFE的TAP值是自适应算法设置的滤波器系数。

低功耗模式

在这里插入图片描述

DFE模式

在这里插入图片描述

GTX使用的模式

  • LPM和DFE模式之间的选择
    LPM模式推荐用于线路速率高达11.2Gb/s短距离应用,在小于Nyquist频率下信道损耗为12dB或更少。
    DFE模式推荐用于中长距应用,信道大于奈奎斯特频率损耗为为8db以上。DFE具有在不放大噪声和串扰的情况下均衡信道的优点。DFE还可以纠正GTX收发器前5个后游标内信道不连续引起的反射。在单bit响应分析中,当考虑串扰或识别反射时,DFE模式是最好的选择。
    在8B/10B应用程序或不使用数据扰乱(data scrambling)的应用程序中,必须仔细考虑DFE模式。为了更好的适应数据,DFE模式下的自适应要求传入数据是随机的。例如,在XAUI应用程序中,用户有效负载数据是非加密的,并且采用8B/10B编码。虽然用户有效负载通常是随机的,但数据的频率内容在本质上受到编码的限制,而且协议中没有定义防止重复pattern发生的内容。这些重复的pattern会导致自适应算法偏离理想的均衡设置。具有与PRBS7(或更高多项式)相似特征的模式具有足够的随机性,以便于自适应适当地选择正确的均衡设置。对于LPM模式下的8B/10B应用程序,在适应过程中可以使用带或不带置乱的重复pattern(空闲模式)。

  • LPM模式的使用
    GTX LPM和DFE模式采用不同的CTLE模块。此外,GTX收发器有一个基线漂移消除电路。在GTX收发器中,LPM模式下的CTLE和基线漂移消除是完全自适应的,不需要手动调整增益属性设置。
    通过将RXLPMEN端口设置为1’b1来选择LPM模式。

  • DFE模式的使用
    DFE模式利用AGC、CTLE、DFE和基线漂移抵消来均衡信道的影响。
    通过将RXLPMEN端口设置为1’b0来选择DFE模式。
    AGC、DFE和基线漂移消除是自适应的。可以通过断言特定适配环路的HOLD端口来保持适配。

GTX和GTH收发器: LPM和DFE模式之间的运行时切换

在多速率应用程序中,可能需要在LPM(较低的行速率)和DFE(较高的行速率)之间进行切换。应该按照以下步骤在LPM和之间进行切换:

  • 反转RXLPMEN的电流值(RXLPMEN = ~RXLPMEN)。
  • 通过断言RXPMARESET重置接收器的PMA。

//-------------均衡模式工作原理-----------------end

1.5 page5: PCIe,SATA,PRBS

在这里插入图片描述

Optional Ports:
LOOPBACK可以选一下,方便换回测试代码,当数据不通时,可以先选择环回模式来排除代码的问题。

其他全部取消勾选。

环回模式

//-------------环回模式工作原理-----------------begin
功能描述:

环回模式是收发器数据路径的特殊配置,在那里数据流反馈到源。通常,传输一个特定的数据流模式,然后比较检查错误。图2-26展示了四种不同环回模式的环回测试配置。

在这里插入图片描述

环回测试模式分为两大类:

  • 近端(Near-end )环回模式在最靠近数据流发生器的收发器中发送数据。进入和退出近端PMA环回后需要GTRXRESET。
  • 远端(Far-end)环回模式环路接收数据返回到链路的远端收发器。

环回测试可用于在开发期间或部署的器件中进行故障隔离排查。所使用的数据流模式可以是应用程序数据流模式,也可以是专门的伪随机比特序列。每个GTX/GTH收发器有一个内置的PRBS发生器和检查器。
每个GTX/GTH收发器都有几个环回模式,以方便测试:

  1. Near-End PCS 环回
    必须启用RX elastic buffer ,并且为了近端pcs环回功能正常RX_XCLK_SEL必须设置为RXREC。而在近端pcs环回,RX XCLK域由TX PMA并行时钟(TX XCLK)驱动。如果RXOUTCLK用于FPGA逻辑时钟,正常运行时RXOUTCLKSEL设置为RXOUTCLKPMA,当将GTX/GTH收发器放入近端PCS环回时,必须更改以下其中一项:

    • 设置RXOUTCLKSEL选择RXOUTCLKPCS
    • 设置RXCDRHOLD = 1’b1
  2. Near-End PMA 环回
    进出近端PMA环回后需要GTRXRESET。

  3. Far-End PMA 环回
    Far-End的TX buffer必须启用,为了PMA环回功能正常TX_XCLK_SEL必须设置为TXOUT 。而在远端PMA环回,TX buffer的写端是由RX PMA并行时钟(RX XCLK)驱动。必须通过将TXPIPPMEN端口设置为1’b0和TXPIPPMSEL端口设置为1’b0来禁用TX相位内插器PPM控制器。进入和退出Far-End PMA 环回后需要GTTXRESET。

  4. Far-End PCS 换回
    如果不使用时钟校正,远端PCS环回中的收发器必须使用作为环回数据源的收发器所使用的相同的参考时钟。无论是否使用时钟校正,TXUSRCLK端口和RXUSRCLK端口必须由相同的时钟资源(BUFG、BUFR或BUFH)驱动。 gearbox在收或发通道是启用的时不支持远端PCS环回。

配置方法:

在这里插入图片描述

//-------------环回模式工作原理-----------------end

1.6 page6: CB and CC Sequence

在这里插入图片描述

Clock Correction
这里我们勾选Use Clock Corrrection, 然后设置序列长度为4并设置具体序列。

PPM Offeset +/-这个的含义是发送时钟和接收时钟之间的PPM偏差。默认就好。

接收时钟校正

//-------------接收时钟校正工作原理-----------------begin

首先看看接收主要模块及时钟域:
在这里插入图片描述

功能:
RX elastic buffer被设计成在两个不同的时钟域RXUSRCLK和XCLK之间的桥,从CDR(时钟数据恢复,RX clock data recovery)恢复的时钟。即使是RXUSRCLK和XCLK在相同的时钟频率下运行,总是有很小的频率差。因为XCLK和RXUSRCLK并不完全相同,除非对其进行纠正,否则会累积差异导致RX elastic buffer最终溢出或下溢。为了允许校正,每个GTX/GTH收发器TX定期发送一个或多个特殊字符,允许GTX/GTH收发器RX删除或复制这些特殊字符。通过在RX elastic buffer过满时删除字符,在RX elastic buffer过空时复制字符,可以防止overflow或 underflow 。

在这里插入图片描述

使用时钟校正

  1. 使能Clock Correction
    每个GTX/GTH收发器包括一个时钟校正电路,通过控制RX弹性缓冲器的指针来执行时钟校正。要使用时钟校正,RXBUF_EN设置为TRUE以打开RX弹性缓冲区,CLK_CORRECT_USE设置为TRUE以打开时钟校正电路。
    当RX弹性缓冲延迟过高或过低时触发时钟校正,时钟校正电路检测到匹配序列。要使用时钟校正,必须配置时钟校正电路来设置这些项:

    • RX elastic buffer范围。
    • Clock correction序列。
  2. 设置RX elastic buffer范围
    RX弹性缓冲区限制使用CLK_COR_MIN_LAT(最小延迟)和CLK_COR_MAX_LAT(最大延迟)。当RX弹性缓冲区中的字节数下降到CLK_COR_MIN_LAT以下时,时钟校正电路写一个额外的CLK_COR_SEQ_LEN字节,来自它匹配的第一个时钟校正序列,以防止缓冲区underflow。类似地,当RX弹性缓冲区中的字节数超过时CLK_COR_MAX_LAT,时钟校正电路从它匹配的第一个时钟校正序列中删除CLK_COR_SEQ_LEN字节,从序列的第一个字节开始。 7系列fpga收发器向导选择最佳设置CLK_COR_MIN_LAT和CLK_COR_MAX_LAT。所以不需要自己设。

    因为CLK_COR_MIN_LAT用于设置初始RX弹性缓冲区延迟,它必须被ALIGN_COMMA_WORD设置整除,以保持通过弹性缓冲区的comma对齐。CLK_COR_MIN_LAT的值必须符合RX_INT_DATAWIDTH和ALIGN_COMMA_WORD参数如表所示。

在这里插入图片描述

  1. 设置Clock correction序列
    时钟校正序列使用CLK_COR_SEQ_1_* 属性(对应IP核配置中的具体序列值)和 CLK_COR_SEQ_LEN 设置(对应IP核配置中的 Sequence length 选项 )。每个 CLK_COR_SEQ_1_* 属性对应一个时钟校正序列1中的子序列。CLK_COR_SEQ_LEN用于设置要匹配的子序列数量。如果使用40位或20位的内部数据路径,则时钟校正电路匹配每个子序列的所有10位。如果使用16位或32位内部数据路径,则只使用每个子序列最右边的8位。
    可通过设置激活交替时钟修正序列CLK_COR_SEQ_2_USE为TRUE。对应IP核设置的Use Two Clock Correction Sequences选项。第一个和第二个序列共享长度设置。第一和第二序列使用不同的子序列值进行匹配。设置CLK_COR_SEQ_2_*属性来定义第二个序列的子序列值。
    当使用8B/10B解码(RX8B10BEN为高)时,设置CBCC_DATA_SOURCE_SEL为 DECODED 以搜索8B/10B解码器的输出来寻找序列匹配,而不是非解码数据。这允许电路寻找具有正或负视差的8位值,并将K字符与普通字符区分开来。当CBCC_DATA_SOURCE_SEL设置为DECODED,以“RX8B10BEN”为“High”为例进行时钟修正字节的设置。序列必须与传入的原始数据完全匹配。当RX_DISPERR_SEQ_MATCH设置为FALSE时,CLK_COR_SEQ_x_y[9]不用于匹配。

在这里插入图片描述

这里我们没用8B/10B解码,不关注。  

一些协议使用不关心子序列的时钟校正序列。时钟校正电路可编程识别这些序列使用CLK_COR_SEQ_1_ENABLE CLK_COR_SEQ_2_ENABLE。当序列的启用位为Low时,无论值是什么,该字节都被认为匹配。时钟修正序列与时钟修正序列使能位的对应关系如图4-52所示。  

在这里插入图片描述

时钟校正选项
CLK_COR_REPEAT_WAIT用于控制时钟校正频率(对应IP核配置中的 Periodicity of CC Sequence(bytes) 选项)。这个值被设置为时钟校正事件之间所需的最小RXUSRCLK周期数。此属性设置为0以允许在任何时间进行时钟校正。一些协议允许在任何时间进行时钟校正,但要求如果时钟校正电路删除序列,至少有一个序列保留在流中。对于有此要求的协议,CLK_COR_KEEP_IDLE设置为TRUE。

//-------------接收时钟校正工作原理-----------------end

1.7 Summary

在这里插入图片描述

最后,我们可以稍微核验一下设置对不对。
比如TXUSRCLK(2)=312.5MHz,我们设置的外部数据位宽为32位。内部位宽为1倍,则内部时钟 TXUSRCLK = (line Rate) / (internal Data Width) = 10G / 32 = 312.5M。 外部时钟 TXUSRCLK2 = (line Rate) / (External Data Width) = 10G / 32 = 312.5M。接收同理。

2 使用IP核

2.1 打开例程

这个IP核需要一些我们设置的外部共享资源以及比较复杂的复位等逻辑所以一般在例程的基础上进行开发。

打开例程:

在这里插入图片描述

例程的文件结构:

在这里插入图片描述

每个文件的功能见【vivado PG学习】1 PG168:7 Series FPGAs Transceivers官方配置方法学习笔记的5.3 节 例程文件结构。

2.2 使用例程

GTX的位置首先要改一下系统时钟的约束:

在这里插入图片描述

可以看到这里对GTX的位置和参考时钟进行了约束,由于GTX的位置与对应引脚有映射关系,所以不需要再对RXN(P)_INTXN(P)_OUT端口进行引脚绑定。

我们要改的就是根据自己配置的参考时钟来源更改DRP_CLK_IN_P(N)的约束。默认是KC705 demo板的约束。这里我的参考时钟是外部25MHz单端输入,所以接到DRP_CLK_IN_P,然后时钟周期改成create_clock -name drpclk_in_i -period 40.0 [get_ports DRP_CLK_IN_P] 就行。如果选的是外部MMCM或PLL输出的时钟,则把引脚绑定删除即可。

这里以仿真来说明例程的应用。

顶层gtwizard_0_exdes模块有一些属性需要注意一下:

  • EXAMPLE_SIM_GTRESET_SPEEDUP: 如果是仿真设为“TRUE”,如果是实际应用设为“FALSE”。
  • STABLE_CLOCK_PERIOD: 系统参考时钟,即DRP_CLK_IN_P的周期。

还有一个注意点就是发送的数据gt0_txdata_i要经过扰码模块scrambler_0_i产生扰码gt0_scrambled_data_i
接收的数据gt0_rxdata_i要经过解扰码模块descrambler_0_i恢复成数据gt0_unscrambled_data_i
所以我们抓信号的时候要注意再抓一下解扰码后的数据,不然不好判断数据是否正常。

2.2.1 发送时序

我们选择的工作模式是:64B/66B with Int Seq Ctr,前面大概介绍过这种工作模式的序列输入。这里做补充说明。别看模块有很多端口,但是大部分是一些监测或控制端口,实际简单的收发应用时,重点关注仿真中列出来的几根信号就行。

仿真结果:

在这里插入图片描述

  1. 复位

首先我们可以看到有两个复位信号gt0_txfsmresetdone_igt0_txresetdone_i:

  • gt0_txfsmresetdone_i : 对应复位状态机完成复位的信号。
  • gt0_txresetdone_i : 底层的GTXE2_CHANNEL模块的输出。下面的分析可以看到gt0_txresetdone_i是给了复位状态机的。应该对应的是复位状态机中的TXPMARESETTXPCSRESET复位完成的信号。

所以也对应了时序中gt0_txresetdone_i先完成复位,然后复位状态机gt0_txfsmresetdone_i才完成复位。

TX初始化和复位

//-------------TX初始化和复位原理-----------------begin

复位的状态机:

在这里插入图片描述

展开IP核,可以看到:

在这里插入图片描述

其中gtwizard_0_init_i模块中有tx复位状态机的模块例化:

gtwizard_0_TX_STARTUP_FSM #
          (
           .EXAMPLE_SIMULATION       (EXAMPLE_SIMULATION),
           .STABLE_CLOCK_PERIOD      (STABLE_CLOCK_PERIOD),           // Period of the stable clock driving this state-machine, unit is [ns]
           .RETRY_COUNTER_BITWIDTH   (8), 
           .TX_QPLL_USED             ("TRUE"),                        // the TX and RX Reset FSMs must 
           .RX_QPLL_USED             ("TRUE"),                        // share these two generic values
           .PHASE_ALIGNMENT_MANUAL   ("FALSE")               // Decision if a manual phase-alignment is necessary or the automatic 
                                                                     // is enough. For single-lane applications the automatic alignment is 
                                                                     // sufficient              
             ) 
gt0_txresetfsm_i      
            ( 
        .STABLE_CLOCK                   (sysclk_in),
        .TXUSERCLK                      (gt0_txusrclk_in),
        .SOFT_RESET                     (soft_reset_tx_in),
        .QPLLREFCLKLOST                 (gt0_qpllrefclklost_in),
        .CPLLREFCLKLOST                 (tied_to_ground_i),
        .QPLLLOCK                       (gt0_qplllock_in),
        .CPLLLOCK                       (tied_to_vcc_i),
        .TXRESETDONE                    (gt0_txresetdone_i),
        .MMCM_LOCK                      (tied_to_vcc_i),
        .GTTXRESET                      (gt0_gttxreset_t),
        .MMCM_RESET                     (),
        .QPLL_RESET                     (gt0_qpllreset_t),
        .CPLL_RESET                     (),
        .TX_FSM_RESET_DONE              (gt0_tx_fsm_reset_done_out),
        .TXUSERRDY                      (gt0_txuserrdy_t),
        .RUN_PHALIGNMENT                (),
        .RESET_PHALIGNMENT              (),
        .PHALIGNMENT_DONE               (tied_to_vcc_i),
        .RETRY_COUNTER                  ()
           );

//-------------TX初始化和复位原理-----------------end

  1. 发送数据

在这里插入图片描述

可以看到当PMA和PCS复位gt0_txresetdone_i完成后, gearbox的ready信号gt0_txgearboxready_i就已经拉高了, 但这个时候还不能给数据,因为复位状态机还没有完成复位。
等复位状态机复位gt0_txfsmresetdone_i完成, 并且第一个数据gt0_scrambled_data_i和控制位gt0_txheader_r已经稳定后,就可以把gt0_txstartseq_r拉高,这代表序列的第一个数据,是为了给我们使用模块时同步用的。

可以看到gt0_txstartseq_r拉高的204.8ns后,也就是64个数据之后,gt0_txgearboxready_i变为低,此时等待两个时钟周期。然后继续给数据。时序与上面64B/66B with Int Seq Ctr工作模式原理介绍的一致。每64个数据等待两个时钟周期。

这里要注意要发送的数据gt0_txdata_i要先经过一个加扰码的模块产生扰码gt0_scrambled_data_i

2.2.2 接收时序

接收时序比较简单。

在这里插入图片描述

可以注意一下这个gt0_rxheader_i, 可以看到RX gearbox的工作数据流:

在这里插入图片描述

可以看到每间隔一个才是真正的Header数据,所以它的有效信号gt0_rxdatavalid_i也是间隔一位的。可以看到解扰码后的数据gt0_unscrambled_data_i与发送的Header也是对应的。

  • 25
    点赞
  • 219
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lu-ming.xyz

觉得有用的话点个赞吧 :)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值