一、课程导论与开发环境搭建

各位同学,欢迎来到《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工程师眼里,它就是一个乘累加运算的集合。

一个标准的卷积层,做的事情很简单:

  1. 拿一个3x3的卷积核(也叫滤波器),在输入图像上滑动
  2. 每次滑动,把卷积核里的9个数和图像上对应的9个像素相乘
  3. 把9个乘积加起来,得到一个输出值
  4. 滑完整个图像,得到一张新的特征图

为什么会用到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内存,否则综合一个中等规模的工程,能卡到你怀疑人生。

安装步骤我就不一步步截图了,说几个关键点:

  1. 版本选择:建议用Vivado 2019.1或2020.2,这两个版本对Artix-7支持最稳定。我踩过坑,用2022.2版本综合Artix-7工程,跑出来的时序报告有误。
  2. 安装选项:只勾选"Artix-7"器件支持,别全选。全选安装包要60GB,只选Artix-7只要15GB。
  3. 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画一张本章的知识体系图,帮你理清各个模块的关系:

第一章:课程导论与开发环境搭建 - 知识体系 HDMI显示技术 TMDS编码/差分信号 卷积神经网络 乘累加/并行计算 Artix-7开发板 XC7A35T/SiI9134 Vivado环境 安装/综合/下载 硬件平台搭建:HDMI输入输出环路 外部设备 → ADV7611 → FPGA → SiI9134 → 显示器 HDMI输入(ADV7611接收) I2C配置/像素时钟恢复 FPGA像素处理 颜色反转/卷积加速 HDMI输出(SiI9134发送) TMDS编码/差分输出 注:本课程所有实验均基于此硬件环路,后续章节将逐步替换"像素处理"模块为卷积加速器

搭建这个环路,你需要准备以下硬件:

  • 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视频信号。


可可精品资料库