新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 面向算法硬件加速的FPGA实现方法

面向算法硬件加速的FPGA实现方法

作者: 时间:2026-04-30 来源: 收藏

当开发者想要榨干某一的极限性能、且软件优化手段已全部用尽时,可以通过软硬件功能重新划分对任务进行。借助 ,无需更换处理器、也无需改动电路板级设计,就能轻松将软件模块替换为硬件模块。本文将讲解如何利用 实现

可定制指令集的可配置处理器架构

1777533571216935.jpg

图 1:带自定义指令的可配置处理器架构

基于 简介

低成本可编程逻辑器件在嵌入式系统中的应用越来越普遍,让设计人员无需大幅改动处理器与硬件板卡,就能提升系统性能。可编程逻辑可将计算密集型函数转化为硬件加速器。从软件视角来看,这相当于把函数调用卸载到定制硬件模块中执行,其运行速度往往远高于经过汇编极致优化、或改用查表实现的同等软件代码。

1. 什么是硬件加速

硬件加速是用专用硬件模块替代软件,借助硬件天然的并行与高速特性提升运算速度。

从软件调用角度看,访问硬件加速器和调用普通函数并无区别;差异仅在于该功能由硬件实现,且对调用方完全透明。

根据算法类型不同,硬件加速最高可将执行效率提升两个数量级。对于复杂数学运算、大批量数据搬运、重复性变换类任务,硬件具备天然速度优势。后文将介绍非常适合硬件加速的常见软件运算场景。

在搭载 FPGA 的系统中,产品开发周期任意阶段都可新增定制硬件逻辑。设计人员可以先完成软件开发并在硬件原型上运行,后续再逐步敲定哪些功能用硬件实现、哪些保留在软件中。这种增量式开发方式可灵活划分软硬件边界。

厂商配套开发工具支持软硬件无缝切换,可自动生成总线与中断逻辑的硬件描述语言(HDL)代码,同时生成适配系统的专用软件库与头文件。

2. 兼具 RISC 简洁性与部分 CISC 能力

精简指令集(RISC)的设计目标是保持指令简单、单指令执行速度极快;复杂指令集(CISC)则思路相反:单指令执行耗时更长,但可完成更复杂的处理逻辑。两种架构各有优势,均被广泛应用。

RISC 的简洁高速,与通过硬件实现的类 CISC 复杂运算相结合,能带来显著设计优势。这正是硬件加速的核心思想:新增专用硬件模块替代软件运算,提升处理能力、降低代码复杂度与代码量,以硬件资源换取速度与逻辑简洁性

硬件加速主要有两种实现方式:自定义指令硬件外设

  • 自定义指令:通常作为可配置处理器算术逻辑单元(ALU)的指令扩展,处理器将其视作一条拥有独立操作码的普通指令。在 C 语言中可通过宏封装,调用方式与普通函数完全一致。

若一条自定义指令需要多个时钟周期完成、且被频繁调用,可设计为流水线结构,在完成首次延迟后,每个时钟周期均可输出一个运算结果。

  • 硬件外设:以内存映射外设形式实现加速。软件向外设寄存器写入数据,而非传入软件函数;运算在 CPU 外部独立完成,CPU 可并行执行其他任务。与自定义指令不同,硬件外设可无需 CPU 干预,直接访问系统其他外设与内存。

选择自定义指令还是硬件外设,取决于硬件功能逻辑、工作方式与运行耗时:

  • 仅需少数时钟周期即可完成的运算,优先选用自定义指令,开销更小;

  • 硬件外设通常需要多条指令配置控制、状态、数据寄存器,再用一条指令读取结果;

  • 运算耗时较长时更适合硬件外设,不会阻塞 CPU 流水线;也可选用流水线型自定义指令。

另一区别:自定义指令支持的操作数数量有限、仅能返回单个结果,且受指令集架构约束;若硬件需要读写系统内存或其他外设,必须采用内存映射外设,因为自定义指令无法直接访问系统总线。

16位CRC算法的硬件实现核心

图 2:实现 16 位 CRC 算法的硬件内核

3. 筛选适合硬件加速的代码

若要对 C 代码做速度优化,可通过性能分析工具或人工代码审查找出性能热点,熟悉代码架构有助于精准定位瓶颈。

即便找到性能瓶颈,软件优化仍有一定局限。常用手段包括使用处理器原生位宽变量、预计算查表法、常规算法软件优化,通常可实现数倍提速。过去用汇编重写关键代码能获得巨大性能收益,但现代编译器优化能力极强,手写汇编的提升空间已非常有限。想要获得量级性能提升,仅靠软件优化往往难以实现。

硬件实现相比软件可提速数个数量级。因此无需盲目把整个模块全部硬件化,应优先挑选硬件天生擅长的运算:大批量数据搬移、高强度数学运算、高频循环迭代任务。若一项任务包含多步算术运算,可整体硬件加速;有时仅加速其中关键一步,即可满足整机性能指标。

4. 实例:CRC 算法硬件加速

