面向算法硬件加速的FPGA實現(xiàn)方法
當開發(fā)者想要榨干某一算法的極限性能、且軟件優(yōu)化手段已全部用盡時,可以通過軟硬件功能重新劃分對任務進行硬件加速。借助 FPGA,無需更換處理器、也無需改動電路板級設計,就能輕松將軟件模塊替換為硬件模塊。本文將講解如何利用 FPGA 對算法實現(xiàn)硬件加速。
可定制指令集的可配置處理器架構(gòu)

圖 1:帶自定義指令的可配置處理器架構(gòu)
低成本可編程邏輯器件在嵌入式系統(tǒng)中的應用越來越普遍,讓設計人員無需大幅改動處理器與硬件板卡,就能提升系統(tǒng)性能。可編程邏輯可將計算密集型函數(shù)轉(zhuǎn)化為硬件加速器。從軟件視角來看,這相當于把函數(shù)調(diào)用卸載到定制硬件模塊中執(zhí)行,其運行速度往往遠高于經(jīng)過匯編極致優(yōu)化、或改用查表實現(xiàn)的同等軟件代碼。
1. 什么是硬件加速
硬件加速是用專用硬件模塊替代軟件算法,借助硬件天然的并行與高速特性提升運算速度。
從軟件調(diào)用角度看,訪問硬件加速器和調(diào)用普通函數(shù)并無區(qū)別;差異僅在于該功能由硬件實現(xiàn),且對調(diào)用方完全透明。
根據(jù)算法類型不同,硬件加速最高可將執(zhí)行效率提升兩個數(shù)量級。對于復雜數(shù)學運算、大批量數(shù)據(jù)搬運、重復性變換類任務,硬件具備天然速度優(yōu)勢。后文將介紹非常適合硬件加速的常見軟件運算場景。
在搭載 FPGA 的系統(tǒng)中,產(chǎn)品開發(fā)周期任意階段都可新增定制硬件邏輯。設計人員可以先完成軟件開發(fā)并在硬件原型上運行,后續(xù)再逐步敲定哪些功能用硬件實現(xiàn)、哪些保留在軟件中。這種增量式開發(fā)方式可靈活劃分軟硬件邊界。
廠商配套開發(fā)工具支持軟硬件無縫切換,可自動生成總線與中斷邏輯的硬件描述語言(HDL)代碼,同時生成適配系統(tǒng)的專用軟件庫與頭文件。
2. 兼具 RISC 簡潔性與部分 CISC 能力
精簡指令集(RISC)的設計目標是保持指令簡單、單指令執(zhí)行速度極快;復雜指令集(CISC)則思路相反:單指令執(zhí)行耗時更長,但可完成更復雜的處理邏輯。兩種架構(gòu)各有優(yōu)勢,均被廣泛應用。
將RISC 的簡潔高速,與通過硬件實現(xiàn)的類 CISC 復雜運算相結(jié)合,能帶來顯著設計優(yōu)勢。這正是硬件加速的核心思想:新增專用硬件模塊替代軟件運算,提升處理能力、降低代碼復雜度與代碼量,以硬件資源換取速度與邏輯簡潔性。
硬件加速主要有兩種實現(xiàn)方式:自定義指令 和 硬件外設。
自定義指令:通常作為可配置處理器算術(shù)邏輯單元(ALU)的指令擴展,處理器將其視作一條擁有獨立操作碼的普通指令。在 C 語言中可通過宏封裝,調(diào)用方式與普通函數(shù)完全一致。
若一條自定義指令需要多個時鐘周期完成、且被頻繁調(diào)用,可設計為流水線結(jié)構(gòu),在完成首次延遲后,每個時鐘周期均可輸出一個運算結(jié)果。
硬件外設:以內(nèi)存映射外設形式實現(xiàn)加速。軟件向外設寄存器寫入數(shù)據(jù),而非傳入軟件函數(shù);運算在 CPU 外部獨立完成,CPU 可并行執(zhí)行其他任務。與自定義指令不同,硬件外設可無需 CPU 干預,直接訪問系統(tǒng)其他外設與內(nèi)存。
選擇自定義指令還是硬件外設,取決于硬件功能邏輯、工作方式與運行耗時:
僅需少數(shù)時鐘周期即可完成的運算,優(yōu)先選用自定義指令,開銷更小;
硬件外設通常需要多條指令配置控制、狀態(tài)、數(shù)據(jù)寄存器,再用一條指令讀取結(jié)果;
運算耗時較長時更適合硬件外設,不會阻塞 CPU 流水線;也可選用流水線型自定義指令。
另一區(qū)別:自定義指令支持的操作數(shù)數(shù)量有限、僅能返回單個結(jié)果,且受指令集架構(gòu)約束;若硬件需要讀寫系統(tǒng)內(nèi)存或其他外設,必須采用內(nèi)存映射外設,因為自定義指令無法直接訪問系統(tǒng)總線。

