☰
DisplayPort接口硬件设计:AUX链路训练、预增强均衡与眼图调试
2026/11/3 23:11:47 网站建设 项目流程

简介:面向视频处理与高速显示接口学习的DP技术文档,适合硬件工程师、PCB Layout人员及显示接口入门者系统梳理DisplayPort知识。内容从接口简介、标准与Mini-DP分类切入,梳理DP 1.0至2.0各版本带宽、MST、DSC、HDR等特性差异,并延伸到显示接口概述、数据包化传输原理、输出与接收端电路设计,以及眼图、I2C等测试要点,兼顾原理理解与原理图、PCB Layout参考。压缩包共1个docx文件,约1.93MB,按章节编排,便于按主题查阅和整理笔记。已有5737人学习,对接口选型、版本辨析和设计排错具有参考价值。

1. 一块 4K 输出板卡在评审会上:DP 接口为什么值得单独整理

硬件评审会上,一块带 4K 输出的板子卡住了:FPGA 的 DP 接口模块跑起来了,SerDes 也有波形,接上显示器却是一片黑。示波器量主链路差分对,眼图是开的;最后抓 AUX 才发现,辅助通道少了一组上拉,链路训练根本没有启动。这种问题的尴尬在于,它既不在协议文档里,也不在代码里,而在原理图某根线上。

这份 DP 接口资料就是为这类场景整理的:从 2006 年 DisplayPort 发布时的报文化设计、版本迭代到 2.0 的 80 Gbps,再落到预增强与均衡芯片的输入、输出两种用法,最后是眼图与 I2C 的测试方法。它更像一份可以被逐条对照的原理图与 PCB layout 汇总,做视频处理前端、多屏输出、显示模组或者板卡类项目的硬件工程师,基本能照着抄进自己的设计里。

2. DP 协议栈拆解:四条主链路、一条 AUX 与握手六步的分工

DP 和 HDMI 在用户视角差不多,但在板级视角差别很大。HDMI 有独立的 TMDS 时钟对,DP 没有——时钟从数据流里恢复出来,所以对走线等长、阻抗和抖动更敏感;HDMI 的 DDC 是一条相对简单的 I2C,而 DP 的 AUX 是一条双向半双工差分通道,不仅要读 EDID,还要读写 DPCD 寄存器、协商链路速率和电压摆幅。理解这个差异,才能解释为什么很多板子“线接对了但不亮”。

2.1 主链路、AUX 与 HPD:三条通道各自的职责边界

主链路是单向、高带宽、低延迟的信道,用来传未压缩的视频和音频。它由 1、2 或 4 对交流耦合、双端接的差分对组成,每一对叫一条 lane。每条 lane 自定时运行,原始码率可以是 1.62、2.7、5.4 Gbit/s,后来加到 8.1 Gbit/s,2.0 时代又引入 UHBR 的 10、13.5、20 Gbit/s。数据按 8b/10b 编码,也就是每 8 位消息编进 10 个符号,所以每条 lane 解码后的有效速率只有原始值的 80%:1.296、2.16、4.32 Gbit/s。所有使能的 lane 必须跑同一速率,链路的速率和像素时钟是解耦的,像素时钟靠 Mvid、Nvid 两个时间戳从链路符号时钟里重新生成。没有专门的时钟通道,时钟从数据流里提取,这一点直接决定了后面 layout 的很多约束。

AUX 通道是一条独立的双向半双工差分线,交流耦合,单一方向速率约 1 Mbit/s。它承担的是设定与控制:读 EDID 确认显示器能力、读 DPCD 知道对端支持几条 lane 和多高速率、写各种显示配置寄存器、读接收端状态寄存器。早期版本用 Manchester II 编码,1.2 之后换成 8b/10b,最大带宽从 2 Mbps 提到 720 Mbps。AUX 是握手的地基,AUX 不通,主链路再漂亮也不会出图。