CRC 校验这类校验算法运算重复、计算密集,是硬件加速的典型适用场景。本节以 CRC 算法为例,介绍软件优化、自定义指令、硬件外设三种实现方式,并对比性能差异与取舍。

优化思路:先做常规软件优化,再通过自定义指令进一步加速,最后对比不同实现方案的性能与利弊。

CRC 用于检测传输过程中的数据损坏,具备强检错能力、对吞吐影响小,只需在原始数据后附加 CRC 校验位即可。其本质是基于 16 位或 32 位多项式的模 2 除法,通过迭代异或与移位完成计算。处理单字节可能需要上百条指令,大数据包则会产生数万条指令开销,任何优化都能显著提升吞吐。

如下代码清单 1 接收消息指针与字节长度,返回 CRC 余数。虽然输入按字节处理,但底层逐位运算,包含逐位与、移位、异或及循环控制,软件执行效率偏低。

(代码清单 1:C 语言逐位 CRC 算法源码)

4.1 基于查表法的软件优化

由于 CRC 多项式除数固定,可预先计算所有单字节对应的 CRC 结果并存入查找表,运行时逐字节查表即可完成计算。

查找表可存放于 ROM 或 RAM,在 CRC 运算前初始化,共包含 256 个表项,对应所有 8 位数值。代码清单 2 为查找表初始化与快速 CRC 计算实现。

(代码清单 2:CRC 查表初始化与快速计算 C 代码)

优化后每次单字节运算仅需两次异或、两次移位与两次内存读取,以内存换速度,相比逐位算法提速约9.9 倍。若追求更高性能,可扩大查表规模或手写汇编;但想要实现 20~500 倍的提升,必须依靠硬件加速。

4.2 自定义指令实现

CRC 由大量重复异或、移位操作构成,逻辑简单、非常适合硬件实现。硬件模块可在极少时钟周期内完成一次 CRC 运算,且无需访问系统外设与内存时,自定义指令通常优于硬件外设。

硬件实现时可依据 CRC 标准,按 16 位或 32 位分块并行处理。以 16 位多项式 CRC-CCITT 为例,按 16 位并行处理效率最优。若在 8 位单片机上运行,操作数加载与结果返回的额外开销会抵消部分优势。

图 2 为 16 位 CRC 硬件内核,逐位将消息比特送入异或 - 移位运算单元。

代码清单 3 为在可配置嵌入式处理器上,对 64KB 数据块通过自定义指令计算 CRC 的 C 语言示例。

(代码清单 3:基于自定义指令的 CRC 计算 C 代码)

采用自定义指令后,CRC 运算在代码层面体现为普通函数或宏调用。例如 Nios 处理器开发工具会自动生成nm_crc()宏用于调用自定义指令。使用前需按 CRC 标准初始化内部 CRC 寄存器,循环中每处理一个 16 位字调用一次指令即可。该方案相比逐位软件实现提速约 27 倍

4.3 外设 + DMA 实现

将 CRC 实现为内存映射硬件外设,搭配 DMA 自动喂入数据,可实现更高吞吐。DMA 省去 CPU 为每次 CRC 运算加载操作数的额外时钟开销;外设处理当前数据块时,DMA 可提前搬运下一块数据。

1777533658523739.jpg

图 3:集成 CRC 外设与 DMA 的系统框图

针对 64KB 数据块,硬件外设 + DMA方案相比纯软件逐位 CRC最高可提速约 500 倍。数据块越大,DMA 初始化开销占比越低,性能提升越明显;小数据量场景下使用 DMA 收益有限。

本文基于 Altera Stratix FPGA 内部 Nios 处理器,完成了 CRC-CCITT(16 位多项式)三种方案实测。不同数据长度下的性能对比、FPGA 资源(内存、逻辑单元)占用情况表明:投入硬件资源越多,运算速度越高,本质是以硬件资源换取性能

5. 基于 FPGA 硬件加速的优势

基于 FPGA 的嵌入式系统,无需在项目初期就硬性划分软硬件边界。开发中途若需要更高性能,可直接用 FPGA 逻辑对性能热点做硬件加速。

只要 FPGA 容量充足,可编程逻辑可按需定制功能、无需改动电路板,仅实现必需的硬件逻辑即可,也无需更换处理器、手写汇编来提升性能。

在 FPGA 内部嵌入可配置处理器,赋予设计极高灵活性:任意软件模块均可改成自定义指令或硬件外设实现。新增专用硬件的性能往往优于通用商用微处理器。

FPGA 拥有丰富的逻辑、存储资源,可供可配置处理器系统充分调度利用。

算法既可以软件实现,也可以硬件实现。出于开发便捷性与成本考量,绝大多数常规运算仍保留软件实现,仅在速度不达标时引入硬件加速。软件优化有上限,而硬件加速是突破性能瓶颈的有效途径。

借助 FPGA 可灵活互换软硬件模块,无需更换处理器、无需板级改版,设计人员可在速度、逻辑资源、内存、代码量、成本之间做最优权衡,快速定制具备功能扩展与性能优化能力的嵌入式专用系统。


关键词: 算法 硬件加速 FPGA

评论


相关推荐

技术专区

关闭