一、整体概念:一帧图像是"逐行扫描"出来的
一帧图像不是一次性传输的,而是按照 从左到右、从上到下 的顺序,一个像素一个像素地传送:
行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 → ...
↑前肩 ↑后肩
同步之前 同步之后
记忆方法:以同步脉冲为"分水岭"------
- F ront Porch(前肩)= 脉冲之前
- B ack 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) |