HPD 是接收端指向源端的信号,三个作用:一是设备存在检测,接 3.3V 或拉高表示 sink 插入,拉低超过 2 ms 表示设备移除;二是中断请求,拉低 0.5 ms 到 1 ms 表示 sink 有事要说,源端再去通过 AUX 读 DPCD 里的 IRQ 向量寄存器判断中断类型;三是配合连接器上的电源引脚,按协议这路电源要支持 5V/0.5A,给本地设备供电。另外 DP 信号本身不兼容 DVI 和 HDMI,所谓双模 DP 是借外部无源转接头输出单链路 DVI 或 HDMI 1.2/1.4,靠转接头把 LVDS 电平转成 TMDS;VGA 和双链路 DVI 必须用有源转接,这一点在做兼容性宣称时容易说错。

2.2 从插上到出图:六步前置流程的顺序不能乱

设备插入后,DP 要走的不是一条命令,而是一串有严格先后顺序的事务,全部发生在 AUX 通道上:热插拔检测、读 DPCD、读 EDID、链路训练、发送 MSA、开始数据传输。顺序错了,后面的步骤拿到的就是脏数据。

第一步热插拔,HPD 被拉高,源端知道有新设备接入,开始发起 AUX 事务。第二步读 DPCD,源端向接收端要一份能力清单,内容包括 lane 数量、支持的最高链路速率、电压摆幅、预加重、均衡能力和时钟恢复参数。这一步决定了源端“能开多大”,也是链路训练前必须拿到的输入。第三步读 EDID,拿到的是显示器侧的信息:制造商、EDID 版本、屏幕尺寸、支持的色彩空间、支持的分辨率列表、原生分辨率和音频格式。源端据此决定送什么格式的内容,所以 EDID 读不全,最常见的结果就是分辨率掉档或者直接黑屏。

第四步链路训练,源端把自己选定的目标配置写进接收端的 DPCD,接收端按这个配置调整均衡,再把每个训练阶段的结果写回 DPCD,源端读回来判断是否通过,不通过就降速或者加预加重重试。这个过程是迭代的,一对支持多流功能的源端和接收端之间,一次完整的训练可能包含上百次读写操作,所以抓 AUX 日志时看到几百行记录是正常的。第五步发 MSA,主数据流属性,告诉接收端这路视频模式的详细时序信息,工程师的一项日常工作就是核对 MSA 里的参数和实际视频模式是否一致。第六步开始传数据,音频和 INFOFRAME 这些辅助信息放在可选的次级数据包里跟着走。如果源端支持多流,还会用边带消息跟下游的分支设备通信,获取各个 sink 的结构和能力。

这条链路里任何一个环节断掉,现象都是“黑屏”,但原因完全不同。所以排查时不要一上来就量主链路的眼图,先用 AUX 抓包看流程走到第几步停住,效率会高很多。

2.3 版本选型:带宽、DSC 与 8b/10b 编码的取舍

版本迭代的主线就是带宽和新特性。1.0 在 2006 年发布,最大总带宽 10.8 Gbps,有效数据率 8.64 Gbps,2 米线,现在已经废弃。1.1a 在 2008 年允许使用光纤等其他传输介质,把 HDCP 加进了内容保护,实际用得很少。1.2 在 2009 年底把每通道速率翻倍到 5.4 Gbps,总带宽 21.6 Gbps,有效 17.28 Gbps,支持 4K@60、3D 和多流;1.2a 在 2012 年加了自适应同步,让显示屏刷新率跟着源端指示走。1.3 在 2014 年引入 HBR3,每通道 8.1 Gbps,总带宽 32.4 Gbps,有效 25.92 Gbps,能跑 4K@120、5K@60、8K@30。1.4 带宽不变,但加了显示压缩流、前向纠错和高动态范围元数据包,音频提升到 32 声道 1536 kHz 采样率,8K@60 才真正可用。2.0 跳到 80 Gbps,编码从 8b/10b 换成 128b/132b,有效数据率 77.37 Gbps,单屏 16K@60、10K@60 无损、4K@240,双屏 4K@144。

版本发布每通道速率最大总带宽有效数据率编码典型能力
1.0 / 1.1a2006.5 / 2008.11.62、2.7 Gbps10.8 Gbps8.64 Gbps8b/10b2560×1600@60
1.2 / 1.2a2009.12 / 2012.5增加 5.4 Gbps21.6 Gbps17.28 Gbps8b/10b4K@60、MST、3D、自适应同步
1.32014.9增加 8.1 Gbps32.4 Gbps25.92 Gbps8b/10b4K@120、5K@60、8K@30
1.4 / 1.4a2016.3 / 2018.4不变32.4 Gbps25.92 Gbps8b/10b加 DSC、FEC、HDR 元数据,8K@60
2.02019.6增加 UHBR 10/13.5/2080 Gbps77.37 Gbps128b/132b16K@60、10K@60 无损、4K@240

