作者:OpenFPGA
在游戏、影视和显示领域,4K 已经成为标配。而今天,我们就来聊聊——如何用 FPGA 实现 4K 视频的输入输出与处理。
从 HDMI 1.4 到 HDMI 2.0:瓶颈与突破
目前,大多数基于 HDMI 的 FPGA 图像处理方案,通常采用两种思路:
直接用 FPGA IO 管脚配置为 TMDS 接收/发送模式,详见下面链接;
https://github.com/Digilent/vivado-library
通过外部 HDMI PHY 收发芯片,将并行视频数据与 TMDS 信号互转。
这些方案在 HDMI 1.4 时代已经相当成熟,能够实现:
最高 4K@24Hz 视频输入输出
或者 1080p@120Hz 的高帧率显示
这样的性能足以满足多数中低速应用,比如工业检测、嵌入式显示屏等。
但问题来了——
要实现更流畅的 4K@60Hz 视频传输,就必须迈入 HDMI 2.0 时代。
挑战:18 Gbps 的带宽压力
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 处理 → 输出到显示器,实时显示高分辨率画面。
整个系统由以下几个关键模块组成:
AMD MicroBlaze™ 软核处理器
负责初始化与配置各个 IP 核;
通过串口菜单提供简易的系统控制界面;
控制时钟发生器(Clock Wizard)和视频参数。
HDMI RX 1.4 / 2.0 子系统
接收来自外部源(相机/笔记本)的 HDMI 信号;
将 TMDS 信号解码为 FPGA 可处理的视频流格式。
HDMI TX 1.4 / 2.0 子系统
将处理后的视频流重新编码为 TMDS 信号;
输出到 HDMI 显示设备(如 4K 显示器)。
视频物理层控制器(PHY Controller)
负责 HDMI 子系统与 FPGA 内部 GTH 收发器之间的接口;
管理数据传输与时钟同步。
视频测试模式生成器(TPG)
当没有外部视频输入时,可自动生成测试图案;
便于验证 HDMI 输出链路是否工作正常。
实践:基于 AMD 官方参考设计
整个方案的实现基于 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 in case 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 视频输入输出,为高性能视觉系统、视频采集卡、显示控制器等应用提供了强大支撑。
总结:FPGA,让 4K 不再遥远
过去,4K 视频处理常被认为是 GPU 或专用芯片的“主场”。 但如今,借助 AMD FPGA 强大的可编程逻辑与高速收发器, 4K@60Hz 视频系统 已能在单片 FPGA 上灵活实现。
未来,我们可以想象更多:
视频叠加、AI 视觉检测、HDR 动态调节……
这些都可以通过硬件逻辑实时完成。
参考设计