Quick Start
- 安装 Vivado 2019.1+ 或 Quartus Prime 20.1+,确保支持 7 系列或以上 FPGA 器件。
- 准备一块带 HDMI 输入/输出接口的 FPGA 开发板(如 Xilinx Artix-7 AC701)。
- 下载或创建工程,包含顶层模块
video_scaler_top,例化双线性插值 IP 核或手写 RTL。 - 在 Vivado 中运行综合(Synthesis),检查无严重警告(CRITICAL WARNING)。
- 运行实现(Implementation),确保时序收敛(Setup Slack > 0)。
- 生成比特流并下载到开发板。
- 连接 HDMI 输入源(如 1080p@60Hz 摄像头),在 HDMI 输出端观察缩放后的图像(如 720p)。
- 验证图像无撕裂、无明显锯齿,延迟小于 1 帧。
前置条件与环境
| 项目 | 推荐值 | 替代方案 |
|---|---|---|
| 器件/板卡 | Xilinx Artix-7 XC7A200T 或 Zynq-7000 | Intel Cyclone V / Arria 10 |
| EDA 版本 | Vivado 2019.1 或 Quartus Prime 20.1 | Vivado 2020.1+ / Quartus II 13.0+ |
| 仿真器 | Vivado Simulator 或 ModelSim SE-64 10.6c | VCS / QuestaSim |
| 时钟/复位 | 输入时钟 148.5 MHz(1080p),异步复位低有效 | 自定义 PLL 生成像素时钟 |
| 接口依赖 | HDMI 1.4 输入/输出(TMDS 编码) | VGA 或 MIPI CSI-2 桥接 |
| 约束文件 | XDC 或 SDC 约束:时钟周期、输入输出延迟、伪路径 | 自动时序分析(仅仿真) |
| IP 核 | Video Timing Controller(VTC) + AXI-Stream to Video Out | 手写时序生成器 |
| 存储带宽 | 至少 2 个 32-bit DDR3 通道(1066 MT/s) | 内部 Block RAM 缓存(仅小尺寸) |
目标与验收标准
- 功能点:支持从 1920x1080 缩放至 1280x720(或其他比例),输出图像无几何失真。
- 性能指标:处理延迟 ≤ 1 行(水平消隐期);帧率保持 60 fps。
- 资源/Fmax:LUT ≤ 1500,DSP48 ≤ 8,BRAM ≤ 4 块;最大工作频率 ≥ 150 MHz。
- 关键波形/日志:仿真波形显示插值系数正确;上板后图像平滑、无闪烁。
- 验收方式:使用测试图案(如棋盘格、彩条)验证缩放后边缘无混叠;使用示波器测量行/场同步时序。
实施步骤
1. 工程结构
- 顶层:
video_scaler_top(包含 PLL、HDMI 收发器、缩放核心)。 - 缩放核心:
bilinear_scaler(计算坐标、读取源像素、加权求和)。 - 行缓冲:
line_buffer(使用 BRAM 实现 2 行缓存)。 - 时序控制:
vtc_gen(生成输出同步信号)。
// 顶层模块例化示例
video_scaler_top u_top (
.clk_pixel (clk_pixel), // 148.5 MHz
.rst_n (rst_n),
.hdmi_in_clk (hdmi_in_clk),
.hdmi_in_data (hdmi_in_data),
.hdmi_out_clk (hdmi_out_clk),
.hdmi_out_data (hdmi_out_data)
);2. 关键模块:双线性插值核心
原理:根据目标像素坐标映射回源图像,计算四个邻近像素的加权平均。权重由小数部分决定。
module bilinear_scaler #(
parameter SRC_W = 1920,
parameter SRC_H = 1080,
parameter DST_W = 1280,
parameter DST_H = 720
) (
input wire clk,
input wire rst_n,
input wire [7:0] src_pixel [0:3], // 四邻域像素
input wire [11:0] frac_x, // 小数部分,Q12格式
input wire [11:0] frac_y,
output reg [7:0] dst_pixel
);
wire [19:0] w0, w1, w2, w3;
assign w0 = (256 - frac_x) * (256 - frac_y);
assign w1 = frac_x * (256 - frac_y);
assign w2 = (256 - frac_x) * frac_y;
assign w3 = frac_x * frac_y;
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
dst_pixel <= 8'd0;
else
dst_pixel <= (w0 * src_pixel[0] + w1 * src_pixel[1] + w2 * src_pixel[2] + w3 * src_pixel[3]) >> 16;
end
endmodule验证结果
- 仿真验证:在 Vivado Simulator 中运行测试激励,检查插值系数计算是否正确,输出像素值符合预期。
- 上板验证:将比特流下载至开发板,连接 HDMI 输入源(如 1080p@60Hz 测试图案),观察 HDMI 输出端图像,确认无撕裂、无锯齿,延迟小于 1 帧。
- 时序分析:在实现后检查 Setup Slack > 0,确保工作频率 ≥ 150 MHz。
排障指南
- 图像撕裂:检查行/场同步时序是否对齐,确认 VTC 模块配置正确。
- 锯齿明显:确认小数部分精度足够(Q12 格式),或考虑增加插值阶数。
- 时序违例:优化关键路径,减少组合逻辑级数,或增加流水线寄存器。
- BRAM 不足:若缩放尺寸较大,改用 DDR 缓存替代内部 BRAM。
扩展建议
- 支持更多分辨率:通过参数化模块,动态配置输入/输出分辨率。
- 提高插值质量:升级为双三次插值或 Lanczos 算法,但需更多 DSP 和 BRAM 资源。
- 集成到视频处理流水线:将缩放模块与色彩空间转换、帧率转换等模块级联。
参考文档
- Xilinx PG043: Video Timing Controller v6.2
- Xilinx PG044: AXI4-Stream to Video Out v4.0
- IEEE 1149.1: JTAG Boundary-Scan
附录
附录 A:双线性插值原理详解
双线性插值通过目标像素坐标映射回源图像,计算四个邻近像素的加权平均。权重由小数部分决定,公式如下:
设源图像坐标为 (x, y),小数部分为 (dx, dy),则插值结果为:
P = (1-dx)*(1-dy)*P00 + dx*(1-dy)*P10 + (1-dx)*dy*P01 + dx*dy*P11
附录 B:时序约束示例(XDC)
create_clock -period 6.734 [get_ports clk_pixel]
set_input_delay -clock clk_pixel 2.0 [get_ports hdmi_in_data*]
set_output_delay -clock clk_pixel 2.0 [get_ports hdmi_out_data*]附录 C:资源利用率参考
| 资源类型 | 使用量 | 可用量 | 利用率 |
|---|---|---|---|
| LUT | 1200 | 134600 | 0.89% |
| DSP48 | 6 | 740 | 0.81% |
| BRAM | 3 | 365 | 0.82% |






