ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

USIT协议规范:3.1Gbps差分链路、扰码与信号完整性设计

USIT协议规范:3.1Gbps差分链路、扰码与信号完整性设计

简介:这份USI-T协议规范数据手册(USI-T Unified Standard Interface for TV,Revision 1.03)由三星电子发布,面向显示驱动、面板接口与电视主控方案的设计工程师及协议研究者,帮助读者理解高分辨率、高帧率、高色深平板显示场景下传统接口带宽吃紧时的统一串行接口解决思路。压缩包内为1个PDF文件,约1.39MB,内容涵盖接口总体架构、数据传输机制、时序与电气参数定义,以及三星关于典型参数验证、知识产权与使用范围的声明条款。文档对高速串行链路的多通道组织、时钟与数据对齐、错误检测与容错设计等关键内容有较完整的描述,可作为接口选型、链路调试与驱动开发时的参数查阅依据,也便于对照现有LVDS、eDP等方案比较带宽与引脚成本。目前已有1410人学习下载,适合具备一定显示接口基础、需要深入协议细节的工程人员参考。

1. 一条差分线要传输 3.1Gbps:USIT 协议规范究竟在解决什么问题

拆开一台 4K 电视的后壳,时序控制板到源极驱动之间往往只剩几对细走线,而不是老机器上那种几十根并排的排线。这个变化背后的技术问题,正是 USIT 协议规范(Unified Standard Interface for TV)要回答的:当面板分辨率、刷新率、色深同时提高时,过去那根时钟加一排数据线的多点总线,已经在物理上无法满足源极驱动的数据需求了。理解这套协议,重点不在于记住几个包格式,而在于搞清楚一条 3.1Gbps 的差分链路,如何在有限的时间窗口内,把一整行像素、配置参数、gamma 表全部传送过去,并且让接收端自行找回数据边界。这条链路里的每个设计决定,几乎都能从带宽预算和信号完整性这两个约束推导出来。

2. 拓扑与带宽预算:点对点级联为什么能救回信号完整性

2.1 从多落总线到点对点:负载电容与反射的代价

传统面板接口的组织方式是“多落”(multi-drop):一条时钟线、一组数据线,上面挂十几颗源极驱动,靠不同的数据线分组来区分寻址对象。这种方式在 1080p、60Hz、8bit 时代能够满足需求,问题在于电气特性。每挂一颗驱动,总线就多一份输入电容和一段分支走线,而分支走线本身就是阻抗不连续点,信号到达这里会反射回来。频率低的时候,反射波在下一个边沿到来前已经衰减干净,看不出来;频率升到 Gbps 量级,反射波正好落在判决窗口里,眼图就被“啃”掉一块。

点对点改变的是拓扑本身:一颗驱动独占一条链路,链路上只有发送端、走线和接收端三个节点,没有分支,没有中间抽头。走线可以按差分阻抗做严格的端接匹配,反射只剩连接器和过孔这两处需要处理。代价是链路条数随驱动数量线性增长,时序控制器的发送端数量也同步增长,这属于芯片面积和引脚数的成本问题,而不是信号质量问题。这个交换是划算的:在 Gbps 级别,信号完整性远比引脚数更关键。

规范里同时画了传统多落配置和级联源极驱动的配置。级联的意思是,链路可以从一颗驱动的输出端再接到下一颗(类似菊花链),但实际产品里更常见的是时序控制器直接扇出多条独立点对点链路,每条链路的长度和负载都被控制得非常接近。理解这一点很关键:所有关于 skew 的规格,前提都是这些链路物理上尽量对称。

2.2 一条链路服务一颗源极驱动:1440 通道与 3.1Gbps 的配平

为什么单条链路的上限卡在 3.1Gbps 这个数字上?它既不是随便定的,也不完全是工艺上限,而是由“一条链路要传送多少数据”倒推出来的。先看带宽计算:

