一、FPGA 编程:原理概述
软硬件工程之间的界限比我们看到的更模糊。称之为现场可编程门阵列 (FPGA) 的器件,其物理属性可通过使用硬件描述语言 (HDL) 来操控,该器件可在软硬件编程之间架起一座桥梁。
但人们通常认为,FPGA 是只能由硬件工程师编程的器件。幸运的是,今时不同往日,现代统一软件平台插入通用开发工具,可简化 FPGA 的编程过程
。
事实上,软件开发人员也可了解如何编程 FPGA。本文将首先介绍 FPGA 的基础知识,比如 FPGA 的工作原理以及为什么要使用 FPGA 等。然后讨论设计和执行首款 FPGA 应用所需的工具。
二、何为 FPGA 以及为什么使用 FPGA?
FPGA是一种集成电路 (IC),具有可配置逻辑块 (CLB) 以及其它用户可编程并可重新编程的特性。术语“现场可编程”表示 FPGA 的功能是可调节的,与其它由制造商硬连接的 IC 不一样。
FPGA 是属于可编程逻辑器件 (PLD) 范畴的集成电路 (IC)。FPGA 技术的基本功能建立在自适应硬件之上,具有制造后可修改的独特功能。硬件块阵列(每块都可配置)可根据需要进行连接,允许为所有应用构建特定域的高效架构。
这种硬件灵活应变性是 CPU 和 GPU 所不具备的独特差异化特性。
虽然 CPU 灵活性很高,但其底层硬件是固定的。CPU 一旦出厂,硬件就无法修改。它依靠软件来告诉它要针对内存中的哪个数据执行哪项具体运算(算术函数)。硬件必须能够执行所有可能的运算,称之为使用软件指令,通常一次只能执行一条指令。相比之下,FPGA 可并行处理海量数据。与 CPU 相比,自适应硬件的优势因应用而异,很大程度上取决于计算的性质及其并行化的能力,但与功能可高度并行化的 CPU 实现方案相比,性能提高 20 倍的情况并不少见。
GPU 不仅可弥补 CPU 的一个主要不足之处 — 并行处理大量数据的能力,而且运行的数据集还很宽。从根本上讲,GPU 和 CPU 类似,因为它们有固定的硬件,而且使用软件指令运行。一条指令可处理 1000 个以上的数据,因此它们适用于图形加速、高性能计算、视频处理以及某些形式的机器学习等特定域。但从根本上讲,GPU 的基本架构和数据流在制造之前是固定的。
FPGA 可帮助编程人员和设计人员更灵活地适应和更新计算架构,从而带来更能满足其需求的特定域架构。FPGA 并不是什么新事物,但因人工智能等领域的创新速度,其重要性日益凸显。第一款商用 FPGA 是 AMD 于 1985 年发明的,在目前的 FPGA 市场上占据 60% 至 70% 的份额。
三、FPGA 的用途与应用
FPGA 应用广泛。今天,数据中心、航空航天工程、国防、人工智能 (AI)、工业物联网 (IoT)、有线及无线网络以及汽车等众多行业无处不见其身影。这类器件通常处于用户需要实时信息的环境中。例如,一款家庭安防摄像头需要将即时图像以高分辨率和最小的时延传给房主的智能设备。随着消费者对通过手机收发即时信息的依赖程度越来越高,这些期望值只会增加。
此外,FPGA 也有助于完成本来可以在软件中完成的功能加速。这使得 FPGA 成了一种非常有帮助的工具,可卸载需要高性能的任务,比如人工智能的深度神经网络 (DNN) 推断。
四、FPGA 和硬件加速
FPGA 的架构使其成了硬件加速的高效解决方案。ASIC 和 GPU 等器件使用一种过时的方法在编程和内存之间切换。而且它们也不能适应需要实时信息的应用,因为存储和检索任务所需的高功率会导致性能滞后。
与 ASIC 和 GPU 不同, FPGA 不需要在内存和编程之间切换,这使得存储和检索数据的过程更高效。FPGA 架构灵活性更高,因此您可以自定义您希望 FPGA 用于特定任务的电源。
这种灵活性有助于将能耗极高的任务从传统 CPU 或其它器件转移到一个或几个 FPGA 上。许多 FPGA 都可以重新编程,因此您可以对硬件加速系统轻松进行升级和调整。
五、FPGA 编程是怎样进行的?
FPGA 编程可根据您希望器件具备的功能,使用 HDL 来操控电路。该过程不同于对 GPU 或 CPU 的编程,因为您编写的程序将不会按顺序运行。相反,您可使用 HDL 来创建电路,并根据您想要的功能对硬件进行物理修改。
这个过程类似于软件编程,其中您编写的代码将转换成二进制文件并加载在 FPGA 上。但结果是 HDL 对硬件进行了物理修改,而不是通过严格优化器件来运行软件。
FPGA 上的一个程序将逻辑门和内存块等较低层次的元件组装在一起,其可协同工作,共同完成一项任务。因为您是从头开始操控硬件的,因此 FPGA 将带来很高的灵活性。您可以根据任务调整内存或功耗等基本功能。
六、用于编程 FPGA 的语言
FPGA 似乎主要服务于芯片设计人员,而不是专门从事软件开发的工程师。毕竟,大多数用于编写 FPGA 代码的 HDL 都是较低级的语言,硬件工程师可能比软件工程师更熟悉这些语言。但有些 HDL 与通用软件语言的类似程度远比您想象的高。
当我们将“编程”一词用于 FPGA 时,因为程序的设置方式和执行方式的缘故,它与创建软件并不完全相同。但使用该术语确实包含了编写并执行 FPGA 代码与创建软件算法的过程相似的理念。最初的思维方式是,FPGA 只能由电路设计硬件工程师来编程。今时不同往日。
在统一软件平台的帮助下,软件开发人员无需掌握 HDL 技术,便可使用他们喜欢的语言来对 FPGA 进行编程。这不仅可消除必须转而采用全新编程语言的压力,而且还可帮助软件开发人员将工作重心从硬件转向概念。这些平台的工作原理本质上是将较高级的语言翻译成较低级的语言,以便 FPGA 执行所需的功能。能够与统一软件平台一起用于 FPGA 编程的语言包括:
-
TensorFlow 和 Pytorch 等 AI 框架:有了 Vitis AI, AI 科学家现在可直接从 TensorFlow 或 Pytorch 获取其训练有素的深度学习模型,并针对 FPGA 加速进行编译。这不仅无需对低层次硬件进行编程,而且还可在几分钟内实现瞬间编译,从而能够与使用 CPU 和 GPU 的典型软件编译体验相媲美。
-
C 和 C++:在高层次综合 (HLS) 的帮助下,基于 C 语言的语言现在可用于 FPGA 设计。具体来说,AMD Vivado™ HLS 编译器提供的编程环境能够与标准处理器及专用处理器共享关键技术,用于优化 C 语言程序和 C++ 程序。这允许软件工程师优化代码,无需扫清有限内存空间或计算资源的路障。
-
Python:设计人员可使用 Python 语言和库来创建高性能应用并通过 PYNQ 编程 FPGA。PYNQ 是 AMD 的一个开源项目,可简化 AMD 平台的使用。
此外,现在主要用于 FPGA 编程的,也有大量主流 HDL。下面简单介绍一下其名称和主要属性:
-
Lucid:这种语言是专门针对 FPGA 设计的,可弥补 Verilog 等一些更早语言的不足。
-
VHDL:超高速集成电路 (VHSIC) 硬件描述语言的首字母缩写,该语言最早出现在 20 世纪 80 年代,主要基于 Ada 和 Pascal。
-
Verilog:Verilog 是有史以来创建的第一款 HDL,今天主要用于测试分析与验证。该语言的内核基于 C 语言。
七、如何编程 FPGA
虽然 FPGA 只存在于硬件工程师领域,但 AI 科学家和软件编程人员现在可以访问新平台,让该过程感觉就像编写软件程序一样。有了正确的工具,您将找到一个为 FPGA 编程的解决方案,在当前的软硬件知识层面满足您的需求。
如果您习惯了针对 GPU 进行编程,即使结果有点不同,编写 FPGA 代码的过程也会感觉非常相似。FPGA 编程包括编写代码、根据需要将该程序翻译成较低级的语言,以及将该程序转换为二进制文件。然后,您将向 FPGA 提供程序,操作就像让 GPU 读取一款用 C++ 编写的软件一样。就是这么简单。
但为了优化该编程过程,您需要访问正确的平台。幸运的是,AMD 拥有完美的解决方案,这是一套开创性的工具,可在 FPGA 编程过程的每个环节为软件开发人员提供帮助。
八、使用 Vitis™ 统一软件平台简化 FPGA 编程
Vitis™ 统一软件平台是一款领先应用,可为软件工程师、数据科学家以及 AI 开发人员优化 FPGA 编程过程。它包括一个针对 AMD FPGA 和 ACAP 硬件平台优化的扩展性开源库,以及一个内核开发套件,有了该套件,没有丰富的硬件经验,也可无缝构建加速应用。
此外,Vitis™ 还包括 Vitis Model Composer,其在 MATLAB® 和 Simulink® 中提供了一个工具套件。它可优化设计并测试新应用的过程。
九、如何使用 Vitis 软件针对应用加速启动设计
Vitis™ 分四个步骤帮助您针对边缘、本地或云端的数据及计算密集型应用设计加速器:
-
确定应用中需要加速的性能关键部分。
-
使用 Vitis 加速库设计加速器,也可使用 C、C++、OpenCL 或 RTL 开发自己的加速器。
-
构建、分析和调试,以验证功能正确性并确保符合性能目标。
-
在边缘、本地或云端的 AMD 平台上部署加速应用。
AMD 是业内排名第一的 FPGA 供应商
尽管没有硬件专业技术,FPGA 编程可能会让人望而却步,但 Vitis™ 等平台可帮助软件开发人员简化该过程。AMD 是业界收入最高的 FPGA 厂商,也是为软件工程师创建 FPGA 应用提供资源的行业领导者。
使用 C、C++ 和 OpenCL™ 编写的函数可以使用 AMD Vitis™ HLS 工具集成到硬件中。 HLS 工具不仅可为代码修改实现自动化,简化更新,而且还可针对每款应用的低时延和高吞吐量优化 C/C++ 代码。
十、FPGA 和 JAVA 有什么联系?
FPGA和Java看起来似乎没有直接的关联,因为它们在技术领域有着明显的不同。Java是一种广泛使用的编程语言,特别适用于网络和企业级应用开发。另一方面,FPGA(现场可编程门阵列)是一种可编程硬件,通常用于实现特定功能的数字电路。
然而,它们在某些情况下可能会有交集。例如,在嵌入式系统或物联网(IoT)项目中,可能会使用Java作为上层应用程序的编程语言,同时使用FPGA来处理底层的硬件交互或执行特定的硬件加速任务。
此外,高级FPGA设计工具可能提供Java API,允许开发人员使用Java编程语言来配置和控制FPGA设备。这可能会在一些复杂的系统级设计或高性能计算应用中看到,其中Java用于创建和管理系统级的功能,而FPGA提供硬件级别的并行处理和加速。
尽管它们在技术栈上有所不同,但Java和FPGA在设计复杂系统和解决复杂问题方面都是强大的工具。学习如何将它们有效地结合在一起,可以为解决一系列技术挑战提供新的视角和方法。