4. 刷新延迟的构成:显示刷新周期、SPI传输延迟、LUT计算延迟的分解
在嵌入式显示系统中,刷新延迟是衡量系统实时性与流畅度的核心指标。本章将刷新延迟拆解为三个相互独立的组成部分:显示刷新周期、SPI传输延迟与LUT计算延迟。理解每一部分的物理含义与数学表达,是后续进行协同优化的基础。
4.1 延迟分解总览
一次完整的帧刷新过程可抽象为以下流水线:
- LUT计算:根据输入数据与查找表生成像素值。
- SPI传输:将像素数据通过SPI总线发送至显示控制器。
- 显示刷新:显示控制器按行/帧周期将数据刷新至屏幕。
总刷新延迟 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架构图
下图展示了刷新延迟的三层分解结构,以及各分量之间的时序关系:
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,为后续优化留出充足余量。