# 单条链路到底需要多快:先算净数据,再叠协议开销 WIDTH, HEIGHT = 3840, 2160 # 4K 面板有效像素 REFRESH = 120 # 刷新率 Hz BIT_PER_PIX = 10 * 3 # RGB 各 10bit active_bits = WIDTH * HEIGHT * BIT_PER_PIX * REFRESH # 有效显示区净码率 blank_ratio = 1.20 # 行/场消隐合计开销,按 20% 估 raw_bps = active_bits * blank_ratio link_rate = 3.1e9 # 单条链路高速档上限 lanes = -(-raw_bps // link_rate) # 向上取整 print(f"净码率 {active_bits/1e9:.2f} Gbps, 含消隐 {raw_bps/1e9:.2f} Gbps") print(f"3.1Gbps 档至少需要 {int(lanes)} 条链路")

跑出来净码率约 29.86Gbps,含消隐约 35.83Gbps,除以 3.1Gbps 得到 11.56,向上取整是 12 条。而 4K 面板横向常见的源极驱动数量正好在 12 颗这个量级,一颗驱动负责 1440 或 1446 个输出通道。参数之间是相互制约的:消隐开销、色深和刷新率决定了总码率,总码率除以驱动数量决定了单条链路的速率档位,速率档位再反过来约束电气规格能做到什么程度。

这也是为什么规范把速率分成两档来写电气指标:1.65Gbps 以下是“降速档”,1.65Gbps 到 3.1Gbps 是“高速档”。两档不是简单地把同一套指标乘以 2,而是各自有一套眼图模板,因为高速档面临的码间干扰、抖动累积和均衡压力完全是另一个量级的问题。

提示:算带宽时别漏掉消隐。很多人按有效像素算完就下结论,结果实机上发现链路一直满负荷跑,任何一次时钟抖动都会措手不及。

2.3 双端口操作与端口间 skew:两条 lane 并行时的对齐代价

单条链路速率不够的时候,除了增加链路条数,还有另一种做法:让一颗源极驱动用两个端口(USI0P/N 和 USI1P/N)同时接收,把一行的数据对半切开并行传输。这相当于在驱动侧把可用带宽翻倍,代价是引入了端口间 skew 这个新的约束项。

skew 的来源很具体:两颗发送端内部路径不同、PCB 走线长度不同、连接器引脚长度不同,最终表现为两路数据到达接收端的时间差。接收端要做的第一件事是把两个端口的数据重新拼成一行,如果拼错了位置,画面就会出现“左半边是这一行、右半边是上一行”的错位,视觉上是横向撕裂。

规范专门给出了端口间 skew 的规格,这个数值的宽松程度直接决定了 PCB 布线能做到多自由。常见的实现思路是:接收端内部有可调的延时单元来补偿固定 skew,但补偿范围有限,超出范围就只能靠改板子。所以双端口方案在原理图上看着只是多接两条差分线,实际上对走线等长、参考平面完整性、连接器选型都提出了更高要求。双端口和单端口的取舍,本质上是“多用一倍引脚”和“多背一份 skew 预算”之间的选择。

2.4 共享前向通道 SFC:为什么回传要单独修一条慢速总线

前面讲的都是从时序控制器到源极驱动的单向高速链路。但显示系统不是单向的:源极驱动侧有温度、状态、故障标志需要回读,否则时序控制器就是瞎子。这些信息量很小、实时性要求也不高,却必须有一条通路。

规范的处理方式是单独定义一条共享前向通道(SFC)。它有几个明显的设计意图:一是低速,因为回传的是状态而非像素;二是共享,多颗驱动挂在同一条通道上分时回传,省引脚;三是与主链路物理分离,避免回传逻辑干扰高速链路的时序收敛。这种“快慢分离”的架构在高速接口里非常常见:主链路全部预算都花在吞吐上,控制面另开一条窄通道。

实际调试中,SFC 常常是被忽略的那一环。主链路眼图调得很漂亮,画面正常,但驱动的异常状态读不回来,出了间歇性故障就成了黑匣子。我的经验是,板子第一版就要把 SFC 的波形抓出来看清楚,确认帧格式和时序没问题,别等到量产排查时才发现这条通道从来没跑通过。

3. 包结构与状态机:上电后那几百毫秒里链路做了什么

3.1 上电时序:从供电稳定到链路可用的分界线

