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

各位同学好,我是你们的FPGA讲师。今天咱们聊聊HLS卷积加速器设计的第一课——说白了,就是搞清楚HLS到底是什么东西,为什么用它来做卷积加速,以及怎么把开发环境搭起来。

我刚开始接触HLS那会儿,心里也犯嘀咕:这玩意儿靠谱吗?后来在几个项目里摸爬滚打,才慢慢体会到它的价值。嗯,咱们一步步来。

1.1 HLS是什么?

HLS,全称是High-Level Synthesis,中文叫高层次综合。它允许你用C、C++或SystemC来描述硬件功能,然后自动转换成RTL代码(Verilog或VHDL)。

你想想看,传统FPGA开发得写Verilog,一个简单的卷积核可能要几百行代码。用HLS呢?几十行C代码就搞定了。我有个同事,以前写卷积的RTL代码,调试了整整两周。后来换成HLS,三天就出了第一版。

核心思想:用软件思维做硬件设计,把精力放在算法优化上,而不是纠结于时序和状态机。

HLS的工作流程大致是这样的:

  1. 用C/C++编写算法函数
  2. 添加编译指令(pragma)指导综合
  3. 运行C仿真验证功能
  4. 执行HLS综合生成RTL
  5. 进行RTL协同仿真
  6. 导出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其实不复杂,但有几个坑要注意。

安装步骤

  1. 从Xilinx官网下载Vitis安装包(约20GB)
  2. 运行安装程序,选择Vitis HLS组件
  3. 设置环境变量:source /opt/Xilinx/Vitis/2023.1/settings64.sh
  4. 验证安装:运行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是什么 C/C++ → RTL自动综合 为什么用HLS 开发快、优化强、易调试 Vivado vs Vitis 版本差异与选择建议 环境搭建 安装步骤与验证 卷积加速原理 数据复用与并行计算 实战验证 C仿真 + RTL综合 本章知识体系:从概念到实践,构建HLS卷积加速器设计基础

这张图把本章的核心内容串起来了。从HLS的基本概念,到为什么选它做卷积加速,再到工具对比和环境搭建,最后用实战验证收尾。每一步都是环环相扣的。

我的建议:学HLS别光看书,一定要动手。装好环境后,把示例代码跑一遍,看看综合报告里的时序、资源、吞吐量。我当年就是这么一步步摸索过来的。

好了,第一课的内容就到这里。环境搭好之后,下一章咱们就开始写真正的卷积加速器代码了。记住,工具只是手段,理解硬件思维才是关键。

可可精品资料库