圖 2:實現(xiàn) 16 位 CRC 算法的硬件內(nèi)核
3. 篩選適合硬件加速的代碼
若要對 C 代碼做速度優(yōu)化,可通過性能分析工具或人工代碼審查找出性能熱點,熟悉代碼架構(gòu)有助于精準定位瓶頸。
即便找到性能瓶頸,軟件優(yōu)化仍有一定局限。常用手段包括使用處理器原生位寬變量、預計算查表法、常規(guī)算法軟件優(yōu)化,通常可實現(xiàn)數(shù)倍提速。過去用匯編重寫關(guān)鍵代碼能獲得巨大性能收益,但現(xiàn)代編譯器優(yōu)化能力極強,手寫匯編的提升空間已非常有限。想要獲得量級性能提升,僅靠軟件優(yōu)化往往難以實現(xiàn)。
硬件實現(xiàn)相比軟件可提速數(shù)個數(shù)量級。因此無需盲目把整個模塊全部硬件化,應優(yōu)先挑選硬件天生擅長的運算:大批量數(shù)據(jù)搬移、高強度數(shù)學運算、高頻循環(huán)迭代任務。若一項任務包含多步算術(shù)運算,可整體硬件加速;有時僅加速其中關(guān)鍵一步,即可滿足整機性能指標。
4. 實例:CRC 算法硬件加速
CRC 校驗這類校驗算法運算重復、計算密集,是硬件加速的典型適用場景。本節(jié)以 CRC 算法為例,介紹軟件優(yōu)化、自定義指令、硬件外設三種實現(xiàn)方式,并對比性能差異與取舍。
優(yōu)化思路:先做常規(guī)軟件優(yōu)化,再通過自定義指令進一步加速,最后對比不同實現(xiàn)方案的性能與利弊。
CRC 用于檢測傳輸過程中的數(shù)據(jù)損壞,具備強檢錯能力、對吞吐影響小,只需在原始數(shù)據(jù)后附加 CRC 校驗位即可。其本質(zhì)是基于 16 位或 32 位多項式的模 2 除法,通過迭代異或與移位完成計算。處理單字節(jié)可能需要上百條指令,大數(shù)據(jù)包則會產(chǎn)生數(shù)萬條指令開銷,任何優(yōu)化都能顯著提升吞吐。
如下代碼清單 1 接收消息指針與字節(jié)長度,返回 CRC 余數(shù)。雖然輸入按字節(jié)處理,但底層逐位運算,包含逐位與、移位、異或及循環(huán)控制,軟件執(zhí)行效率偏低。
(代碼清單 1:C 語言逐位 CRC 算法源碼)
4.1 基于查表法的軟件優(yōu)化
由于 CRC 多項式除數(shù)固定,可預先計算所有單字節(jié)對應的 CRC 結(jié)果并存入查找表,運行時逐字節(jié)查表即可完成計算。
查找表可存放于 ROM 或 RAM,在 CRC 運算前初始化,共包含 256 個表項,對應所有 8 位數(shù)值。代碼清單 2 為查找表初始化與快速 CRC 計算實現(xiàn)。
(代碼清單 2:CRC 查表初始化與快速計算 C 代碼)
優(yōu)化后每次單字節(jié)運算僅需兩次異或、兩次移位與兩次內(nèi)存讀取,以內(nèi)存換速度,相比逐位算法提速約9.9 倍。若追求更高性能,可擴大查表規(guī)模或手寫匯編;但想要實現(xiàn) 20~500 倍的提升,必須依靠硬件加速。
4.2 自定義指令實現(xiàn)
CRC 由大量重復異或、移位操作構(gòu)成,邏輯簡單、非常適合硬件實現(xiàn)。硬件模塊可在極少時鐘周期內(nèi)完成一次 CRC 運算,且無需訪問系統(tǒng)外設與內(nèi)存時,自定義指令通常優(yōu)于硬件外設。
硬件實現(xiàn)時可依據(jù) CRC 標準,按 16 位或 32 位分塊并行處理。以 16 位多項式 CRC-CCITT 為例,按 16 位并行處理效率最優(yōu)。若在 8 位單片機上運行,操作數(shù)加載與結(jié)果返回的額外開銷會抵消部分優(yōu)勢。
圖 2 為 16 位 CRC 硬件內(nèi)核,逐位將消息比特送入異或 - 移位運算單元。
代碼清單 3 為在可配置嵌入式處理器上,對 64KB 數(shù)據(jù)塊通過自定義指令計算 CRC 的 C 語言示例。
(代碼清單 3:基于自定義指令的 CRC 計算 C 代碼)
采用自定義指令后,CRC 運算在代碼層面體現(xiàn)為普通函數(shù)或宏調(diào)用。例如 Nios 處理器開發(fā)工具會自動生成nm_crc()宏用于調(diào)用自定義指令。使用前需按 CRC 標準初始化內(nèi)部 CRC 寄存器,循環(huán)中每處理一個 16 位字調(diào)用一次指令即可。該方案相比逐位軟件實現(xiàn)提速約 27 倍。
4.3 外設 + DMA 實現(xiàn)
將 CRC 實現(xiàn)為內(nèi)存映射硬件外設,搭配 DMA 自動喂入數(shù)據(jù),可實現(xiàn)更高吞吐。DMA 省去 CPU 為每次 CRC 運算加載操作數(shù)的額外時鐘開銷;外設處理當前數(shù)據(jù)塊時,DMA 可提前搬運下一塊數(shù)據(jù)。

