一、课程导论与开发环境搭建
各位同学,欢迎来到《HDMI输出与卷积加速综合实战》的第一课。
说实话,每次带新课我都挺兴奋的。这门课把两个看似不相关的领域——高清视频显示和神经网络加速——硬生生拧在了一起。你可能会问:为什么要把它们放一块儿?
我个人的理解是:视频处理是卷积神经网络最典型的落地场景之一。你想想看,一张1080p的图片,经过3x3卷积,计算量有多大?如果要在实时视频流上做这个操作,没有硬件加速根本跑不动。所以,学HDMI输出,本质上是在学怎么把数据喂进FPGA;学卷积加速,是在学怎么在FPGA里高效处理这些数据。两者缺一不可。
本章核心目标:搭建一套完整的HDMI输入输出环路,让FPGA开发板能够接收外部视频信号,经过处理后,再输出到显示器上。这是后续所有卷积加速实验的硬件基础。
1.1 HDMI显示技术概述
HDMI,全称High-Definition Multimedia Interface,中文叫高清多媒体接口。说白了,就是一根线,同时传视频和音频。
但FPGA工程师更关心的是它的电气特性。HDMI使用TMDS(Transition Minimized Differential Signaling)技术,也就是过渡最小化差分信号。这个名字很绕口,其实核心就两点:
- 差分信号:每个通道用两根线传,抗干扰能力强
- 编码算法:把8位数据编码成10位,减少信号跳变次数
我在项目中遇到过一个问题:用示波器看HDMI信号,发现眼图质量很差。排查了半天,原来是PCB上差分对的等长没做好。嗯,这里要提醒大家:差分信号的两根线,长度差不能超过5mil,否则时序会出问题。
HDMI的版本很多,从1.0到2.1。我们这门课用的是HDMI 1.4,支持1080p@60Hz,带宽10.2Gbps。对于卷积加速的演示来说,完全够用了。
| HDMI版本 | 最大带宽 | 支持分辨率 | 本课程使用 |
|---|---|---|---|
| 1.4 | 10.2 Gbps | 1080p@60Hz | ✅ 是 |
| 2.0 | 18 Gbps | 4K@60Hz | ❌ 否 |
| 2.1 | 48 Gbps | 8K@60Hz | ❌ 否 |
1.2 卷积神经网络基础
卷积神经网络,英文Convolutional Neural Network,简称CNN。你可能在AI新闻里听过这个词。但在FPGA工程师眼里,它就是一个乘累加运算的集合。
一个标准的卷积层,做的事情很简单:
- 拿一个3x3的卷积核(也叫滤波器),在输入图像上滑动
- 每次滑动,把卷积核里的9个数和图像上对应的9个像素相乘
- 把9个乘积加起来,得到一个输出值
- 滑完整个图像,得到一张新的特征图
为什么会用到FPGA来做这个事?因为卷积运算是高度并行的。一个3x3卷积,9个乘法可以同时做。GPU能做,但FPGA的延迟更低、功耗更小。我曾经在一个边缘计算项目里,用Artix-7实现了30fps的实时卷积处理,功耗才2.5W。换成GPU,至少15W起步。
我的经验:刚开始学CNN加速时,别一上来就搞复杂的网络结构。先从单层3x3卷积做起,把数据流打通了,再考虑层数叠加。我见过太多人一上来就搞ResNet,结果调试了三个月还没出图像。
1.3 FPGA开发板选型:Xilinx Artix-7
选Artix-7,说白了就是三个原因:便宜、够用、资料多。
Artix-7是Xilinx 7系列里的低功耗型号,28nm工艺。我们用的具体型号是XC7A35T,资源如下:
- 逻辑单元:33,280个
- DSP Slice:90个(做卷积乘法全靠它)
- Block RAM:1,800 Kb(存图像数据)
- 最大IO数量:250个
你可能觉得33K逻辑单元很少。没错,跟Virtex系列比确实少。但你要知道,一个3x3卷积加速器,大概只占2000个LUT。剩下的资源足够你搭一套完整的HDMI收发系统。
注意:Artix-7没有内置的HDMI硬核,必须用外部芯片做电平转换。我们用的开发板搭载了Silicon Image SiI9134作为HDMI发送器,ADV7611作为HDMI接收器。买板子的时候一定要确认这两个芯片在不在板上。
1.4 Vivado开发环境安装与配置
Vivado是Xilinx的官方开发工具。说实话,它挺吃资源的。我建议你的电脑至少要有16GB内存,否则综合一个中等规模的工程,能卡到你怀疑人生。
安装步骤我就不一步步截图了,说几个关键点:
- 版本选择:建议用Vivado 2019.1或2020.2,这两个版本对Artix-7支持最稳定。我踩过坑,用2022.2版本综合Artix-7工程,跑出来的时序报告有误。
- 安装选项:只勾选"Artix-7"器件支持,别全选。全选安装包要60GB,只选Artix-7只要15GB。
- License:WebPACK版本免费,够用了。不需要买付费License。
安装完成后,创建一个简单的测试工程,验证环境是否正常:
// 一个简单的LED闪烁测试
module led_test(
input clk, // 50MHz时钟
output reg led // 板载LED
);
reg [24:0] counter;
always @(posedge clk) begin
if (counter == 25_000_000) begin
counter <= 0;
led <= ~led;
end else begin
counter <= counter + 1;
end
end
endmodule
如果LED能按1秒的频率闪烁,说明Vivado安装成功,下载器驱动也正常。
1.5 硬件平台搭建:HDMI输入输出环路
这是本章的重头戏。我们要搭建一个HDMI环路:
- 输入:HDMI信号从外部设备(比如电脑、摄像头)进入FPGA
- 处理:FPGA对视频流做简单的像素处理(比如颜色反转)
- 输出:处理后的视频流通过HDMI输出到显示器
整个数据流是这样的:
外部设备 → HDMI线 → ADV7611(接收) → FPGA → SiI9134(发送) → HDMI线 → 显示器
下面我用SVG画一张本章的知识体系图,帮你理清各个模块的关系:
搭建这个环路,你需要准备以下硬件:
- Xilinx Artix-7开发板(带HDMI收发芯片)
- 两根HDMI线(一根输入,一根输出)
- 一台带HDMI输出的信号源(电脑、树莓派都行)
- 一台HDMI显示器
- Micro USB下载线(用于烧录FPGA)
连接方式很简单:信号源通过HDMI线连接到开发板的HDMI IN接口,开发板的HDMI OUT接口连接到显示器。下载线插到电脑上。
避坑指南:我曾经犯过一个低级错误——把HDMI IN和HDMI OUT插反了。结果折腾了半小时,显示器一直没信号。后来才发现,开发板上两个接口长得一模一样,但丝印标注了"IN"和"OUT"。所以,上电前一定先看丝印。
硬件连接完成后,我们烧录一个简单的环路测试程序。这个程序不做任何处理,直接把输入信号转发到输出:
// HDMI环路测试 - 直通模式
module hdmi_loopback(
input wire clk_50m,
// HDMI接收接口 (ADV7611)
input wire [23:0] rx_data,
input wire rx_hsync,
input wire rx_vsync,
input wire rx_de,
// HDMI发送接口 (SiI9134)
output wire [23:0] tx_data,
output wire tx_hsync,
output wire tx_vsync,
output wire tx_de
);
// 直通:接收端数据直接送到发送端
assign tx_data = rx_data;
assign tx_hsync = rx_hsync;
assign tx_vsync = rx_vsync;
assign tx_de = rx_de;
endmodule
如果显示器上能正常显示信号源的画面,恭喜你,硬件平台搭建成功!
嗯,到这里,第一章的内容就差不多了。我们完成了HDMI技术概述、CNN基础概念、开发板选型、Vivado安装,以及最重要的——硬件环路搭建。下一章,我们会深入HDMI的时序细节,教你如何用FPGA生成标准的HDMI视频信号。
可可精品资料库