第19章 高速串行收发器:GTP/GTX原语介绍、眼图测试、回环测试、误码率分析
各位同学,今天我们来聊聊FPGA里最让人兴奋、也最容易让人头疼的部分——高速串行收发器。说白了,就是那些动不动跑几Gbps的SerDes接口。紫光同创的Pango系列里,对应的就是GTP和GTX这类硬核。
我记得刚入行那会儿,第一次调高速串行口,板子一上电,示波器上全是毛刺,啥也看不清。后来才明白,这玩意儿不是你想让它跑多快就能跑多快的。今天我就把这些年踩过的坑、总结的经验,一股脑儿倒给你们。
19.1 GTP/GTX原语:你得先认识它
紫光同创的GTP/GTX,本质上是一个高速串行收发器硬核。你不需要自己写PLL、CDR、串化器、解串器——这些都已经封装好了。你要做的,就是通过原语把它例化出来。
我个人习惯,先把原语的端口搞清楚。GTP/GTX的核心端口就那么几类:
- 时钟类:参考时钟、恢复时钟、TX/RX用户时钟
- 数据类:并行数据总线(通常是8位、16位、32位)
- 控制类:复位、使能、极性翻转、环回控制
- 状态类:锁定指示、失锁告警、误码指示
举个例子,一个最简单的GTP发送端原语调用,大概长这样:
GTP_TX #(
.DATA_WIDTH(16),
.TX_POLARITY(0),
.TX_DIFF_SWING(4'b1000)
) u_gtp_tx (
.tx_clk(tx_clk),
.tx_rst(tx_rst),
.tx_data(tx_data_in),
.tx_p(tx_p),
.tx_n(tx_n),
.tx_ready(tx_ready)
);
嗯,这里要注意:tx_ready信号一定要等它拉高再送数据。我曾经有个项目,就是没等这个信号,结果前几个字节全丢了,查了两天才发现。
关键点:GTP/GTX的初始化顺序很重要。先给参考时钟,再释放复位,等PLL锁定,最后等收发器就绪。顺序错了,轻则锁不住,重则烧片子。
19.2 眼图测试:看波形就知道信号好不好
眼图,说白了就是把一串随机比特叠在一起看。眼睛睁得越大,信号质量越好。眼睛眯成一条缝,那基本就是废了。
测试眼图需要示波器,而且得是带宽够的示波器。比如你跑5Gbps,示波器带宽至少得5GHz,最好10GHz以上。我见过有人拿200MHz的示波器看眼图,那画面……嗯,不提了。
眼图主要看几个指标:
| 指标 | 含义 | 经验值 |
|---|---|---|
| 眼高 | 信号幅度的裕量 | ≥ 200mV |
| 眼宽 | 采样时刻的裕量 | ≥ 0.6 UI |
| 抖动 | 边沿的不确定性 | ≤ 0.2 UI |
| 交叉点 | 差分信号的交叉位置 | 50% ± 5% |
你想想看,如果眼高只有100mV,稍微有点噪声,数据就判错了。我在项目中遇到过,板子布局布线没做好,眼图直接塌了,后来加了预加重才救回来。
小技巧:紫光同创的调试工具里,其实内置了眼图扫描功能。不需要示波器,通过内部CDR的相位调整,也能大致看出眼图轮廓。虽然精度不如示波器,但调试初期够用了。
19.3 回环测试:最简单的自检方法
回环测试,就是把发送端和接收端连起来,自己发自己收。这是验证高速串行链路最基础、最有效的方法。
紫光同创的GTP/GTX支持三种回环模式:
- 近端回环(Near-End Loopback):在芯片内部,TX直接环回到RX。用于验证收发器本身是否工作正常。
- 远端回环(Far-End Loopback):在连接器或对端设备处,把RX环回到TX。用于验证整个链路。
- 串行回环(Serial Loopback):在串行线上做环回。这个用得少,一般调试时才用。
我建议你们先从近端回环开始。代码里设置一个寄存器,把回环模式配好,然后发一个已知的伪随机序列(比如PRBS7或PRBS15),看收回来的是不是一模一样。
// 配置近端回环
GTP_CTRL u_ctrl (
.loopback_mode(2'b01), // 01: 近端回环
.prbs_gen_en(1'b1),
.prbs_type(3'b001) // PRBS7
);
如果近端回环都过不了,那肯定是收发器配置有问题。别急着查板子,先查代码。
警告:回环测试时,一定要确保发送端和接收端的速率匹配。我曾经犯过一个低级错误——TX跑5Gbps,RX配成2.5Gbps,结果回环测试怎么都过不了,还以为是芯片坏了。
19.4 误码率分析:数据到底丢没丢
误码率(BER),是衡量高速链路质量的最终指标。一般要求BER ≤ 10^-12,也就是一万亿个比特里最多错一个。
怎么测?两种方法:
- PRBS测试:发伪随机序列,收端用同样的多项式做校验。这是最常用的方法。
- 用户数据测试:发已知的固定数据或递增数据,收端比对。适合功能验证。
我个人更推荐PRBS测试。为什么呢?因为PRBS序列的频谱特性接近真实数据,能更真实地反映链路性能。
紫光同创的GTP/GTX内部自带PRBS发生器和校验器。你只需要使能它,然后读误码计数器就行了:
// 读取误码计数
reg [31:0] ber_count;
always @(posedge rx_clk) begin
if (ber_clr)
ber_count <= 32'd0;
else if (ber_error)
ber_count <= ber_count + 1'b1;
end
测误码率有个坑——测试时间要够长。比如你要测10^-12的误码率,至少得发10^12个比特。以5Gbps算,大概需要200秒。我见过有人测了1秒钟就说误码率为0,那根本不准。
经验之谈:实际项目中,我一般会连续测24小时。如果24小时内误码率达标,基本可以放心。如果偶尔出现零星误码,可能是电源噪声或温度漂移引起的,需要进一步排查。
19.5 实战中的那些坑
最后,我总结几个高频踩坑点,你们记一下:
- 参考时钟的抖动:GTP/GTX对参考时钟的抖动非常敏感。我曾经用了一个普通的晶振,结果眼图一直不好。换成低抖动晶振后,问题迎刃而解。
- PCB走线:高速差分线要等长、要阻抗匹配、要远离其他信号。别问我怎么知道的——我有一块板子就是因为差分线间距没控制好,串扰严重,误码率死活降不下来。
- 电源去耦:GTP/GTX的模拟电源和数字电源要分开。每个电源引脚旁边都要放去耦电容,而且电容要尽量靠近引脚。
- 温度影响:高速收发器发热量大,温度高了,性能会下降。散热要做好,必要时加风扇。
好了,这一章的内容就这么多。高速串行收发器这东西,理论是一回事,实践是另一回事。你们回去之后,一定要亲手搭一个回环测试,看看眼图,算算误码率。只有亲手调过,才能真正理解。
下一章,我们会讲DDR3/DDR4控制器接口的设计与调试。那又是一个大坑,到时候我再给你们细说。