上电不是“通电就有图”。从电源爬升到第一帧正确显示,中间有一段严格定义的时序,规范里用一张电源上电时序图标出各个阶段。顺序大致是:各路电源按定义好的次序建立、参考时钟稳定、发送端开始输出训练序列、接收端完成锁定、配置数据下发、最后进入正常显示。

这里每一段都有时间预算。电源爬升太慢、时钟稳定太晚,都会把后面的窗口挤掉;而训练窗口被压缩,接收端就可能锁在一个错误的相位上,表现为开机偶尔花屏、重启一次又好了。这种偶发性是最难查的,因为它取决于电源斜率、温度、器件批次的细微差异。

规范里对“最小行消隐后沿长度”在高码率(>2.0Gbps)下做了专门修订,原因就在这里。行与行之间那段消隐期,是链路做重新同步、切换配置的窗口,速率越高,同样的时间窗口里能塞下的“安全余量”越少,所以必须规定一个下限,不能为了多传像素把消隐压到极限。

3.2 训练模式:接收端靠什么找回位边界和字边界

高速串行链路接收端的核心工作是两件事:位边界和字边界。位边界靠时钟数据恢复(CDR)电路从数据跳变里提取,字边界靠识别一个已知的码型。两件事都需要数据里有足够多的跳变。

训练模式就是为此设计的。发送端在正式数据之前发送一段特定的训练码型,规范给定的训练码型不止一种,分别用于不同目的:有的偏重跳变密度,让 CDR 快速锁定频率和相位;有的偏重可辨识性,让接收端确认自己对齐到了正确的字边界,而不是碰巧对齐到了某个错误位置。

这里有个容易被低估的细节:训练码型必须和正常工作时的数据特性“足够不一样”,否则接收端很难判断自己到底是在训练阶段还是在传数据。但也不能完全不一样,因为均衡器的自适应过程需要在训练期间收敛到接近实际工作点的状态,训练码型和真实数据的统计特性差太远,均衡器收敛的位置就是错的,切换到真实数据后还要重新收敛一次,那训练就白做了。这个平衡点在各家实现里都是仔细设计过的。

3.3 配置数据包:行配置、帧配置与 72bit 映射

链路建立起来之后,第一件事不是传像素,是告诉接收端“接下来要传的这些像素该怎么摆”。这就是配置数据包的作用,它分成几个层次:

行配置描述的是几何关系,比如这一行有多少个像素、数据怎么分配到各个通道、双端口模式下怎么切分。帧配置描述的是整帧层面的参数,规范里给出了 72bit 的数据映射,也就是一个帧配置包被组织成 72 位宽的结构,按位域划分不同字段,再映射到链路的传输单元上。此外还有数字 gamma 相关的配置包。

72bit 这个宽度不是随便取的。它要能整除链路传输单元,才能保证配置包在每个通道上的分片是均匀的,不会出现某个通道分到 71bit、另一个分到 73bit 的情况。位域划分上,一类字段是“立即生效”的参数,另一类是“下一帧生效”的参数,后者是为了避免配置在帧中间改变造成撕裂,通常在垂直消隐期统一更新。

配置包和正常像素数据共用同一条链路,靠包头区分。这就带来一个设计问题:包头必须足够健壮,不能被误判为像素数据。规范通过扰码状态和固定的包结构来保证这一点,接收端在解扰之后按固定位置检查包头模式,匹配上才按配置包解析。

3.4 发送/接收状态机:异常时怎么退回训练态

规范里给了发送端和接收端各自的状态图,这是整份文档里最值得细看的部分之一。状态机的存在说明一件事:链路不是“训练一次就永远好”的,它得有回退路径。

接收端在正常接收状态下仍然持续监测信号质量,比如解扰后的包头是否合法、是否有持续的失锁迹象。一旦判定异常,就要退回到重新训练的状态。这个回退路径的设计难点在于“判定阈值”:太敏感,环境里一点噪声就反复重训,画面会周期性闪;太迟钝,真的失锁了还在硬撑,错误数据被当成正常像素显示出去,屏幕上就是一片乱码。

