第一课:课程导论与开发环境搭建
各位同学好,我是你们的FPGA讲师。今天咱们聊聊HLS卷积加速器设计的第一课——说白了,就是搞清楚HLS到底是什么东西,为什么用它来做卷积加速,以及怎么把开发环境搭起来。
我刚开始接触HLS那会儿,心里也犯嘀咕:这玩意儿靠谱吗?后来在几个项目里摸爬滚打,才慢慢体会到它的价值。嗯,咱们一步步来。
1.1 HLS是什么?
HLS,全称是High-Level Synthesis,中文叫高层次综合。它允许你用C、C++或SystemC来描述硬件功能,然后自动转换成RTL代码(Verilog或VHDL)。
你想想看,传统FPGA开发得写Verilog,一个简单的卷积核可能要几百行代码。用HLS呢?几十行C代码就搞定了。我有个同事,以前写卷积的RTL代码,调试了整整两周。后来换成HLS,三天就出了第一版。
核心思想:用软件思维做硬件设计,把精力放在算法优化上,而不是纠结于时序和状态机。
HLS的工作流程大致是这样的:
- 用C/C++编写算法函数
- 添加编译指令(pragma)指导综合
- 运行C仿真验证功能
- 执行HLS综合生成RTL
- 进行RTL协同仿真
- 导出IP核用于Vivado集成
我个人习惯,在写C代码时就会考虑硬件架构。比如循环展开、流水线这些,心里先有个谱。这样综合出来的结果更可控。
1.2 为什么用HLS做卷积加速?
卷积运算在图像处理、神经网络里太常见了。它有个特点:计算密集、数据复用率高、并行度大。这些特性正好适合FPGA来做加速。
用HLS做卷积加速,有几个实打实的好处:
- 开发效率高:比手写Verilog快3-5倍,我亲测过
- 优化空间大:通过pragma可以控制流水线、展开、数组分割等
- 可移植性好:同一份C代码可以适配不同FPGA平台
- 调试方便:C仿真比RTL仿真快几个数量级
举个例子,一个3x3的卷积核,在HLS里可以这样写:
// 卷积核函数
void conv3x3(int input[3][3], int kernel[3][3], int *output) {
int sum = 0;
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
sum += input[i][j] * kernel[i][j];
}
}
*output = sum;
}
这段代码,加上几个pragma,就能综合出一个流水线化的卷积器。我曾经在一个项目中,用HLS把卷积加速做到了200+ GOPS,性能相当可观。
小提示:刚开始学HLS,别急着追求极致性能。先把功能跑通,再慢慢加优化指令。我见过太多人一上来就搞复杂优化,结果调试到崩溃。
1.3 Vivado HLS vs Vitis HLS
这里有个历史问题。Xilinx最早推出的是Vivado HLS,后来被Vitis HLS取代了。两者核心功能一样,但Vitis HLS是集成在Vitis统一平台里的。
| 特性 | Vivado HLS | Vitis HLS |
|---|---|---|
| 版本 | 2019.2及之前 | 2020.1及之后 |
| 集成环境 | 独立工具 | Vitis统一平台 |
| 支持语言 | C/C++/SystemC | C/C++/SystemC |
| 优化能力 | 基础优化 | 增强优化+AI引擎支持 |
我个人建议,新项目直接用Vitis HLS。它支持更多新特性,而且和Vivado的集成更紧密。不过,如果你手头有老项目用的是Vivado HLS,也别急着迁移,功能上完全够用。
1.4 开发环境安装与验证
好,咱们来动手。安装Vitis HLS其实不复杂,但有几个坑要注意。
安装步骤
- 从Xilinx官网下载Vitis安装包(约20GB)
- 运行安装程序,选择Vitis HLS组件
- 设置环境变量:
source /opt/Xilinx/Vitis/2023.1/settings64.sh - 验证安装:运行
vitis_hls -version
注意:安装路径不要有中文或空格。我曾经因为路径里有空格,折腾了一下午才找到问题。另外,Linux系统下记得安装必要的依赖库,比如libncurses5、libtinfo5等。
验证示例
安装完成后,咱们跑个简单的例子验证一下:
// test.cpp
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int result = add(3, 4);
printf("Result: %d\n", result);
return 0;
}
在终端里执行:
vitis_hls -f run.tcl
其中run.tcl内容如下:
open_project test_prj
add_files test.cpp
set_top add
open_solution "solution1"
set_part {xc7z020clg400-1}
create_clock -period 10
csim_design
csynth_design
exit
如果看到"CSYNTH PASS"字样,恭喜你,环境搭建成功了!
1.5 知识体系总览
为了让大家对本章内容有个整体认识,我画了一张图:
这张图把本章的核心内容串起来了。从HLS的基本概念,到为什么选它做卷积加速,再到工具对比和环境搭建,最后用实战验证收尾。每一步都是环环相扣的。
我的建议:学HLS别光看书,一定要动手。装好环境后,把示例代码跑一遍,看看综合报告里的时序、资源、吞吐量。我当年就是这么一步步摸索过来的。
好了,第一课的内容就到这里。环境搭好之后,下一章咱们就开始写真正的卷积加速器代码了。记住,工具只是手段,理解硬件思维才是关键。
可可精品资料库