收发器初始化与复位:复位序列详解、TX/RX初始化流程、QPLL/CPLL锁定机制

各位好,今天我们来聊聊高速收发器里最基础、也最容易翻车的一个环节——初始化与复位。

说实话,我刚开始接触收发器的时候,觉得复位嘛,不就是拉高拉低几个信号?结果第一次调板子,QPLL死活锁不住,TX输出全是乱码。后来才发现,复位顺序搞反了。嗯,从那以后,我对复位序列就特别上心。

一、复位序列:先谁后谁,有讲究

收发器的复位,说白了就是让内部所有状态机回到一个已知的初始状态。但你不能一股脑全复位,得按顺序来。

我个人习惯把复位分成三个层级:

  • 顶层复位:复位整个收发器通道,包括PLL、TX、RX所有模块。一般上电后先做一次。
  • PLL复位:单独复位QPLL或CPLL。如果你改了参考时钟或者分频比,需要重新复位PLL。
  • 通道复位:复位TX或RX的数据通路。比如你发现误码率高了,可以单独复位RX路径,不用动PLL。

我在项目中遇到过一个问题:复位PLL的时候,没有等它锁定就去复位TX路径。结果TX路径复位完了,PLL还没锁住,数据直接送出去全是错的。所以顺序很重要:先复位PLL,等锁定,再复位TX/RX通道。

标准复位序列(以Xilinx GTY为例):

  1. 拉高所有复位信号(GTTX_RESET、GTRX_RESET、QPLL_RESET)
  2. 释放QPLL_RESET,等待QPLL_LOCK拉高
  3. 释放GTTX_RESET,等待TX_FSM_RESET_DONE拉高
  4. 释放GTRX_RESET,等待RX_FSM_RESET_DONE拉高

你想想看,如果顺序反了,PLL还没锁,TX就开始往外发数据,那数据能对吗?

二、TX初始化流程:从复位到正常发数

TX的初始化,核心就是让发送端的PMA和PCS都进入正常工作状态。我一般把它拆成几步:

  1. 复位TX路径:拉高GTTX_RESET,保持至少几个时钟周期。
  2. 等待PLL锁定:检查QPLL_LOCK或CPLL_LOCK是否为高。如果PLL没锁,TX初始化就别想了。
  3. 释放TX复位:拉低GTTX_RESET,内部状态机开始自动初始化。
  4. 等待TX初始化完成:检查TX_FSM_RESET_DONE信号。这个信号拉高,说明TX的PMA和PCS都准备好了。
  5. 发送K码或同步序列:如果用的是8B/10B或64B/66B编码,需要先发送几个同步码,让接收端对齐。

我记得有一次,TX_FSM_RESET_DONE一直不拉高,查了半天发现是参考时钟没给对。所以调试的时候,先确认时钟有没有,再查复位。

小技巧: 我习惯在FPGA逻辑里加一个状态机,专门管理复位流程。每个步骤完成后,记录一个状态寄存器。这样调试时读一下寄存器,就知道卡在哪一步了。

三、RX初始化流程:对齐与锁定

RX的初始化比TX复杂一些,因为它需要从接收到的数据流里找到对齐标记。说白了,RX得先知道“数据从哪里开始”。

RX初始化的关键步骤:

  1. 复位RX路径:拉高GTRX_RESET。
  2. 等待PLL锁定:同样,先确认PLL锁住了。
  3. 释放RX复位:拉低GTRX_RESET,RX内部状态机开始工作。
  4. 等待RX初始化完成:检查RX_FSM_RESET_DONE。
  5. 等待CDR锁定:CDR(时钟数据恢复)需要从数据里提取时钟。如果CDR没锁,数据根本采不对。
  6. 等待字对齐:RX会搜索特定的对齐码(比如K28.5),找到后调整字节边界。
  7. 等待通道绑定:如果是多通道,还需要做通道间对齐。

