基于纯 Verilog FPGA 的双线性插值视频缩放设计
在易灵思 Ti60F225 钛金系列 FPGA 上实现'端到端'4K@60 视频缩放链路,是一个对资源与延迟都有严苛要求的挑战。本方案的目标是将任意分辨率(640×480–3840×2160)的 HDMI 输入实时缩放到用户指定分辨率,并通过 HDMI 输出。整个链路不依赖外部 DDR,仅使用片内 6.3 Mbit 嵌入式 SRAM 完成行缓存,实现 < 2 ms 的端到端固定延迟,满足医疗内窥镜、工业检测、直播导播台等低延迟场景需求。
系统架构思路
整个系统划分为三个主要子系统,数据流如下:
┌─────────────┐ ┌──────────────┐ ┌──────────────┐
│ HDMI-RX │ AXI-S│ 缩放核心 │ AXI-S│ HDMI-TX │
│ 解码 4:4:4 │----->│ 双线性插值 │----->│ 编码 4:4:4 │
└─────────────┘ └──────────────┘ └──────────────┘
↑ ↑ ↑
200 MHz 300 MHz 297 MHz
参考时钟 像素时钟 TMDS 时钟
1. 视频接收子系统
使用 FPGA 高速 LVDS 硬核接收 3 通道 TMDS 差分信号;内置 DVI 解码器完成 8b/10b 解码、字对齐、通道绑定;输出 24 bit RGB 像素流 + hsync/vsync/de,符合 AXI4-Stream 协议。
2. 缩放子系统(核心重点)
仅缓存'两行'原始像素,采用'滑动窗口'机制;基于定点 12 bit 小数运算完成双线性插值;输出像素流再次封装为 AXI4-Stream,保持时钟域隔离。
3. 视频发送子系统
将缩放后像素打包成 TMDS 流;支持 480p–4K@60 多种 VESA 时序,通过 EDID 动态协商。
4. 控制面
32 位 RISC-V 软核(Ti60F225 内嵌)通过 AXI-Lite 寄存器提供输入/输出分辨率设置、缩放系数(浮点→定点转换由软件完成)、伽马曲线索引(2.2 / 1.8 / sRGB 三档)。UART 调试口可实时打印链路状态(帧率、丢包、错误中断)。
缩放核心算法设计
算法选择
在面积与画质之间权衡,我们选用了'双线性插值'。每通道仅需 2 个乘法器、4 个加法器,PSNR 比最近邻提升 6–8 dB,且行缓存仅 2 行,远低于三次卷积带来的资源开销。
定点化方案
缩放系数定义为 ratio = src_height / dst_height。采用 12 bit 定点小数(8.4 格式),保证最大 8×放大时误差 < 1/16 像素。
滑动窗口缓存
使用双口 SRAM(真双口,512×24 bit×2 行)实现'乒乓'结构:写口按源像素时钟顺序写入当前行;读口根据垂直系数生成'窗口地址',一次读出 2×2 邻域像素。带宽方面,读口 2×24 bit/周期,写口 1×24 bit/周期,总带宽 72 bit/周期 @ 300 MHz ≈ 21.6 Gbit/s,完全满足 4K@60 需求。
插值流水线
采用三级流水:
- 系数计算:根据 dst_y 小数部分生成 w00/w01/w10/w11;
- 水平插值:对 2×2 窗口做两次乘加,得到中间值 p0、p1;
- 垂直插值:p0、p1 加权求和,输出最终像素。 每级流水 1 周期,总延迟 3 周期 ≈ 10 ns,几乎可忽略。