选型时最容易犯的错是只看“最大分辨率”,不看编码开销和消隐开销。下面这段脚本用来做链路预算,把像素率换算成主链路需要的有效带宽,再反推需要几条 lane、跑在哪一档速率。

def stream_bandwidth(h_active, v_active, refresh, bpp=24, overhead=1.10): """估算一路视频流需要的主链路有效带宽(Gbit/s) h_active / v_active: 有效像素数 refresh: 刷新率,单位 Hz bpp: 每像素比特数,RGB888 取 24,RGB101010 取 30 overhead: 消隐与时序开销系数,1080p 取 1.05,4K 高刷一般取 1.10~1.15 """ pixel_rate = h_active * v_active * refresh * overhead # 像素率 Hz return pixel_rate * bpp / 1e9 # 比特率 Gbit/s # 8b/10b 编码下每档原始速率对应的单 lane 有效速率 lane_capacity = {1.62: 1.296, 2.7: 2.16, 5.4: 4.32, 8.1: 6.48} def pick_link(need_gbps): """从低到高尝试链路配置,返回第一个满足需求的组合""" for raw, eff in lane_capacity.items(): for n in (1, 2, 4): if n * eff >= need_gbps: return n, raw, n * eff return None need = stream_bandwidth(3840, 2160, 60, bpp=24, overhead=1.10) print(f"4K60 8bpc 需要有效带宽 {need:.2f} Gbit/s") print("推荐配置:%d lane @ %.2f Gbps,可用 %.2f Gbit/s" % pick_link(need))

脚本里bpp和overhead是唯一需要按项目改的两个参数:做 10 位色深就把 24 换成 30,做高刷新率就把 overhead 往 1.15 靠。输出结果会告诉你 4K60 8 位色大约需要 13 Gbit/s 的有效带宽,两条 HBR2 lane 就够,四条 HBR 也够但功耗更高。一个设计良好的源端会尽量用更少的 lane 和更低的电压摆幅来降低功耗,这也是链路训练会从首选配置开始迭代、失败再降档的原因。日常 4K 用到 1.2 就够,8K 才是 1.4 加 DSC 的战场;2.0 的 80 Gbps 不是不能上,但要先算清楚线材、连接器和芯片三者的成本。

3. 输出端设计:FPGA SerDes 经预增强芯片到连接器的原理图落地

长距离传输必须对输出信号做预增强、对输入信号做均衡,所以中间要放一颗兼具这两种能力的芯片。资料里用的是一颗支持到 DP1.4b 的预增强与均衡二合一器件(型号 DP130),它既能当输出驱动,也能当输入均衡,同一颗料覆盖收发两个方向,BOM 上会省不少事。这一章讲它作为输出芯片时的原理图怎么画。

3.1 输出链路的分块与器件职责

整条链路分成三段:FPGA 内部的 DP 发送模块输出 SerDes 信号,经隔直电容进 DP130,DP130 做预增强后经隔直电容送到 DP 连接器。FPGA 已经内置 DP 模块的场合,这种接法最直接,省掉外部的编码和并串转换。

三段各自的职责要分清。FPGA 段负责打包、编码、并串转换和链路训练的状态机;DP130 段负责补偿通道损耗,通过调整预增强档位让信号在接收端还能张开眼;连接器段负责机械连接和 ESD 防护。做原理图评审时,我会把这三段的边界画出来贴在评审材料第一页,因为大部分低级错误都发生在“谁的电容该放哪边”这种边界问题上。

3.2 隔直电容、上下拉与 I2C 上拉的取值与摆放

输出侧有五处容易出错:差分输入、差分输出、辅助通道、串行总线和接口配置。

