寫在最前面:

沒錯,我就是一名普普通通的工程師,有那麼一兩項能養活自己的技術。技術這個東西,如果只是用在工作崗位上的話,就是一個「搬磚」的工具,如果把它分享出來,沒準還能碰撞出有意思的東西來,你們說是吧?

好了,這一系列博文教程叫做「FPGA軟硬體加速入門」,顧名思義,就是利用FPGA本身的特點,在軟硬體進行不同的系統分工,加速系統輸出的速度(主要是計算),我會盡量從入門者的角度講解相關內容,如果你覺得還行,挺受用,動一動手指,幫忙轉發一下,不勝感激啦~


一、 從嵌入式軟體開發到FPGA開發

1.1 單片機

開發流程淺析

在開始介紹FPGA之前,讓我們來回顧一下簡單的嵌入式軟體開發吧,相信大家或多或少都接觸過單片機(Micro Control Unit)的設計流程。作為一個簡單的控制器,單片機的工作流程無非如下:

1、 單片機上電,程序從存儲器中載入到MCU內部;

2、 根據單片機的輸入(如鍵盤輸入、感測器數據的讀取等)、以及程序內部的邏輯,計算得到控制結果;

3、 將結果輸出,控制單片機的外部設備(如LED的亮滅、控制電機轉速的PWM波形等);

也就是說,一個簡單的單片機工作系統的構成如下:

而為了搭建上面的這樣一個系統,我們在軟體方面需要做的事情包括下面這幾部分:

1、 代碼編輯,這裡主要包括輸入輸出設備驅動和內部的控制邏輯;

2、 代碼編譯,將源文件(.c或.cpp)轉化為指定單片機可執行的二進位文件;

3、 可執行文件燒寫,將二進位文件固話到單片機(內部或外部)的存儲器中;

上面三個步驟,我們一般是在各種IDE(Integrated Development Environment)開發環境下實現的,也就是說在一個軟體裡面實現編輯、編譯、燒寫的功能,常見的IDE軟體如下:

1.2 從單片機開發到FPGA開發

1.2.1 FPGA的基本工作原理

在進行FPGA開發之前,我們必須得了解為什麼要使用FPGA,也就必須得知道FPGA的工作原理。我們知道,對於一個簡單單片機系統來說,工作原理和上文描述一樣,也就是說,對於一個簡單的讓LED閃爍的功能,單片機要做的事情如下:

1、 從(內部或外部)的程序存儲器中,取出一條讓LED點亮的指令;

2、 將該指令輸入到CPU的指令解碼器中,根據解碼器的結果(此處是將控制LED的GPIO的輸出寄存器的bit位拉高)控制相應寄存器;

3、 載入下一條延時指令,輸入到解碼器中,進行空操作處理;

4、 繼續載入下一條讓LED滅的指令,解碼後,控制GPIO匯流排上的指定bit位拉低,從而熄滅LED;

5、 循環上述操作達到閃爍LED的目的;

通過上面閃爍LED的例子,我們可以知道,對於單片機來說,它的核心有2點:

  • 指令的載入、解碼——其實也就是對指令集的解析,知道這一條語言到底進行了什麼硬體上的操作,後面章節會詳細的解釋;
  • 外設的控制——可以通過寫寄存器控制單片機的外設,如GPIO、uart、spi、IIC等;

那麼對於FPGA而言呢?

無論是FPGA、單片機,又或是ARM系統、我們的PC,其實本質上就是一個計算平台,是一個信息處理系統。作為一個系統,它的輸入、計算、輸出的構成是永遠不會變的。那變的是什麼?變得是計算的原理。

對於單片機而言,取指、解碼、輸出是它的原理,那麼對於FPGA而言,它的原理又是什麼?在介紹之前,我們先回顧一下《數字電路》這門課裡面的基礎內容——組合邏輯和時序邏輯電路。

D觸發器是時許邏輯電路的基本組件,與、或、非們是組合邏輯電路的基本組建。利用這些組建我們可以實現很多小的功能。

比如,通過D觸發器我們可以設計一個計數器:

比如,我們可以通過簡單的組合邏輯來實現一個比較器

講到這裡,大家可能已經知道了,這兩個簡單的邏輯電路其實能夠構成一個讓LED閃爍的簡單系統。我們只需要將計數器的輸出作為比較器的X輸入,而另外一個固定的電平值(比如說8)作為Y輸入,那麼每當X=Y的時候,比較器的X=Y都會輸出一個高電平。而將X=Y的輸出作為另一個1位計數器的輸入的時候,便會產生這麼一個效果——每過8個時鐘周期後,最後輸出的電平就會反轉一次,達到LED閃爍的效果,整個電路的構成如下:

為什麼在這裡要講LED閃爍的數字電路構成呢?因為這正是FPGA的工作原理!FPGA全程Field Programmable Gate Array(現場可編程門陣列),這個「門」指的就是FPGA內部晶元的主要組成部分——龐大數量的寄存器和門電路(詳細的構成後面章節會介紹)。

至此,我們可以對比出單片機開發和FPGA工作原理了。它們的異同點如下表:

1.2.2 為什麼要用FPGA

前面我們說到一個簡單的控制LED的例子,知道了整個流程是取指、解碼、控制外設的流程。對於一個LED電頻翻轉來說,MCU當然是足夠的,我們思考一下以下幾個問題:

1. 如果我要輸出高清的60幀/s的1080P視頻信號給顯示器怎麼辦?用GPIO控制?

2. 如果我要進行運算量非常大的程序,比如現在非常火的AI網路訓練,涉及到大量的乘法、加法,用MCU?PC?

回答了上述幾個問題也就解釋了為什麼要用FPGA了。我們來挨個解釋一下:

1. 用GPIO翻轉輸出一個指定的電平需要幾十個時鐘周期(MCU的clock頻率),如果我要輸出一個60幀、1080P的視頻信號的話(其實也是電平的控制),那麼翻轉的頻率可能要達到百兆的速度了,如果使用MCU這種方式的話,MCU要達到幾GHz的主頻了,這顯然是不現實的。而根據上面FPGA的電平翻轉的原理,D觸發器的時鐘頻率只需要百兆就可以了;

2. 計算機基礎告訴我們,無論是MCU還是PC的CPU,內部都有相應的乘法器和加法器。如果設計到大量的計算的話,單個乘法/加法器哪怕主頻再高,計算速度也跟不上。而對於FPGA來說,可以仿照上面計數器、比較器的方式,設計幾十個、幾百個甚至幾千個計算單元,哪怕主頻比CPU低很多,計算速度也遠高於CPU。二者的關係可以用下圖形象地表示:

FPGA開發流程

二、FPGA開發流程

FPGA的開發有一個特點,即開發環境和使用的晶元有非常強的關聯性。不像單片機開發的IDE,一個開發套件可以適配幾十上百家不同的單片機(各種51、PIC、stm32等)。但目前主流的FPGA晶元只有2家——Xilinx(賽靈思)和Altera(後被Intel收購,我們姑且稱之為英特爾的FPGA吧)。

這系列博文主要集中在Xilinx的FPGA晶元及其相應的開發套件Vivado上。

以比較常見的stm32系列單片機和集成開發環境Keil為例,我們來對比一下單片機開發和FPGA開發的流程。

可以看到,相對於單片機(更不用說普通的PC軟體開發了),FPGA的開發流程複雜了許多。工程么,不就是各種tradeoff,開發便利和計算性取捨,就是後話了~


為了方便 更多人閱讀,最近開了個公眾號啦!

微信公眾號搜索「FPGA異構計算」或者掃描下方二維碼就可以關注了~


推薦閱讀:
相关文章