保姆级图解:DP协议里的SST协议到底怎么组包?从BS、BE到FS、FE,一文讲透
保姆级图解:DP协议里的SST协议到底怎么组包?从BS、BE到FS、FE,一文讲透
在数字视频传输领域,DisplayPort(DP)协议凭借其高带宽和灵活性已成为行业主流标准。而其中的SST(Single Stream Transport)协议作为基础传输模式,其数据封装逻辑直接影响着视频信号的完整性和传输效率。对于硬件工程师和FPGA开发者而言,理解这些控制符号的插入规则就像掌握一门精密的时间艺术——每个BS、BE、FS、FE符号的放置位置都如同交响乐中的节拍器,确保数据流严格遵循时序要求。
本文将采用独特的**"数据流水线可视化"**方法,通过结构化的图解和时序拆解,带您一步步走过SST协议组包的全过程。不同于传统文档的参数罗列,我们会用工程师的视角还原真实的数据封装场景,特别关注以下核心问题:如何判断BS符号的插入间隔?TU单元中的填充符号何时需要FS/FE组合?SR复位信号如何与加扰机制联动?这些细节往往决定了设计方案的稳定性和兼容性。
1. SST协议基础:控制符号的定位与作用
在DP协议的SST模式中,数据流被划分为连续的符号(Symbol),每个符号对应8b/10b编码后的10位数据。控制符号作为特殊标记,承担着数据分段、时序同步和加扰复位等关键功能。我们先从六个核心控制符号的二进制定义开始:
localparam BS = 8'hBC; // K28.5 - 消隐期开始 localparam SR = 8'h1C; // K28.0 - 加扰复位 localparam BE = 8'hFB; // K27.7 - 消隐期结束 localparam FS = 8'hFE; // K30.7 - 填充开始 localparam FE = 8'hF7; // K23.7 - 填充结束 localparam SS = 8'h5C; // K28.2 - 音频包开始 localparam SE = 8'hFD; // K29.7 - 音频包结束这些控制符号的插入位置遵循严格的时空关系,我们可以用一张时序相位图来展示它们的分布规律:
| 显示阶段 | 控制符号 | 插入位置规则 |
|---|---|---|
| 垂直消隐期 | BS | 每帧最后有效像素后插入,无视频数据时每8192符号强制插入 |
| 水平消隐期 | BE | 每行第一个有效像素前插入 |
| TU填充区 | FS/FE | 填充符号≥3时需FS+FE组合,仅2个填充时直接使用FE |
| 加扰同步 | SR | 每512个BS周期替换一次,触发加扰器复位 |
| 音频数据传输 | SS/SE | 音频包起始插入SS,结束插入SE |
注意:CPBS和CPSR是内容保护模式下的特殊变体,其插入规则与标准BS/SR相同但编码值不同
2. 像素数据区的TU单元封装逻辑
视频有效像素数据被封装在TU(Transport Unit)单元中,每个TU固定为64字节大小。TU内有效数据的实际占比由以下公式动态计算:
Valid_Symbols = packed_data_rate / link_symbol_rate * TU_size其中link_symbol_rate等于链路速率(如5.4Gbps)除以10(因8b/10b编码)。当计算结果非整数时,需要在最后一个TU中用填充符号补足。这就引出了FS/FE符号的经典应用场景:
- 单填充情况:仅需插入一个FE符号
- 双填充情况:连续插入FE符号(不启用FS)
- 三填充及以上:必须采用FS+[填充符号]+FE结构
下图展示了一个典型TU的数据分布(假设Valid_Symbols=60):
| 有效数据(60符号) | FS | 填充符 | FE |这种设计确保了接收端能准确识别填充区域的边界。在实际FPGA实现中,通常使用状态机控制这一过程:
case(tu_state) IDLE: if(video_active) begin valid_cnt <= 0; tu_state <= DATA; end DATA: begin tx_symbol <= pixel_data; if(valid_cnt == VALID_MAX-1) tu_state <= (pad_num>=3) ? FS : FE; else valid_cnt <= valid_cnt + 1; end FS: begin tx_symbol <= K30_7; // FS pad_cnt <= pad_num - 2; tu_state <= PAD; end PAD: if(pad_cnt==0) tu_state <= FE; else pad_cnt <= pad_cnt - 1; FE: begin tx_symbol <= K23_7; // FE tu_state <= IDLE; end endcase3. 消隐期与加扰复位的协同机制
消隐期控制符号BS/BE的插入与视频时序严格同步,而SR符号则独立工作在加扰域。这两套系统通过"512次BS替换"规则产生交集:
- 垂直消隐期:在帧结束后的垂直消隐区,BS符号以8192符号为周期插入
- 水平消隐期:每行开始前插入BE,结束后插入BS
- 加扰复位:Scrambler模块持续计数BS符号,达到512时用SR替代当前BS
这种设计带来一个关键优势:即使视频内容长时间静止(导致BS间隔固定),加扰器仍能通过SR定期复位,避免伪随机序列周期过长引发的EMI问题。下图展示了BS/SR的替换时序:
[BS][BS]...[BS][SR][BS]...[BS]... |---512个BS---|在硬件实现时,需要特别注意BS计数器的位宽和清零时机。推荐采用同步清零的11位计数器(2^11=2048>512),在检测到SR符号或链路复位时立即清零。
4. 多模块协同工作流程
完整的SST数据流需要多个处理模块协同工作,各模块的控制符号处理职责如下:
| 处理模块 | 负责的控制符号 | 关键行为 |
|---|---|---|
| Video MUX | BS/BE | 根据视频时序生成消隐期标记 |
| Audio MUX | SS/SE | 封装音频数据包 |
| TU Framer | FS/FE | 管理填充符号的插入 |
| Scrambler | SR | 执行BS计数和SR替换 |
| PHY Layer | 所有符号 | 最终执行8b/10b编码 |
一个典型的错误处理案例是:当TU填充区计算错误导致FS/FE缺失时,接收端可能无法正确识别TU边界,进而引发像素错位。此时可通过以下诊断步骤排查:
- 检查Valid_Symbols计算公式中的速率参数
- 验证TU状态机是否遗漏填充状态
- 用逻辑分析仪捕获FS/FE的实际插入位置
在实际项目中,我曾遇到因PLL时钟抖动导致TU计数误差的情况。最终通过在状态机中添加时钟域同步逻辑解决了问题——这也印证了SST协议对时序精度的严苛要求。