圖 3:集成 CRC 外設與 DMA 的系統(tǒng)框圖
針對 64KB 數(shù)據(jù)塊,硬件外設 + DMA方案相比純軟件逐位 CRC最高可提速約 500 倍。數(shù)據(jù)塊越大,DMA 初始化開銷占比越低,性能提升越明顯;小數(shù)據(jù)量場景下使用 DMA 收益有限。
本文基于 Altera Stratix FPGA 內(nèi)部 Nios 處理器,完成了 CRC-CCITT(16 位多項式)三種方案實測。不同數(shù)據(jù)長度下的性能對比、FPGA 資源(內(nèi)存、邏輯單元)占用情況表明:投入硬件資源越多,運算速度越高,本質(zhì)是以硬件資源換取性能。
5. 基于 FPGA 硬件加速的優(yōu)勢
基于 FPGA 的嵌入式系統(tǒng),無需在項目初期就硬性劃分軟硬件邊界。開發(fā)中途若需要更高性能,可直接用 FPGA 邏輯對性能熱點做硬件加速。
只要 FPGA 容量充足,可編程邏輯可按需定制功能、無需改動電路板,僅實現(xiàn)必需的硬件邏輯即可,也無需更換處理器、手寫匯編來提升性能。
在 FPGA 內(nèi)部嵌入可配置處理器,賦予設計極高靈活性:任意軟件模塊均可改成自定義指令或硬件外設實現(xiàn)。新增專用硬件的性能往往優(yōu)于通用商用微處理器。
FPGA 擁有豐富的邏輯、存儲資源,可供可配置處理器系統(tǒng)充分調(diào)度利用。
算法既可以軟件實現(xiàn),也可以硬件實現(xiàn)。出于開發(fā)便捷性與成本考量,絕大多數(shù)常規(guī)運算仍保留軟件實現(xiàn),僅在速度不達標時引入硬件加速。軟件優(yōu)化有上限,而硬件加速是突破性能瓶頸的有效途徑。
借助 FPGA 可靈活互換軟硬件模塊,無需更換處理器、無需板級改版,設計人員可在速度、邏輯資源、內(nèi)存、代碼量、成本之間做最優(yōu)權(quán)衡,快速定制具備功能擴展與性能優(yōu)化能力的嵌入式專用系統(tǒng)。











評論