4. 刷新延迟的构成:显示刷新周期、SPI传输延迟、LUT计算延迟的分解

在嵌入式显示系统中,刷新延迟是衡量系统实时性与流畅度的核心指标。本章将刷新延迟拆解为三个相互独立的组成部分:显示刷新周期、SPI传输延迟与LUT计算延迟。理解每一部分的物理含义与数学表达,是后续进行协同优化的基础。

4.1 延迟分解总览

一次完整的帧刷新过程可抽象为以下流水线:

  1. LUT计算:根据输入数据与查找表生成像素值。
  2. SPI传输:将像素数据通过SPI总线发送至显示控制器。
  3. 显示刷新:显示控制器按行/帧周期将数据刷新至屏幕。

总刷新延迟 T_total 并非三者简单相加,而是由最慢的环节决定,且存在并行重叠。下表给出了各延迟分量的典型取值范围与主导因素:

延迟分量 符号 典型范围 主导因素
显示刷新周期 T_display 8.33 ms – 16.67 ms 帧率(60 Hz – 120 Hz)
SPI传输延迟 T_spi 0.5 ms – 5 ms SPI时钟频率、数据位宽、DMA模式
LUT计算延迟 T_lut 0.1 ms – 2 ms LUT深度、并行度、流水线级数
工程提示: 在60 Hz刷新率下,T_display固定为16.67 ms。若T_spi + T_lut < 16.67 ms,则总延迟由显示周期决定;反之,则需优化SPI或LUT以避免帧丢失。

4.2 显示刷新周期(T_display)

显示刷新周期由屏幕的物理刷新率决定,是系统中最刚性的延迟分量。对于标准TFT-LCD或OLED显示屏,刷新率通常为60 Hz、90 Hz或120 Hz,对应周期为:

T_display = 1 / F_refresh

示例:
F_refresh = 60 Hz  →  T_display = 16.67 ms
F_refresh = 90 Hz  →  T_display = 11.11 ms
F_refresh = 120 Hz →  T_display = 8.33 ms

显示刷新周期包含三个子阶段:

  • 垂直消隐期(VBlank):帧与帧之间的空闲时间,可用于数据准备。
  • 行扫描期:逐行输出像素数据至屏幕。
  • 水平消隐期(HBlank):行与行之间的短暂间隙。

在嵌入式系统中,通常利用VBlank期间启动SPI传输或LUT预计算,以隐藏部分延迟。

关键指标: 显示刷新周期是系统延迟的下限。即使SPI和LUT延迟为零,总延迟也不可能低于T_display。

4.3 SPI传输延迟(T_spi)

SPI传输延迟取决于数据量、时钟频率与传输模式。对于分辨率为W×H、颜色深度为B的帧,单帧数据量为:

Data_per_frame = W × H × B / 8  (bytes)

示例:320 × 240 × 16 bit = 153,600 bytes

SPI传输延迟的计算公式为:

T_spi = (Data_per_frame × 8) / F_spi + T_overhead

其中:
- F_spi:SPI时钟频率(Hz)
- T_overhead:片选切换、DMA启动、中断处理等开销

下表给出了不同SPI时钟频率下的理论传输延迟(忽略开销):

分辨率 颜色深度 数据量 F_spi = 20 MHz F_spi = 40 MHz F_spi = 80 MHz
128 × 64 1 bit 1,024 B 0.41 ms 0.20 ms 0.10 ms
320 × 240 16 bit 153,600 B 61.44 ms 30.72 ms 15.36 ms
480 × 320 16 bit 307,200 B 122.88 ms 61.44 ms 30.72 ms
注意: 对于320×240分辨率,即使SPI时钟达到80 MHz,理论传输延迟仍接近一个显示周期(16.67 ms)。实际系统中还需考虑DMA配置、中断响应与总线竞争,T_spi通常比理论值高10%–30%。

4.4 LUT计算延迟(T_lut)

LUT计算延迟指从输入数据到达至查找表输出有效像素值所需的时间。在FPGA实现中,LUT通常以组合逻辑或流水线寄存器形式存在:

  • 组合LUT:延迟为逻辑门传播延迟,通常在纳秒级,可忽略不计。
  • 流水线LUT:每级流水线增加一个时钟周期延迟,总延迟 = 流水线级数 × 时钟周期。
  • 块RAM(BRAM)LUT:读取延迟为1–2个时钟周期,适合大深度查找表。

对于像素级LUT计算,延迟可表示为:

T_lut = N_pipeline × T_clk + T_mem

其中:
- N_pipeline:流水线级数(通常为1–4级)
- T_clk:FPGA工作时钟周期(例如 10 ns @ 100 MHz)
- T_mem:BRAM读取延迟(通常为1–2个T_clk)

以100 MHz系统时钟、3级流水线、BRAM读取延迟2个时钟为例:

T_lut = 3 × 10 ns + 2 × 10 ns = 50 ns

这一延迟远小于显示刷新周期与SPI传输延迟,但在以下场景中可能成为瓶颈:

  • 多通道并行LUT:同时处理多个像素时,BRAM端口冲突导致等待。
  • 动态LUT更新:在帧间切换查找表内容时,需额外写入周期。
  • 级联LUT链:多个查找表串联实现复杂映射时,流水线深度增加。

4.5 延迟分解的SVG架构图

下图展示了刷新延迟的三层分解结构,以及各分量之间的时序关系:

刷新延迟分解架构图 总刷新延迟 T_total 显示刷新周期 T_display = 1 / F_refresh SPI传输延迟 T_spi = Data × 8 / F_spi LUT计算延迟 T_lut = N_pipe × T_clk 子阶段 • 垂直消隐期 (VBlank) • 行扫描期 • 水平消隐期 (HBlank) 影响因素 • SPI时钟频率 • 数据位宽 / 帧大小 • DMA vs 轮询模式 实现方式 • 组合逻辑 LUT • 流水线寄存器 • BRAM 查找表 延迟分解关键结论 T_total ≈ max(T_display, T_spi + T_lut) | 利用VBlank隐藏SPI/LUT延迟可降低有效延迟 优化目标:使 T_spi + T_lut < T_display,实现无帧丢失刷新

4.6 延迟叠加与隐藏策略

在实际系统中,三个延迟分量并非完全串行执行。通过合理的流水线设计,可以实现部分重叠:

  • 并行模式:LUT计算与SPI传输同时进行,T_total ≈ max(T_lut, T_spi) + T_display。
  • VBlank隐藏:在垂直消隐期内完成LUT计算与SPI传输,T_total ≈ T_display。
  • 双缓冲:后台帧准备(LUT+SPI)与前台显示刷新并行,有效延迟降低至一个帧周期。
工程实践要点: 在FPGA设计中,将LUT计算流水线深度控制在3级以内,并利用DMA+双缓冲机制,可使T_spi + T_lut < 0.5 × T_display,为后续优化留出充足余量。

4.7 本章小结