一、整体概念:一帧图像是"逐行扫描"出来的
一帧图像不是一次性传输的,而是按照从左到右、从上到下的顺序,一个像素一个像素地传送:
行0: [像素][像素][像素]...[像素] → 行消隐 → 行1: [像素][像素][像素]...[像素] → 行消隐 → ... 行479: [像素]...[像素] → 场消隐 → 行0(下一帧): ...- HSYNC(行同步):每传完一行,发出一个同步脉冲,告诉显示器"换行"
- VSYNC(场同步):每传完一帧,发出一个同步脉冲,告诉显示器"回到第一行"
- HFP/HBP(行前/后肩):行消隐区内同步脉冲前后的空闲时间
- VFP/VBP(场前/后肩):场消隐区内同步脉冲前后的空闲行数
⚠️命名易混点:Front Porch(前肩)在同步脉冲之前,Back Porch(后肩)在同步脉冲之后。这个名字来自模拟电视时代——以消隐脉冲为参考,同步头前面叫"前肩",后面叫"后肩"。
二、行时序(Horizontal Timing)详解
一行的完整周期 = 有效像素 + 行消隐(HFP + HSW + HBP):
一行的完整时间 = HTOTAL |───────────────────────────────────────────────────────────────────| |← HBP →|←──────── 有效数据 (HACT) ────────→|← HFP →|← HSW →| ___ HSYNC: ─────────────────────────────────────────────────_| |____ DE: ─|████████████████████████████████████████████|──────────── ↑ ↑ 第0个像素 最后一个像素 D[23:0]: 像素0 像素1 像素2 ......... 像素799 (无效)各参数含义
| 参数 | 全称 | 含义 | 方向 |
|---|---|---|---|
| HACT | Horizontal Active | 一行有效像素数(如800) | — |
| HFP | Horizontal Front Porch | 有效数据结束→ 同步脉冲开始的空闲时间 | 同步脉冲前 |
| HSW | Horizontal Sync Width | HSYNC同步脉冲本身的宽度 | — |
| HBP | Horizontal Back Porch | 同步脉冲结束→ 下一行有效数据开始 | 同步脉冲后 |
关键公式:
HTOTAL = HACT + HFP + HSW + HBP📌 注意:有些芯片手册把 HSW 算进 HBP 里(即 HBP = 同步宽度+后肩),阅读手册时务必确认定义方式。
三、场时序(Vertical Timing)详解
把"一行"看成垂直方向上的一个单位,一帧的结构与一行完全对称:
一帧的完整时间 = VTOTAL(单位:行) |────────────────────────────────────────────────────────────| |← VBP →|←──── 有效行 (VACT,如480行) ────→|← VFP →|← VSW →| ___ VSYNC: ────────────────────────────────────────────────| |____ 行数据: 行0 行1 行2 ... 行479 (消隐行) (同步) (消隐行)各参数含义
| 参数 | 全称 | 含义 |
|---|---|---|
| VACT | Vertical Active | 一帧有效行数(如480) |
| VFP | Vertical Front Porch | 最后一行有效数据结束后 → VSYNC 前的空闲行数 |
| VSW | Vertical Sync Width | VSYNC 同步脉冲持续的行数 |
| VBP | Vertical Back Porch | VSYNC 结束后 → 第一行有效数据前的空闲行数 |
关键公式:
VTOTAL = VACT + VFP + VSW + VBP四、一帧图像的完整传输过程
下面以800×480 分辨率为例,完整走一遍流程:
像素时钟 PCLK ─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─...(每个时钟传1个像素) ↑ 每个上升沿采样数据 ═══════════════════════════════════════════════════════════════ 【阶段0】场消隐开始(上一帧的 VFP,13行) VSYNC=1(高), DE=0, 无有效数据传输 【阶段1】VSYNC 脉冲(VSW = 3行) VSYNC拉低(假设低有效):___|‾‾‾|___ ★ 显示器收到信号:"准备回到屏幕左上角,新一帧开始!" 【阶段2】场后肩(VBP = 29行) 仍然是消隐行,DE=0,不显示任何内容 【阶段3】有效行传输(VACT = 480行,逐行进行) ┌─ 每一行内部又细分为: │ ① HBP(40个PCLK):行消隐,DE=0 │ ② 有效像素(800个PCLK):DE=1,逐像素传输RGB数据 │ 像素0(RGB888) → 像素1 → ... → 像素799 │ ③ HFP(40个PCLK):行消隐,DE=0 │ ④ HSYNC 脉冲(HSW=48个PCLK):显示器换行 └─ 重复480次 【阶段4】回到阶段0,开始下一帧 ═══════════════════════════════════════════════════════════════像素级传输示意(一行内)
PCLK: ┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐ └┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘ DE: ───|████████████████████|─────────────────── ↑800个有效时钟↑ RGB: xxx|P0 |P1 |P2 |...|P799|xxx 每个时钟沿锁存一个24位像素 (R8+G8+B8) |←─ HACT=800 ─→|←HFP=40→|←HSW=48→|←HBP=40→| |←────────── HTOTAL = 928 ──────────────→|五、为什么需要这些"消隐区"?
历史原因(CRT 时代)
- 电子枪打完一行后,需要时间回扫到下一行开头(行回扫)
- 打完一帧后,需要时间回到屏幕顶部(场回扫)
- 回扫期间必须关闭电子束(消隐),否则屏幕上会有斜线
现代意义(LCD 时代依然保留)
- 兼容性:沿用标准时序,信号源/显示器统一接口
- 控制信号传输:消隐区可以传输非视频数据(如 HDMI 的音频包、信息帧)
- 时钟稳定:给源端和接收端留出 PLL 锁定、状态切换的时间
- 实现帧率/分辨率调整:增大消隐区可在不改变有效区域的情况下调整总时序
六、时钟与帧率计算(实例)
以800×480@60Hz的典型 LCD 时序为例:
| 参数 | 值 | 说明 |
|---|---|---|
| HACT | 800 | 行有效像素 |
| HFP | 40 | 行前肩 |
| HSW | 48 | 行同步宽度 |
| HBP | 40 | 行后肩 |
| HTOTAL | 928 | 行总周期 |
| VACT | 480 | 帧有效行 |
| VFP | 13 | 场前肩 |
| VSW | 3 | 场同步宽度 |
| VBP | 29 | 场后肩 |
| VTOTAL | 525 | 帧总行数 |
像素时钟计算:
PCLK = HTOTAL × VTOTAL × 帧率 = 928 × 525 × 60 ≈ 29.25 MHz验证一行时间:
行周期 = HTOTAL / PCLK = 928 / 29.25MHz ≈ 31.7 μs七、记忆要点总结
- ★扫描顺序:从左到右传像素,从上到下行,一行接一行
- ★HSYNC 管换行,VSYNC 管换帧
- ★Front Porch 在同步脉冲前,Back Porch 在同步脉冲后(以脉冲为中心记方向)
- ★HTOTAL = HACT + HFP + HSW + HBP;VTOTAL 同理
- ★PCLK = HTOTAL × VTOTAL × 帧率
- ★消隐区源自 CRT 回扫,现代用于传辅助数据和时序兼容
- ★ **DE(数据使能)**标记有效像素窗口:DE=1 的区域才是真实图像
先有hbp信号再有hsync信号吗?第一个hsync信号必须在第一个hact信号之后吗? 第一个vbp前肯定有一个vsync吗?
先有hbp信号再有hsync信号吗?第一个hsync信号必须在第一个hact信号之后吗? 第一个vbp前肯定有一个vsync吗?
问题1:先有 HBP 再有 HSYNC 吗?
不是,顺序相反:先有 HSYNC 脉冲,再有 HBP。
一行内的完整顺序(时间从左到右):
HACT(有效像素) → HFP → HSYNC脉冲(HSW) → HBP → 下一行HACT → ... ↑前肩 ↑后肩 同步之前 同步之后记忆方法:以同步脉冲为"分水岭"——
- Front Porch(前肩)= 脉冲之前
- Back Porch(后肩)= 脉冲之后
问题2:第一个 HSYNC 必须在第一个 HACT 之后吗?
不是,恰恰相反:第一个 HACT 之前必然有一个 HSYNC。
因为时序是周期性循环的,任何一段 HACT 都严格被夹在HBP ← HSYNC的后面:
... → HSYNC → HBP → HACT → HFP → HSYNC → HBP → HACT → ... ↑ ↑ 第N行的有效数据 第N+1行的有效数据即使是一帧的第一行,也不例外——帧开头是垂直消隐区(VSYNC + VBP),而水平时序从不停摆,VBP 期间 HSYNC 脉冲照常输出。第一个 HACT 到来前的最后一个消隐行里,必然有一个 HSYNC 脉冲 + HBP 为它"开路"。
问题3:第一个 VBP 前肯定有一个 VSYNC 吗?
肯定。与行时序完全对称,场方向也是严格循环的:
... → VSYNC脉冲(VSW) → VBP → VACT(有效行) → VFP → VSYNC → VBP → VACT → ...VBP 紧跟在 VSYNC 脉冲结束之后、有效行开始之前,不可能存在"没有 VSYNC 的 VBP"。
二、完整时序图(帧起始部分)
帧开始 ↓ ┌─────────────────────────────────────────────┐ VSYNC: ____|‾‾‾‾|__________________________________________ ←VSW→←────────── VBP ──────────→←──── VACT ────→ HSYNC: _|‾|_|‾|_|‾|_|‾|_|‾|_|‾|_|‾|_|‾|_|‾|_|‾|_|‾|_|‾|_|‾|_ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ 消隐行期间的HSYNC脉冲 ★第一个HACT前的HSYNC DE: ___________________________|█████████████|___________ ↑ 第一个HACT(第0行有效像素)关键点:
- 消隐区(VBP)内 HSYNC持续振荡,水平计数永不停止
- 每个 HACT 前面都有一个 HSYNC + HBP 作为"行开始标志"
- 每个 VACT 前面都有一个 VSYNC + VBP 作为"帧开始标志"
三、一句话总结
| 信号对 | 先后顺序 |
|---|---|
| HSYNC 与 HBP | HSYNC 在前,HBP 在后(HBP 是"后肩") |
| HSYNC 与 HACT | HSYNC 在前,HACT 在后(每个 HACT 前必有 HSYNC+HBP) |
| VSYNC 与 VBP | VSYNC 在前,VBP 在后(每个 VBP 前必有 VSYNC) |