第一章:课程导论与开发环境搭建

各位同学好,我是你们的讲师。做了十几年数字IC和FPGA设计,踩过的坑比走过的路还多(笑)。今天咱们开始《卷积加速器从设计到上板实战》的第一章。这一章说白了就是两件事:搞懂我们要做什么,以及把吃饭的家伙准备好。

1.1 卷积神经网络基础——别怕,咱们只讲用得上的

很多人一听到“神经网络”就头大,觉得是搞算法的人的事。其实不然。作为硬件工程师,我们只需要知道卷积是怎么算的,以及怎么把它算得快。

卷积操作,说白了就是“滑动窗口乘加”。你想想看:

  • 输入是一张图片(比如224x224x3)
  • 卷积核是一个小窗口(比如3x3x3)
  • 窗口在图片上滑过,每个位置做一次乘加运算

嗯,就这么简单。但问题来了——一张图片可能有几百万个像素,一个网络可能有几十层卷积。算一次乘加只要一个时钟周期,但几亿次乘加呢?这就是我们要用硬件加速的原因。

核心数据流:卷积加速器本质上是一个“数据搬运+乘加阵列”的引擎。数据搬得快,算得就快。

我在项目中遇到过最头疼的事:算法团队给了一个200层的ResNet,说“帮我加速一下”。我一看,光权重就有几十兆。所以咱们这门课选的网络不会太夸张,但足够让你理解加速器的设计精髓。

1.2 加速器设计目标——我们要造个什么样的东西?

做加速器,不是把代码写完就完事了。你得想清楚几个问题:

  1. 性能目标: 每秒处理多少张图?延迟多少毫秒?
  2. 资源约束: 你手头的FPGA有多少LUT、DSP、BRAM?
  3. 精度要求: 用float32还是int8?量化怎么做?

我个人习惯,先定一个“够用”的目标。比如咱们这门课,目标就是:在Xilinx Artix-7系列FPGA上,实现一个能跑通VGG-16的卷积加速器,处理一张224x224的图,延迟不超过100ms。

避坑指南: 我曾经一上来就想做最牛的加速器,结果资源爆了,时序也跑不过。后来学乖了——先做出来,再优化。这是铁律。

下面这张图,是我对咱们整个课程知识体系的梳理。你看一眼,心里就有谱了:

卷积加速器课程知识体系 卷积神经网络基础 卷积/池化/激活/量化 开发环境搭建 Vivado/Modelsim/Python 加速器设计目标 性能/资源/精度/延迟 加速器核心架构设计 数据流/控制流/存储架构/并行度 RTL模块实现 MAC阵列/缓存/控制器 仿真与验证 Testbench/波形/覆盖率 上板调试 ILA/VIO/实测对比

1.3 Vivado开发环境安装与配置——磨刀不误砍柴工

好,理论说完了,咱们来点实际的。Vivado是Xilinx家的FPGA开发工具,咱们这门课用的是Vivado 2020.2版本。为什么选这个版本?因为我试过,稳定,坑少。

1.3.1 安装前的准备

先看看你的电脑够不够格:

项目 最低要求 推荐配置
操作系统 Windows 10 64位 / Ubuntu 18.04 Windows 10 64位 / Ubuntu 20.04
CPU i5 第8代 i7 第10代或以上
内存 8 GB 16 GB(我建议32GB)
硬盘 60 GB 空闲 SSD 120 GB 以上

注意: 安装路径不要有中文!不要有空格!我曾经因为路径里有个“(1)”,折腾了一下午没找到问题。血的教训。

1.3.2 安装步骤(精简版)

  1. 去Xilinx官网下载Vivado HLx 2020.2 WebPACK版本(够用了)
  2. 解压后以管理员身份运行 xsetup.exe
  3. 选择“Vivado HL WebPACK”安装选项
  4. 勾选“Design Tools”和“Devices”中的7系列(咱们用Artix-7)
  5. 等待...大概30分钟到1小时,取决于你的网速和硬盘

安装完成后,打开Vivado,你会看到这个界面:

Vivado 2020.2
  ├── Quick Start
  │   ├── Create Project
  │   ├── Open Project
  │   └── Open Example
  ├── Tasks
  │   ├── Project Manager
  │   ├── IP Integrator
  │   ├── Simulation
  │   ├── Synthesis
  │   └── Implementation
  └── Learning Center
      └── Documentation & Tutorials

1.3.3 环境验证——跑个Hello World

安装完别急着走,咱们验证一下环境好不好使。写个最简单的LED闪烁代码:

module led_blink(
    input  wire clk,      // 50MHz 时钟
    input  wire rst_n,    // 复位,低有效
    output reg  led       // LED输出
);

reg [24:0] cnt;

always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        cnt <= 25'd0;
    else
        cnt <= cnt + 1'b1;
end

always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        led <= 1'b0;
    else if (cnt == 25'd24_999_999)  // 0.5秒翻转一次
        led <= ~led;
end

endmodule

综合、实现、生成比特流。如果一切顺利,你会看到“Bitstream generation successfully completed”的提示。嗯,这就说明你的环境没问题了。

小技巧: 第一次综合可能会比较慢,Vivado在后台建立缓存。第二次就快多了。我一般会在安装完后,先跑一个空工程让它“热身”。

1.4 本章小结

这一章咱们干了三件事:

  • 搞懂了卷积神经网络在硬件眼里是什么样子
  • 明确了加速器的设计目标——先做出来,再优化
  • 装好了Vivado,并且跑通了第一个工程

说实话,环境搭建是最枯燥的部分。但相信我,后面开始写RTL、调仿真、上板实测的时候,你会感谢今天把环境配得稳稳当当的自己。

好,咱们下一章见。


可可精品资料库