差分输入的隔直电容要放在驱动芯片端,也就是靠近 DP130 的一侧,因为 FPGA 输出的 SerDes 是交流信号,电容靠近接收端才能减少反射。差分输出的隔直电容同样要靠近连接器摆放,理由正好相反——输出信号要经过一段走线才到连接器,电容放在连接器端能把这段走线的直流电位问题挡在外面。辅助通道按 100Ω 差分控制,源端接 FPGA,同样用小电容隔直,接收端接连接器,这里要特别注意上下拉电阻,AUX 在空闲时需要有确定电平,上下拉漏贴会让链路训练在第一步就失败。

串行总线有两条。一条是 DDC 的 I2C,负责传 EDID,源端靠它识别显示器能力;另一条是 CTL 端的 I2C,是标准 I2C 总线,传除 EDID 之外的其他控制信号。两条都需要做 3.3V 上拉,输出侧的上拉电阻取 10K。ADDR 引脚用于多个芯片共用同一条 I2C 总线时区分地址,地址不同就可以挂在一起,这一点在多路输出的板子上很实用。

信号组差分/单端隔直电容位置上拉关键注意点
主链路输入差分靠近 DP130 输入端无电容容值一致,避免对内失配
主链路输出差分靠近 DP 连接器无四对走线同层同阻抗
AUX100Ω 差分源端小电容隔直按参考设计上下拉空闲电平必须确定
DDC I2C单端无3.3V / 10K与 EDID 读取成功率直接相关
CTL I2C单端无3.3V / 10K多芯片共用时靠 ADDR 分址
HPD单端无按参考设计拉低时序决定插拔识别

接口配置上,DP 连接器是金属座,要把金属座的接地和系统地进行隔离,不然外部设备的噪声和地电位差会顺着外壳灌进板内。同时因为它是外接接口,信号和电源上都要加 ESD 防护,器件尽量靠近连接器,让静电电流在进入芯片之前就被引走。

3.3 输出端原理图连线清单

把上面这些整理成一张连线表,画图时逐条对照,比凭记忆可靠。

网络起点终点关键元件备注
ML_LANE0~3FPGA SerDes 输出DP130 差分输入隔直电容电容靠近 DP130
ML_OUT0~3DP130 差分输出DP 连接器隔直电容电容靠近连接器
AUX_CHFPGADP 连接器隔直电容、上下拉100Ω 差分
DDC_SCL/SDADP130DP 连接器10K 上拉传 EDID
CTL_SCL/SDA主控DP13010K 上拉传输其他控制信号
HPDDP 连接器主控按参考设计中断与插拔共用
DP_PWR连接器电源脚板内 5VESD 器件5V/0.5A

这张表的价值在于评审时能一条条问:这条线的电容在哪、上拉有没有、ESD 放在哪。我见过最典型的一次翻车,就是 DDC 的上拉画在了 DP130 和主控之间,连接器那一侧反而没有,结果 EDID 读出来全是 0xFF。

3.4 输出端 PCB layout:阻抗、等长与地隔离

Layout 部分资料里只给了标题,实际做的时候按下面几条约束走。主链路四对差分按 100Ω 差分阻抗控制,对内两根线严格等长,对与对之间也要做等长补偿,误差控制在几个 mil 以内;参考平面必须完整,不能在差分对下方开槽或者跨分割,否则回流路径断了,眼图会莫名其妙地塌。隔直电容的焊盘会引入阻抗不连续,所以电容要放在走线尽量直的位置,焊盘下面挖空处理。

AUX 和主链路要拉开距离,避免主链路的高频能量耦合到 AUX 上导致误码;AUX 自身按 100Ω 差分走,长度不需要和主链路严格对齐,但也不要绕远。ESD 器件放在连接器焊盘和芯片之间,越靠近连接器越好,走线先经过 ESD 再到芯片。连接器的金属外壳地和系统地之间用磁珠或者电容做单点连接,别直接大面积铺铜连在一起,否则静电测试时很容易把整板的地电位带偏。

4. 接收端设计:均衡芯片旁路 AUX 与 HPD 两套接法的取舍

接收端的芯片还是同一颗,但用法完全不同:它不再驱动连接器,而是把连接器进来的信号均衡后送给 FPGA。这个方向最容易出问题的不是主链路,而是 AUX——很多人习惯性地把 AUX 也接到芯片上,结果链路训练根本起不来。

4.1 接收链路的信号流向与均衡芯片的功能边界

