
在游戏、影视和显示领域,4K 已经成为标配。而今天,我们就来聊聊——如何用 FPGA 实现 4K 视频的输入输出与处理。
目前,大多数基于 HDMI 的 FPGA 图像处理方案,通常采用两种思路:
https://github.com/Digilent/vivado-library
这些方案在 HDMI 1.4 时代已经相当成熟,能够实现:
✅ 最高 4K@24Hz 视频输入输出
✅ 或者 1080p@120Hz 的高帧率显示
这样的性能足以满足多数中低速应用,比如工业检测、嵌入式显示屏等。
但问题来了——
要实现更流畅的 4K@60Hz 视频传输,就必须迈入 HDMI 2.0 时代。
HDMI 2.0 标准要求带宽高达 18 Gbps,这远远超过传统 FPGA I/O 能承受的速率。
而在这类高带宽设计中,高速串行收发器(GTH/GTY) 就成了关键。
在这方面,AMD Artix™ UltraScale+™ FPGA 表现亮眼。 它内部集成的 GTH 收发器 可支持 最高 6 Gbps 的速率,完全能胜任 4K@60Hz 的传输需求。
这也意味着:我们终于能在一块 FPGA 上,完整跑通 HDMI 2.0 的 4K 视频链路!
本项目的目标,是构建一个简洁高效的 4K 视频直通参考设计(Pass-through Design)。
简单来说,就是——
从相机或笔记本电脑输入 HDMI 视频 → FPGA 处理 → 输出到显示器,实时显示高分辨率画面。
整个系统由以下几个关键模块组成:
负责初始化与配置各个 IP 核;
通过串口菜单提供简易的系统控制界面;
控制时钟发生器(Clock Wizard)和视频参数。
接收来自外部源(相机/笔记本)的 HDMI 信号;
将 TMDS 信号解码为 FPGA 可处理的视频流格式。
将处理后的视频流重新编码为 TMDS 信号;
输出到 HDMI 显示设备(如 4K 显示器)。
负责 HDMI 子系统与 FPGA 内部 GTH 收发器之间的接口;
管理数据传输与时钟同步。
当没有外部视频输入时,可自动生成测试图案;
便于验证 HDMI 输出链路是否工作正常。
整个方案的实现基于 AMD 官方 HDMI 参考设计,在此基础上进行了调整与优化:
增加了对 HDMI 2.0 帧率与分辨率的支持;
通过 MicroBlaze 实现灵活的软件可配置控制;
充分利用 Artix UltraScale+ 的 GTH 特性,实现稳定的高速传输。
我不清楚我电脑里Vivado为啥都有license,如果没有的话可以通过官网申请试用,详见:
这里提供一个网络下载的license,我电脑里应该时安装了这个,大家可以尝试一下:

在 AMD Vivado™ 设计套件中创建设计之前,我们打开一个针对 VCU118 的项目。

项目打开后,打开 IP 库并选择 HDMI 1.4 / 2.0 接收器子系统。

这会将 IP 添加到项目中。选择 IP。

右键单击选定的 IP,然后选择“打开 IP 示例设计”。

对话框打开后,选择要存储项目的位置。

这将打开一个针对 VCU118 的示例设计。我们需要将目标板更改为自己的开发板。

更换FPGA芯片IP会被锁定,需要更新:

更新选定的 IP 并重新运行 IP 状态报告,IP 现在应该显示为最新的。

下一步是对视频 PHY 控制器进行修改,以更新 AMD Artix™ UltraScale+™ 设备上提供的 GTHE4。确保将时钟原语设置为 PLL。

设计应如下所示。

在本设计中,视频通过 TGP 从 HDMI Rx 传输到 HDMI Tx。为了确保能够支持最高的分辨率和帧率,视频像素以每时钟 2 像素或每时钟 4 像素的速率提供(取决于模块的配置)。
该设计的架构如下所示。外部传输路径使用 Display Port 转 HDMI 转换器,接收器使用 TMDS 重定时器。

在内部,视频物理层控制器(Video Phy Controller)与 GTH 收发器相连,用于发送(Tx)和接收(Rx)操作,并为 HDMI 发送端和接收端各提供 3 条数据通道(data lane)。这些通道与 HDMI 子系统相互连接。

HDMI 解决方案需要多个 IIC 接口用于连接 HDMI Tx 和 Rx 的 DDC,这些 DDC 直接连接或来自 HDMI Tx/Rx 子系统。这些解决方案还需要 IIC 接口用于 SN65DP159RGZT 和 TMS181(驱动和均衡芯片),用于改善输入和输出 GTH 信号。
我们还需要第二个通道 AXI IIC 连接到时钟发生器。该时钟发生器提供 GTH 参考时钟。
本次板卡的 IIC 网络如下所示。

在 AMD MicroBlaze™ 处理器模块内,添加第二个 AXI IIC 并将其信号连接到外部。

