第一章:课程导论与开发环境搭建
各位同学好,我是你们的讲师。做了十几年数字IC和FPGA设计,踩过的坑比走过的路还多(笑)。今天咱们开始《卷积加速器从设计到上板实战》的第一章。这一章说白了就是两件事:搞懂我们要做什么,以及把吃饭的家伙准备好。
1.1 卷积神经网络基础——别怕,咱们只讲用得上的
很多人一听到“神经网络”就头大,觉得是搞算法的人的事。其实不然。作为硬件工程师,我们只需要知道卷积是怎么算的,以及怎么把它算得快。
卷积操作,说白了就是“滑动窗口乘加”。你想想看:
- 输入是一张图片(比如224x224x3)
- 卷积核是一个小窗口(比如3x3x3)
- 窗口在图片上滑过,每个位置做一次乘加运算
嗯,就这么简单。但问题来了——一张图片可能有几百万个像素,一个网络可能有几十层卷积。算一次乘加只要一个时钟周期,但几亿次乘加呢?这就是我们要用硬件加速的原因。
核心数据流:卷积加速器本质上是一个“数据搬运+乘加阵列”的引擎。数据搬得快,算得就快。
我在项目中遇到过最头疼的事:算法团队给了一个200层的ResNet,说“帮我加速一下”。我一看,光权重就有几十兆。所以咱们这门课选的网络不会太夸张,但足够让你理解加速器的设计精髓。
1.2 加速器设计目标——我们要造个什么样的东西?
做加速器,不是把代码写完就完事了。你得想清楚几个问题:
- 性能目标: 每秒处理多少张图?延迟多少毫秒?
- 资源约束: 你手头的FPGA有多少LUT、DSP、BRAM?
- 精度要求: 用float32还是int8?量化怎么做?
我个人习惯,先定一个“够用”的目标。比如咱们这门课,目标就是:在Xilinx Artix-7系列FPGA上,实现一个能跑通VGG-16的卷积加速器,处理一张224x224的图,延迟不超过100ms。
避坑指南: 我曾经一上来就想做最牛的加速器,结果资源爆了,时序也跑不过。后来学乖了——先做出来,再优化。这是铁律。
下面这张图,是我对咱们整个课程知识体系的梳理。你看一眼,心里就有谱了:
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 安装步骤(精简版)
- 去Xilinx官网下载Vivado HLx 2020.2 WebPACK版本(够用了)
- 解压后以管理员身份运行
xsetup.exe - 选择“Vivado HL WebPACK”安装选项
- 勾选“Design Tools”和“Devices”中的7系列(咱们用Artix-7)
- 等待...大概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、调仿真、上板实测的时候,你会感谢今天把环境配得稳稳当当的自己。
好,咱们下一章见。
可可精品资料库