4. eDP 时序参数概述:时钟域划分、数据通道时序、建立时间与保持时间的基础概念
各位好,咱们这章来聊聊 eDP 时序里最基础但也是最容易踩坑的地方。说实话,我刚入行那会儿,总觉得时序就是看看 datasheet 上的几个数字,后来被链路训练搞得焦头烂额,才发现这些基础概念没吃透,后面代码根本跑不通。
eDP 的时序说白了就三件事:时钟怎么分家、数据怎么走、以及芯片内部怎么判断信号对不对。咱们一个一个说。
4.1 时钟域划分:为什么要把一个时钟拆成好几个?
在 eDP 源端(Source)内部,至少得有三个时钟域:
- 像素时钟域(Pixel Clock Domain):处理来自显卡的并行 RGB 数据,频率由分辨率和刷新率决定。比如 1920×1080@60Hz ≈ 148.5MHz。
- 链路时钟域(Link Clock Domain):eDP 主链路(Main Link)上实际跑串行数据的参考时钟。常见值 162MHz、270MHz、540MHz 等。
- 辅助时钟域(Aux Clock Domain):AUX 通道的时钟,通常来自独立的晶振或 PLL,频率 1MHz 左右。
我亲自见过一个项目,工程师把像素时钟和链路时钟混到一个 PLL 里,结果频率切换时 lock 丢失,画面直接闪黑。记住:不同时钟域之间必须用同步器或 FIFO 做隔离。
4.2 数据通道时序:每个 Lane 都是一个小世界
主链路有 4 个 Lane(通道),每个 Lane 都是一个高速串行差分对。关键时序参数有哪些?我习惯列成一张表,方便查:
| 参数 | 符号 | 典型值(1.62Gbps/lane) | 说明 |
|---|---|---|---|
| 比特率 | BR | 1.62 Gbps | 每 lane 每秒传输的比特数 |
| 单位间隔 | UI | 617 ps | 每比特占用时间 = 1/BR |
| 抖动(总抖动) | TJ | ≤ 0.3 UI | 包括随机抖动 + 确定性抖动 |
| Lane-to-Lane Skew | LLS | ≤ 2 UI | 不同 lane 之间的相位差 |
| 数据到时钟的偏移 | T_data2clk | ± 0.5 UI | 以源时钟为参考 |
你想想看,如果 Lane 0 和 Lane 1 之间差了 3 个 UI,接收端去对齐眼图时得额外吃掉多少 margin?这就是为什么链路训练里要测 skew,还要做 deskew。
4.3 建立时间与保持时间:芯片内部的“开门关窗”
这两种时序约束,本质上定义的是 数据在时钟边沿前后必须稳定的时间窗口。我习惯用一个比喻:时钟边沿就像一扇快门,建立时间是快门打开前数据必须到位的提前量,保持时间是快门关闭后数据还得再撑一会儿的最短时长。
在 eDP Source 芯片内部,像素时钟域和链路时钟域之间往往有一个跨时钟域 FIFO。这个 FIFO 的读、写指针分别由两个时钟控制,如果建立/保持时间不满足,FIFO 就会读到“半生不熟”的数据,产生 metastability。
那 eDP 链路训练里啥时候会用到建立/保持时间?举个例子:训练时 Receiver 会发送 训练结果寄存器(比如 EQ 系数、gain 值),Source 需要用 AUX 时钟去采集这些值。AUX 时钟频率低(1MHz),但芯片内部走线可能有延迟。
// 伪代码示例:AUX 读取训练结果
always @(posedge aux_clk or negedge aux_rst_n) begin
if (!aux_rst_n)
eq_gain <= 4'h0;
else if (aux_read_en)
// 需要确保 data_valid 在 aux_clk 上升沿前后满足 setup/hold
eq_gain <= aux_data_in[3:0];
end
set_max_fanout 4,setup slack 反而变差了——因为插了太多 buffer 让路径变长。
4.4 时序参数与链路训练的关系全览
说了这么多,它们怎么串起来的?我画了一张图,把时钟域、数据通道、建立/保持时间的关系理清楚。
图中箭头指向很清晰:像素数据经过 FIFO 同步到链路时钟域,再分发给 4 个 Lane;而链路训练的反馈(扰动后调整的 EQ 系数)则通过 AUX 时钟域写回。建立/保持时间约束控制着所有这些跨时钟域采样的正确性。
4.5 总结记忆点
- 时钟域划分:像素时钟、链路时钟、AUX 时钟,必须用同步器分开。
- 数据通道时序:关注 UI、抖动、skew 三个参数,skew 超标会直接导致链路训练失败。
- 建立/保持时间:这是芯片内部的门槛,训练必须以不踩这个门槛为前提。
- 熟记典型表格:1.62Gbps 下 UI=617ps,LLS≤2UI,TJ≤0.3UI——这些数字在写约束文件时会反复用到。