我曾经遇到一个坑:RX初始化完成后,数据偶尔会错位。后来发现是CDR锁定时间不够,数据还没稳定就开始做字对齐了。解决方案很简单——在CDR锁定后加一个固定的延时,等数据稳定了再开始对齐。

注意: RX初始化失败最常见的原因有两个:一是对端TX没发数据,二是参考时钟抖动太大。调试时先用示波器看看时钟质量,别一上来就改代码。

四、QPLL与CPLL锁定机制:锁不住怎么办?

PLL锁定,说白了就是让输出时钟的频率和相位与参考时钟保持一致。QPLL和CPLL的区别,我简单说一下:

特性 QPLL CPLL
适用场景 多通道共享,高速率(>10Gbps) 单通道,中低速率(<10Gbps)
锁定时间 较长(几百微秒到几毫秒) 较短(几十微秒)
抖动性能 更好 一般
复位方式 QPLL_RESET CPLL_RESET

PLL锁定的过程,其实是内部的一个反馈环路在调整VCO(压控振荡器)的频率。当频率误差小于一定范围,并且相位也锁定后,LOCK信号就会拉高。

为什么会锁不住?我总结了几种常见情况:

  • 参考时钟不对:频率、幅度、抖动超标。我遇到过用普通晶振给25G收发器供参考时钟,结果PLL根本锁不住。
  • 电源噪声太大:PLL对电源很敏感,尤其是VCO的供电。如果电源纹波大,VCO频率会跟着抖。
  • 复位时间不够:PLL复位后需要一定时间才能稳定。有些IP核要求复位至少保持10微秒。
  • 分频比设置错误:比如你要的线速率是10.3125Gbps,但分频比算错了,PLL输出频率不对。

调试PLL锁定的实用方法:

  • 先确认参考时钟有没有,用示波器看波形。
  • 读PLL的状态寄存器,看看是频率没锁定还是相位没锁定。
  • 如果锁不住,试着降低线速率,看看是不是频率太高了。
  • 检查电源纹波,尤其是1.0V和1.8V供电。

我个人习惯在PLL锁定后,再等一个固定的延时(比如100微秒),然后再开始TX/RX的初始化。这样能避免PLL刚锁定还不稳定的情况。

五、一张图看懂初始化流程

下面这张图,是我自己总结的收发器初始化流程。你调试的时候可以对照着看,卡在哪一步一目了然。

收发器初始化与复位流程图 上电或复位开始 1. 拉高所有复位信号(PLL + TX + RX) 2. 释放PLL复位,等待锁定 PLL锁定? 否 是 3. 释放TX复位,等待TX初始化完成 4. 释放RX复位,等待RX初始化完成 初始化完成,正常收发 操作步骤 判断条件 完成状态 失败重试路径

这张图里,最关键的就是那个判断框——PLL锁定了吗?如果没锁,别急着往下走,先查原因。我见过不少工程师,PLL没锁就往下复位TX,结果折腾半天发现是时钟没给。

六、避坑指南

最后,分享几个我踩过的坑:

  • 复位信号不要用组合逻辑产生:我曾经用了一个组合逻辑的复位信号,结果毛刺导致PLL误复位。后来改成寄存器同步输出,问题解决。
  • 等待时间要留余量:IP核手册上写的锁定时间是最小值,实际可能更长。我一般会在手册值的基础上加50%的余量。
  • 多通道时注意同步:如果多个通道共享一个QPLL,所有通道的复位要同步进行,否则通道间会有相位差。
  • 热复位和冷复位不一样:上电复位(冷复位)需要等电源稳定,而运行中的复位(热复位)可以快一些。我习惯在代码里区分这两种情况。

我的调试口诀: 先时钟,后PLL;先锁定,再通道;先TX,后RX;一步一步来,别急。

好了,关于收发器的初始化与复位,今天就聊到这里。这些内容看起来简单,但实际调试中很容易出问题。希望我的经验能帮你少走一些弯路。

可可精品资料库