修改约束后就可以进行综合实现了~
从 AMD Vivado™ 设计套件导出 XSA,有了 XSA,我们可以在 AMD Vitis™ 统一软件平台中创建一个简单的 Hello World 应用程序。这个 Hello World 应用程序将创建一个平台和一个应用程序。编译并运行 Hello World 应用程序确保我们能够在 AMD MicroBlaze 处理器上生成并运行应用程序。

现在我们知道我们有一个可行的系统,并且可以在 AMD MicroBlaze™ 处理器上执行程序,我们需要为 HDMI 直通创建应用软件。
在平台中,打开 platform.spr 文件并选择板级支持包 (Board Support Package)。在板级支持包下,向下滚动找到 v_hdmi_rx_ss 驱动程序,然后选择导入示例。

这将为我们提供一系列应用示例。在本例中,我们将使用 Passthrough_MicroBlaze。

这样就创建好了应用程序。不过,我们需要对主应用程序示例进行一些修改,确保时钟发生器芯片配置正确。
主要的修改是对条件编译进行修改,更改正在编程的 I2C 时钟发生器类型。默认情况下,软件预期编程 Si5324 设备,而 我们的开发板具有瑞萨 8T49N24 时钟发生器设备。
int I2cClk(u32 InFreq, u32 OutFreq)
{
int Status;
//#if (!defined XPS_BOARD_ZCU104)
#if (defined XPS_BOARD_ZCU104)
/* Free running mode */
if (InFreq == 0) {
Status = Si5324_SetClock((XPAR_IIC_0_BASEADDR),
(I2C_CLK_ADDR),
(SI5324_CLKSRC_XTAL),
(SI5324_XTAL_FREQ),
OutFreq);
if (Status != (SI5324_SUCCESS)) {
xil_printf("Error programming SI5324\r\n");
return 0;
}
}
/* Locked mode */
else {
Status = Si5324_SetClock((XPAR_IIC_0_BASEADDR),
(I2C_CLK_ADDR),
(SI5324_CLKSRC_CLK1),
InFreq,
OutFreq);
if (Status != (SI5324_SUCCESS)) {
xil_printf("Error programming SI5324\r\n");
return 0;
}
}
#else
/* Reset I2C controller before issuing new transaction.
* This is required torecover the IIC controller incase a previous
* transaction is pending.
*/
XIic_WriteReg(XPAR_IIC_0_BASEADDR, XIIC_RESETR_OFFSET,
XIIC_RESET_MASK);
/* Free running mode */
if (InFreq == 0) {
Status = IDT_8T49N24x_SetClock((XPAR_IIC_0_BASEADDR),
(I2C_CLK_ADDR),
(IDT_8T49N24X_XTAL_FREQ),
OutFreq,
TRUE);
if (Status != (XST_SUCCESS)) {
print("Error programming IDT_8T49N241\r\n");
return 0;
}
}
/* Locked mode */
else {
Status = IDT_8T49N24x_SetClock((XPAR_IIC_0_BASEADDR),
(I2C_CLK_ADDR),
InFreq,
OutFreq,
FALSE);
if (Status != (XST_SUCCESS)) {
print("Error programming IDT_8T49N241\r\n");
return 0;
}
}
#endif
return 1;
}
为了确保软件应用程序能够适应所提供的 256KB 内存,将优化级别设置为 O1。

完成这些更改后,我们就可以构建应用程序并在开发板上进行调试。完整的源代码可以在 git 项目中获取。
https://github.com/ATaylorCEngFIET/4K-at-60Hz
测试非常简单。我们需要提供一个 HDMI 接收器和一个 HDMI 源。
初始测试的 HDMI 接收器是一台支持 4K 的显示器和一台支持 1080p 的小型显示器。HDMI 源是一台 4K 运动相机,它也可以切换输出模式。

打开电路板并下载应用程序进行调试。

运行应用程序,将 HDMI 接收器和源连接到摄像头,并将分辨率设置为 1080P。它会显示正在传输的图像。

运行该应用程序将通过 UART 输出一个菜单。通过此菜单,我们可以控制在 AMD MicroBlaze 处理器上运行的应用程序。此外,我们还可以提取有关图像处理流水线的配置和性能的信息。

按“i”将提供有关 HDMI TX 和 RX 子系统的信息。



我们还可以通过终端提取 GTH 日志。

将 HDMI 接收器连接到支持 4K 的显示器后,我们可以看到更新后的分辨率。
这套设计能在 FPGA 平台上轻松实现 4K@60Hz 视频输入输出,为高性能视觉系统、视频采集卡、显示控制器等应用提供了强大支撑。
过去,4K 视频处理常被认为是 GPU 或专用芯片的“主场”。 但如今,借助 AMD FPGA 强大的可编程逻辑与高速收发器, 4K@60Hz 视频系统 已能在单片 FPGA 上灵活实现。
未来,我们可以想象更多:
视频叠加、AI 视觉检测、HDR 动态调节……
这些都可以通过硬件逻辑实时完成。
https://github.com/ATaylorCEngFIET/4K-at-60Hz