一、HLS概述与开发环境搭建

1.1 HLS到底是什么?

HLS,全称是High-Level Synthesis,翻译过来就是高层次综合。说白了,就是让你用C/C++代码去写FPGA逻辑。

我刚开始接触FPGA时,用的都是Verilog。写个简单的计数器还好,一旦涉及到图像处理、神经网络加速这些复杂算法,那代码量简直让人崩溃。后来公司来了个老工程师,他跟我说:「你试试HLS吧,用C写,效率高很多。」

嗯,这一试就回不去了。

1.2 为什么需要HLS?

你可能会问:Verilog/VHDL不是好好的吗?为什么要多此一举?

我总结了几点,你看看有没有道理:

  • 开发效率高:C代码写算法,比Verilog快5-10倍。我在项目中做过一个图像滤波模块,用Verilog写了3天,用HLS只用了半天。
  • 验证方便:C仿真跑起来快,调试也简单。你想想看,用Verilog仿真一个1080P的图像处理,可能要等几分钟;用C仿真,几秒钟就出结果了。
  • 复用性强:同样的C代码,可以综合成不同的硬件架构。想追求吞吐量?加流水线。想节省资源?减少并行度。改个pragma就行。
  • 算法迭代快:做AI加速的时候,算法工程师改个参数,你不需要重新写RTL,改改C代码重新综合就行。

核心观点:HLS不是要取代RTL,而是让FPGA开发更高效。复杂算法用HLS,关键时序用RTL,两者配合才是王道。

1.3 Vivado HLS vs Vitis HLS

这里有个容易混淆的地方。Xilinx有两个HLS工具:Vivado HLS和Vitis HLS。

对比项 Vivado HLS Vitis HLS
推出时间 2012年 2019年
集成环境 Vivado套件内 Vitis统一平台
支持语言 C/C++/SystemC C/C++/OpenCL
适用场景 传统FPGA开发 异构计算、AI加速
当前状态 已停止更新 主力工具

我个人建议:新项目直接用Vitis HLS。Vivado HLS虽然还能用,但Xilinx已经停止更新了。我去年接手一个老项目,用的还是Vivado HLS 2018.3,那叫一个痛苦——很多新特性不支持,bug也没人修。

注意:Vitis HLS和Vivado HLS的pragma语法基本兼容,但有些细节不同。迁移项目时,一定要仔细检查综合报告。

1.4 安装与配置实战

好,咱们来点实际的。怎么安装Vitis HLS?

1.4.1 下载安装包

去Xilinx官网下载Vitis统一安装包。注意,这个包很大——大概30GB左右。我建议你晚上睡觉前开始下载,第二天早上就下好了。

1.4.2 安装步骤

  1. 运行安装程序,选择「Vitis」组件
  2. 勾选「Vitis HLS」子组件
  3. 选择安装路径(建议不要有中文和空格)
  4. 等待安装完成(约30-60分钟)

小技巧:安装时只勾选你需要的器件支持包,可以节省大量磁盘空间。我一般只选Kintex-7和Zynq-7000系列,够用了。

1.4.3 环境配置

安装完成后,需要配置环境变量。在Linux下,我习惯这样设置:

# 设置Vitis环境
source /opt/Xilinx/Vitis/2023.1/settings64.sh

# 验证安装
vitis_hls -version

Windows用户直接在开始菜单里找「Vitis HLS Command Prompt」就行。

我曾经遇到一个坑:环境变量没配好,导致vitis_hls命令找不到。折腾了半天才发现是路径写错了。嗯,这里要注意,路径一定要写对。

1.5 知识体系总览

为了让你对本章内容有个整体认识,我画了一张图:

HLS概述 什么是HLS? 为什么需要HLS? Vivado vs Vitis 安装与配置 开发流程 应用场景 图1:HLS知识体系结构图

1.6 第一个HLS程序

安装配置好了,咱们跑个最简单的例子试试手:

#include <ap_int.h>

void adder(ap_uint<8> a, ap_uint<8> b, ap_uint<8> &sum) {
    #pragma HLS INTERFACE ap_ctrl_none port=return
    #pragma HLS INTERFACE s_axilite port=a
    #pragma HLS INTERFACE s_axilite port=b
    #pragma HLS INTERFACE s_axilite port=sum
    
    sum = a + b;
}

这段代码实现了一个8位加法器。你可能会说:「就这?用Verilog写不也一样简单?」

没错,加法器确实简单。但你想一下,如果a和b不是8位整数,而是32位浮点数,或者是一个结构体,甚至是一个数组呢?用C写起来就轻松多了。

个人经验:刚开始学HLS时,不要一上来就搞复杂算法。先从简单的加法器、乘法器开始,跑通流程,再逐步增加复杂度。我当年就是太心急,直接上手图像处理,结果综合报告一堆警告,debug了整整一周。

1.7 避坑指南

最后,分享几个我踩过的坑:

  • 版本问题:不同版本的Vitis HLS,综合结果可能不一样。项目开发过程中,尽量保持版本一致。
  • 仿真与综合不一致:C仿真通过了,但综合出来的硬件可能不对。这时候要检查代码中是否有不可综合的语法。
  • 资源估计不准:HLS报告的资源使用量,和实际布局布线后的结果可能有差异。我一般会留20%的余量。

好了,这一章的内容就到这里。环境搭好了,下一章咱们就开始写真正的HLS代码了。

可可精品资料库