发送端对应的动作是:在收到重训请求或者检测到链路异常时,中断当前传输,重新插入训练序列,然后再走一遍配置流程。整个过程的耗时决定了用户在异常发生时看到的黑屏时长。做得好的实现,这个时间短到肉眼几乎察觉不到;做得差的,就是每次静电干扰都会带来一次明显闪烁。

4. 扰码与 LFSR:为什么高码率下必须把数据打散

4.1 长连 0 与长连 1 对 CDR 的伤害

显示数据有个很不友好的统计特性:大面积纯色。一块显示纯白或纯黑的区域,像素值几乎不变,映射到链路上就是长时间的连 0 或连 1。对 CDR 来说这是灾难,因为 CDR 靠数据跳变来维持相位跟踪,长时间不跳变,本地振荡器就自由跑,等到下一个跳变到来时相位已经漂了,采到的数据就是错的。

交流耦合链路还有第二个问题:直流平衡。连续相同的电平会让耦合电容充放电失衡,接收端的共模电平慢慢偏移,最终超出输入范围。这两个问题在低速率时代可以靠编码(比如每 8 位加 2 位控制位)解决,但那要多付 25% 的带宽税,在 3.1Gbps 的预算里这笔税太贵。

4.2 LFSR 扰码器与解扰器的自同步前提

扰码器的思路是:不增加任何比特,而是把数据和一个伪随机序列做异或,把长连 0/1 打散成近似随机的分布。伪随机序列由线性反馈移位寄存器(LFSR)生成,它的输出看起来随机但完全可预测,接收端用同样的 LFSR 就能把数据还原。

POLY_TAPS = (15, 14) # 抽头位置,示意值,实际多项式以规范定义为准 SEED = 0x7FFF # 每行的起始种子,收发两端必须完全一致 def scramble_stream(bits, taps=POLY_TAPS, seed=SEED): """对一段数据做扰码;解扰用完全相同的函数再跑一遍即可""" state, out = seed, [] for b in bits: fb = 0 for t in taps: fb ^= (state >> t) & 1 # 抽头异或,得到反馈位 state = ((state << 1) | fb) & 0xFFFF out.append(b ^ fb) # 数据位与扰码位异或 return out

这段代码说明了扰码的三个关键性质。第一,它是乘性的,异或操作不改变比特数量,所以带宽开销为零,这正是它比 8b/10b 更划算的地方。第二,可逆,接收端跑同样的 LFSR 再异或一次就还原了,不需要额外的同步信息。第三,也是最容易翻车的地方,它要求收发两端的 LFSR 状态严格同步:taps决定多项式和周期长度,seed决定起始相位,而“跑多少位之后回绕”由行的长度决定。三者任何一个对不上,解出来的就是看起来像随机噪声的画面。

参数的选择上有讲究:抽头组合决定了 LFSR 的最大周期,周期必须远大于一行的比特数,否则扰码序列会在一行内重复,打散效果打折。种子一般选全 1 或者某个非零值,全 0 是禁用状态,因为全 0 状态的 LFSR 永远输出 0,等于没扰码。

4.3 扰码周期 T 与源极驱动通道数的耦合

规范的修订记录里有这么一条:修正了 1440 通道和 1446 通道源极驱动的 T 数量(也就是 LFSR 码的数量)。这条看起来只是改了个数字,实际上点出了一个很容易被忽略的耦合关系。

一行的传输单元数取决于驱动有多少个输出通道、每个通道多少比特。扰码周期 T 必须和这个传输单元数对齐,才能保证每一行开始时 LFSR 处在相同的状态。为什么要求每行状态一致?因为接收端在行与行之间会利用消隐期做重新同步,如果每行的扰码起点都不同,接收端就得额外维护状态,一旦丢了一个行同步,后面全乱。

1440 和 1446 这两个通道数看着只差 6,但除以并行端口数、乘以每像素比特数之后,一行的传输单元数就不一样了,T 的取值也就跟着变。血泪经验是:换驱动型号的时候,别只看通道数“差不多”,一定要确认扰码周期的配置项跟着改了。早期版本按 1440 写死,换 1446 的驱动后画面偶发单行错位,查了很久才定位到这个参数。

