收发器初始化与复位:复位序列详解、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为例):
- 拉高所有复位信号(GTTX_RESET、GTRX_RESET、QPLL_RESET)
- 释放QPLL_RESET,等待QPLL_LOCK拉高
- 释放GTTX_RESET,等待TX_FSM_RESET_DONE拉高
- 释放GTRX_RESET,等待RX_FSM_RESET_DONE拉高
你想想看,如果顺序反了,PLL还没锁,TX就开始往外发数据,那数据能对吗?
二、TX初始化流程:从复位到正常发数
TX的初始化,核心就是让发送端的PMA和PCS都进入正常工作状态。我一般把它拆成几步:
- 复位TX路径:拉高GTTX_RESET,保持至少几个时钟周期。
- 等待PLL锁定:检查QPLL_LOCK或CPLL_LOCK是否为高。如果PLL没锁,TX初始化就别想了。
- 释放TX复位:拉低GTTX_RESET,内部状态机开始自动初始化。
- 等待TX初始化完成:检查TX_FSM_RESET_DONE信号。这个信号拉高,说明TX的PMA和PCS都准备好了。
- 发送K码或同步序列:如果用的是8B/10B或64B/66B编码,需要先发送几个同步码,让接收端对齐。
我记得有一次,TX_FSM_RESET_DONE一直不拉高,查了半天发现是参考时钟没给对。所以调试的时候,先确认时钟有没有,再查复位。
小技巧: 我习惯在FPGA逻辑里加一个状态机,专门管理复位流程。每个步骤完成后,记录一个状态寄存器。这样调试时读一下寄存器,就知道卡在哪一步了。
三、RX初始化流程:对齐与锁定
RX的初始化比TX复杂一些,因为它需要从接收到的数据流里找到对齐标记。说白了,RX得先知道“数据从哪里开始”。
RX初始化的关键步骤:
- 复位RX路径:拉高GTRX_RESET。
- 等待PLL锁定:同样,先确认PLL锁住了。
- 释放RX复位:拉低GTRX_RESET,RX内部状态机开始工作。
- 等待RX初始化完成:检查RX_FSM_RESET_DONE。
- 等待CDR锁定:CDR(时钟数据恢复)需要从数据里提取时钟。如果CDR没锁,数据根本采不对。
- 等待字对齐:RX会搜索特定的对齐码(比如K28.5),找到后调整字节边界。
- 等待通道绑定:如果是多通道,还需要做通道间对齐。
我曾经遇到一个坑: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刚锁定还不稳定的情况。
五、一张图看懂初始化流程
下面这张图,是我自己总结的收发器初始化流程。你调试的时候可以对照着看,卡在哪一步一目了然。
这张图里,最关键的就是那个判断框——PLL锁定了吗?如果没锁,别急着往下走,先查原因。我见过不少工程师,PLL没锁就往下复位TX,结果折腾半天发现是时钟没给。
六、避坑指南
最后,分享几个我踩过的坑:
- 复位信号不要用组合逻辑产生:我曾经用了一个组合逻辑的复位信号,结果毛刺导致PLL误复位。后来改成寄存器同步输出,问题解决。
- 等待时间要留余量:IP核手册上写的锁定时间是最小值,实际可能更长。我一般会在手册值的基础上加50%的余量。
- 多通道时注意同步:如果多个通道共享一个QPLL,所有通道的复位要同步进行,否则通道间会有相位差。
- 热复位和冷复位不一样:上电复位(冷复位)需要等电源稳定,而运行中的复位(热复位)可以快一些。我习惯在代码里区分这两种情况。
我的调试口诀: 先时钟,后PLL;先锁定,再通道;先TX,后RX;一步一步来,别急。
好了,关于收发器的初始化与复位,今天就聊到这里。这些内容看起来简单,但实际调试中很容易出问题。希望我的经验能帮你少走一些弯路。
可可精品资料库