信号从 DP 连接器进来,四对差分先经隔直电容进 DP130 做均衡,均衡后的信号再经隔直电容送给 FPGA,电容靠近 FPGA 摆放。和输出侧一样,电容位置的原则是“靠近信号的接收方”。

芯片在这里承担的是补偿通道损耗,把经过线材和连接器衰减后的信号重新张开。速率越高、线越长,均衡档位就要越大。有些设计还会在这条链路上加一颗自适应重定时器,速率低于 1 Gbps 时自动配成重驱动、高于 1 Gbps 时自动配成重定时,用来对付长线或者级联场景;是否需要取决于线材长度和链路速率,短距离板上走线一般用不上。

4.2 AUX 直连 FPGA 与 HPD 两套接法怎么选

接收侧的 AUX 不走芯片,直接从连接器出来就送给 FPGA。具体接法是:AUX 从连接器出来后,一方面接到 DP 芯片的对应引脚,另一方面经小电容隔直送给 FPGA,同样按 100Ω 差分控制,上下拉不能漏。之所以要绕开芯片,是因为 AUX 是双向半双工的控制通道,芯片在这一侧不做转发,硬接进去反而会破坏握手时序。

HPD 在这个方向上提供了两种接法,选哪种取决于主控是否希望自己完全掌控插拔检测。一种是连接器 HPD 直接进主控,主控自己判断插入和中断;另一种是经过芯片再转给主控,由芯片完成一部分电平处理。两种都能工作,但如果主控需要精确测量 HPD 拉低的持续时间(比如 0.5 ms 到 1 ms 的中断窗口),建议走直连,中间多一级器件就会多一份延迟和不确定性。

串行总线在接收侧也有变化。DDC 的 I2C 在这个方向没有显示器信息要读,可以直接 NC;CTL 端的 I2C 仍然要接,负责其他控制信号交互,3.3V 上拉,上拉电阻取 2K——注意这里和输出侧的 10K 不一样,照抄输出侧的参数是常见错误。ADDR 的处理逻辑相同,多芯片共用总线时靠地址区分。

项目输出侧做法接收侧做法差异原因
主链路隔直电容输入靠芯片、输出靠连接器输入靠芯片、输出靠 FPGA电容始终靠近接收方
AUX 走向源端接 FPGA,经电容到连接器连接器出来后直连 FPGA,同时接芯片双向控制通道不做芯片转发
DDC I2C必须接,10K 上拉可 NC接收侧无 EDID 可读
CTL I2C10K 上拉2K 上拉两侧总线负载不同
HPD连接器直出两种接法可选主控是否需要精确计时

4.3 接收端布局与地、ESD 处理

接收侧的 layout 原则和输出侧一致:主链路 100Ω 差分、对内等长、参考平面完整、隔直电容靠近 FPGA。差别在于接收侧的 ESD 更重要——连接器是整块板子最容易被静电打进来的地方,信号和电源都要加防护,器件靠近连接器放置。

连接器金属壳与系统地隔离这一条在两侧都要做,但接收侧还要额外考虑一点:如果整机是金属外壳,连接器外壳和机壳之间的搭接方式会影响静电泄放路径,最好在结构评审时就把这条确认掉,别等 EMC 测试才发现要改板。

5. DP 调试与常见问题排查:眼图测试点、AUX 抓包与五类翻车场景

5.1 眼图测试:测试点选错,测出来的结论就是错的

眼图测试的第一件事不是接示波器,是确认测试点。资料里给出了输入测试点和输出测试点的区分,输入侧对应 TTP2,输出侧对应 TTP4,两个测试点的眼图模板不一样,套错模板会出现“明明能显示但测试不过”的假故障。有些资料图里标的是另一颗重定时器型号的测试点划分,编号体系是通用的,具体套用时以手上芯片手册为准。

测试顺序一般是先测输入点再测输出点:输入点不过,说明通道损耗已经超出芯片的均衡能力,要么换线要么加均衡档位;输入过、输出不过,问题在芯片配置或者输出走线。眼图模板的判据要看模板的开口位置和高度,不要只盯着“眼睛张没张开”,模板不通过往往是因为某几个码型的过冲或者下冲超标。

5.2 AUX 抓包:比波形更快定位问题的方法