4.4 数字 gamma:把校正表也塞进同一条链路

传统做法里,gamma 校正靠驱动芯片内部的电阻分压网络或者外部基准,一旦面板定型,gamma 曲线就固定了,想调整得换物料。数字 gamma 的思路是把校正表当成数据,通过配置包下发到驱动内部的查找表里,曲线随时可改。

这个改动对链路的影响是:配置数据量变大了,而且是在上电阶段集中下发,这几百毫秒里链路除了训练还要承担一波密集的配置传输。规范把数字 gamma 部分标为“参考性”内容,意思是具体的表结构和下发流程留给实现决定,但包格式和传输机制必须遵守统一约定,否则时序控制器没法通用地驱动不同厂家的驱动芯片。

从系统角度看,这件事的意义超过“方便调曲线”。它把面板的一致性校准从硬件工艺问题变成了软件配置问题,同一批驱动可以配不同面板,产线上的校准数据可以直接写进时序控制器的固件里。代价是上电流程变长、配置阶段出错的影响面变大,这也是为什么状态机必须要有回退路径。

5. 眼图、预加重与现场排查:几个反复踩的坑

5.1 两档眼图模板:1.65Gbps 这条线为什么是分水岭

规范把接收端输入的眼图模板分成两套:降速档(最高 1.65Gbps)一套,高速档(1.65Gbps 到 3.1Gbps)一套。分水岭设在这里不是为了让文档好看,而是因为两个区间的主导误差机制不一样。

1.65Gbps 以下,单位间隔还比较宽,码间干扰主要来自最近的一两个比特,信道的频率选择性衰减免强,接收端的均衡压力小,眼图模板可以给得宽松一些,允许更大的幅度噪声和抖动。跨过 1.65Gbps 之后,单位间隔缩到 300ps 量级,同样长度的走线上,前一比特的拖尾会叠加到后一比特的判决点上,而且信道的趋肤效应和介质损耗开始明显,高频分量衰减得比低频快,眼图会呈现“上下沿变缓、水平张开变窄”的形态。

模板的作用是划定一条线:只要你的信号在模板之外,接收端就保证能正确判决。调试时把实测眼图和模板叠在一起看,能快速判断余量在哪个维度上被吃掉了。水平方向不够,通常是抖动或者走线长度问题;垂直方向不够,通常是衰减、端接失配或者预加重没调对。这两类问题的排查方向完全不同,先分清方向能省很多时间。

5.2 预加重与极性反转:布线自由度换来的代价

预加重解决的是信道高频衰减问题。做法是在发送端,当数据发生跳变时,把跳变沿的幅度加大一些,人为地“预支”一部分能量给高频分量,这样经过信道衰减后,到达接收端的眼图还能张开。加重幅度通常有几档可选,选大了会带来两个副作用:功耗上升,以及电磁辐射变强(快速的、幅度更大的边沿本身就是干扰源)。所以调预加重不是“越大越好”,而是在当前信道损耗下找到刚好能张开眼图的那一档。

极性反转是另一个实用设计:差分对的 P/N 接反了,链路依然能工作。这本该是硬件布线的小便利,实际上省了很多改板成本,尤其是在多层板走线绕不开、只能靠交换 P/N 来打通过孔的时候。但这里有个坑:极性反转要么由接收端自动识别,要么由配置位指定,两条路径的行为不一定一致。自动识别的实现在训练阶段完成检测,如果训练序列不够长或者质量不好,可能识别错;配置位指定则要求软件流程里真的把这个字段填对,默认值不一定是对的。

规范里还单独给出了 CLK1 信号的特性和极性反转的时序关系。CLK1 是给链路提供低频参考的时钟,它和主数据链路的关系必须明确,否则接收端在无数据期间无法维持频率基准。

注意:预加重档位、极性反转配置、扰码种子这三项,都属于“改了就能出图、但改错了也偶尔能出图”的参数。它们不会给你明确的报错,只会给你偶发的异常。

5.3 五条踩坑记录

现象一:眼图看着张开度不错,误码却随机出现。原因是训练窗口不够,接收端均衡器没完全收敛就被推进正常工作状态,此时眼图是在“未收敛”的均衡设置下测的,看起来还行,实际判决余量很小。解决方式是延长训练序列长度,并检查上电时序里训练阶段的预算是否被电源爬升时间挤占。

现象二:整屏花屏,但换一块板子就好了。原因是差分对 P/N 接反,而接收端的极性自动识别在当前训练序列下没能正确判断。解决方式是把极性反转配置显式写死,不依赖自动识别,或者在硬件上把 P/N 改回来。

现象三:换了通道数不同的源极驱动后,画面偶发单行错位。原因是扰码周期 T 按旧驱动的通道数配置,新驱动每行的传输单元数变了,T 没跟着改,导致每行的扰码起始状态不一致,行同步偶尔丢失。解决方式是按实际通道数(1440 与 1446 处理方式不同)重新配置 T。

现象四:高码率下每行开头几个像素丢失或者错位。原因是行消隐后沿太短。规范在高码率(>2.0Gbps)下规定了最小长度,因为速率提高后,同样的消隐时间片里能容纳的重新同步余量变少。解决方式是重新计算时序参数,把消隐还给链路,而不是全部让给有效像素。

现象五:画面随环境光变化而漂移,遮住光就正常。原因是芯片封装形式(如 COG、COF 这类芯片直接暴露在外的形式)下,外界光照射到 IC 上产生电子-空穴对,改变了材料的导电特性,进而影响电气参数。这不是软件能修的,只能在结构上做遮光,上下左右四个方向都要挡。规范的芯片操作指南里专门列了这一条,测产线时建议在无光渗透的环境下进行。

6. 设计取舍:扰码、训练序列和固定包格式各自让出了什么

回头看这套协议的几个核心决定,会发现它们都在做同一件事:在带宽预算里给“可靠性”留位置。

扰码代替 8b/10b 编码,是最典型的取舍。8b/10b 有确定性的直流平衡、有丰富的控制字符、有可检测的错误码,代价是 25% 的带宽税。3.1Gbps 的链路如果交这笔税,实际可用只剩 2.48Gbps,前面计算的 12 条链路立刻不够用,得加到 15 条,驱动数量、引脚数、板面积全跟着涨。扰码不开销,但代价是直流平衡只在统计意义上成立,极端长的连 0 连 1 理论上仍可能出现,而且它依赖收发端 LFSR 严格同步,同步一旦丢失,恢复只能靠重新训练而不是靠编码层的对齐机制。

训练序列的长度也是同样的取舍。训练越长,接收端锁定越稳,但上电到出图的时间越长,用户能感知到黑屏。训练越短,开机越快,但均衡收敛不完全的风险越高,表现出来就是“大部分机器正常、少数机器偶发花屏”。规范只能给出一个下限和训练码型的定义,具体留多长,是产品在开机速度和良率之间的选择。

固定包结构(比如 72bit 的帧配置映射)则放弃了灵活性。它让时序控制器可以用同一套硬件逻辑驱动不同厂家的驱动芯片,代价是配置字段一旦定义就很难扩展,新增功能只能靠预留位或者新增包类型。这在规范类文档里是常态:通用性来自约束,而不是来自自由。

验证这些取舍是否成立,最直接的方法是在实验室里做三件事:用眼图扫描确认实测模板余量在水平和垂直两个维度上都留有可观裕量,而不是刚刚达标;跑长时间误码统计,重点看有没有随时间缓慢劣化的趋势(那通常是温度或者电源漂移);做上电循环测试,几百次以上,专门抓那千分之几的开机异常。前两项查的是稳态,第三项查的是瞬态,三者缺一,问题就会留到量产才暴露。

从那以后我每次拿到一份新的接口规范,都会先把状态机和上电时序翻出来,把每个状态的进入退出条件、每个阶段的超时阈值抄到自己的笔记里,再去看包格式和电气指标。因为格式错了会立刻报错,时序错了只会偶发异常,而偶发异常是最贵的那一类 bug。希望这套梳理方式能帮到你,至于规范原文里那些位域定义和实测模板,还是得对着那份数据手册一页页啃。

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进