AUX 通道的通信记录是排查 DP 问题最高效的入口。抓包工具接在 AUX 上,记录源端和接收端之间的每一次读写,重点看三件事:读 DPCD 有没有返回、EDID 读回来的头部是不是 00 FF FF FF FF FF FF 00、链路训练迭代了几轮停在哪个速率档。资料里提到这类工具是所有 DP 相关工程师和设计师的必备设备,我完全同意——没有它,黑屏就只剩下“量波形”一条路。

抓下来的日志通常是十六进制字节流,人工看很痛苦。可以写个小脚本把事务按类型拆开,只保留关心的寄存器区间:

import re # 假设抓包工具导出的每行格式为: # [时间] CMD=0x09 ADDR=0x00101 LEN=0x10 DATA=00112233... LINE = re.compile(r"CMD=(0x[0-9A-Fa-f]+)\s+ADDR=(0x[0-9A-Fa-f]+)\s+LEN=(0x[0-9A-Fa-f]+)") def parse_aux_log(path, watch=(0x00100, 0x00200)): """按 DPCD 地址区间过滤 AUX 读写记录 CMD 高 4 位表示操作类型:0 为写,9 为读 watch 为关心的起始地址区间,默认只看链路配置和链路状态两段 """ lo, hi = watch hits = [] with open(path, encoding="utf-8") as f: for line in f: m = LINE.search(line) if not m: continue cmd, addr, length = (int(x, 16) for x in m.groups()) if lo <= addr < hi: op = "写" if (cmd >> 4) == 0 else "读" hits.append((hex(addr), op, length)) return hits for addr, op, length in parse_aux_log("aux_capture.log"): print(f"DPCD {addr} {op} 长度 {length}")

脚本里watch区间要按实际关心的问题改:查链路训练就盯链路配置和链路状态两段寄存器,查 EDID 就换成 DDC 那一段。把日志过滤成几十行之后,链路训练在第几档速率失败、接收端回的训练结果是什么,一眼就能看出来。

5.3 常见问题排查:五条最容易翻车的点

现象一:主链路有波形,显示器一直黑屏。原因多半在 AUX,最常见的是上下拉漏贴或者阻值贴错,导致 AUX 空闲电平不确定,源端发出去的读 DPCD 请求没有回应。解决办法是先不插显示器,量 AUX 两根线的空闲电平,确认在规定的共模范围内,再插上显示器抓一次握手日志,看第一步读 DPCD 有没有返回。

现象二:链路训练到高速率档就失败,降到低速率档就正常。原因是通道损耗超出当前预增强或均衡档位的补偿能力,或者差分阻抗没控住。解决办法是先把预增强和均衡往上调一档试,如果能过就说明是通道损耗问题;调档无效就要回头查走线阻抗和参考平面,尤其是隔直电容焊盘处的阻抗不连续。

现象三:插拔时好时坏,重新插一次就正常。通常是 HPD 的时序问题:拉低时间不够 2 ms 被当成抖动,或者 HPD 上的滤波电容太大,把 0.5 ms 的中断脉冲吃掉了。解决办法是把滤波电容换小,必要时在 HPD 上加一级缓冲,保证边沿干净。

现象四:同一块板子,接 A 显示器正常,接 B 显示器不亮。优先怀疑 EDID:读回来的数据不完整或者校验和错误,源端会选择保守的默认模式,运气不好就黑屏。解决办法是抓 DDC 上的 I2C 波形,确认上拉电阻和总线速率,再对比两台显示器的 EDID 长度和扩展块数量。

现象五:实验室一直正常,到了现场批量出问题。大概率是 ESD 或地处理不到位,连接器金属壳和系统地直接连通,外部设备的静电顺着外壳打进来。解决办法是复查连接器的地隔离和 ESD 器件位置,ESD 一定要在信号进入芯片之前完成泄放。

5.4 出图之后的收尾测试

能正常出图不代表可以结束测试。资料里的建议是:眼图、I2C 总线按标准方法测完,电源、时序、时钟按芯片规格书逐项核对;如果各项都正常且长期出图稳定,可以考虑适当减少重复测试项,把时间留给长稳和兼容性矩阵。我一般会保留至少三种不同分辨率、两台不同显示器的组合跑满 24 小时,中间穿插几次热插拔,这个过程能捞出大部分偶发问题。

6. 验收

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询