寫在最前面:
沒錯,我就是一名普普通通的工程師,有那么一兩項能養(yǎng)活自己的技術(shù)。技術(shù)這個東西,如果只是用在工作崗位上的話,就是一個“搬磚”的工具,如果把它分享出來,沒準(zhǔn)還能碰撞出有意思的東西來,你們說是吧?
好了,這一系列博文教程叫做“FPGA軟硬件加速入門”,顧名思義,就是利用FPGA本身的特點(diǎn),在軟硬件進(jìn)行不同的系統(tǒng)分工,加速系統(tǒng)輸出的速度(主要是計算),我會盡量從入門者的角度講解相關(guān)內(nèi)容,如果你覺得還行,挺受用,動一動手指,幫忙轉(zhuǎn)發(fā)一下,不勝感激啦~
一、 從嵌入式軟件開發(fā)到FPGA開發(fā)
1.1 單片機(jī)開發(fā)流程淺析
在開始介紹FPGA之前,讓我們來回顧一下簡單的嵌入式軟件開發(fā)吧,相信大家或多或少都接觸過單片機(jī)(Micro Control Unit)的設(shè)計流程。作為一個簡單的控制器,單片機(jī)的工作流程無非如下:
1、 單片機(jī)上電,程序從存儲器中加載到MCU內(nèi)部;
2、 根據(jù)單片機(jī)的輸入(如鍵盤輸入、傳感器數(shù)據(jù)的讀取等)、以及程序內(nèi)部的邏輯,計算得到控制結(jié)果;
3、 將結(jié)果輸出,控制單片機(jī)的外部設(shè)備(如LED的亮滅、控制電機(jī)轉(zhuǎn)速的PWM波形等);
也就是說,一個簡單的單片機(jī)工作系統(tǒng)的構(gòu)成如下:
而為了搭建上面的這樣一個系統(tǒng),我們在軟件方面需要做的事情包括下面這幾部分:
1、 代碼編輯,這里主要包括輸入輸出設(shè)備驅(qū)動和內(nèi)部的控制邏輯;
2、 代碼編譯,將源文件(.c或.cpp)轉(zhuǎn)化為指定單片機(jī)可執(zhí)行的二進(jìn)制文件;
3、 可執(zhí)行文件燒寫,將二進(jìn)制文件固話到單片機(jī)(內(nèi)部或外部)的存儲器中;
上面三個步驟,我們一般是在各種IDE(Integrated Development Environment)開發(fā)環(huán)境下實現(xiàn)的,也就是說在一個軟件里面實現(xiàn)編輯、編譯、燒寫的功能,常見的IDE軟件如下:
1.2 從單片機(jī)開發(fā)到FPGA開發(fā)
1.2.1 FPGA的基本工作原理
在進(jìn)行FPGA開發(fā)之前,我們必須得了解為什么要使用FPGA,也就必須得知道FPGA的工作原理。我們知道,對于一個簡單單片機(jī)系統(tǒng)來說,工作原理和上文描述一樣,也就是說,對于一個簡單的讓LED閃爍的功能,單片機(jī)要做的事情如下:
1、 從(內(nèi)部或外部)的程序存儲器中,取出一條讓LED點(diǎn)亮的指令;
2、 將該指令輸入到CPU的指令譯碼器中,根據(jù)譯碼器的結(jié)果(此處是將控制LED的GPIO的輸出寄存器的bit位拉高)控制相應(yīng)寄存器;
3、 加載下一條延時指令,輸入到譯碼器中,進(jìn)行空操作處理;
4、 繼續(xù)加載下一條讓LED滅的指令,譯碼后,控制GPIO總線上的指定bit位拉低,從而熄滅LED;
5、 循環(huán)上述操作達(dá)到閃爍LED的目的;
通過上面閃爍LED的例子,我們可以知道,對于單片機(jī)來說,它的核心有2點(diǎn):
指令的加載、譯碼——其實也就是對指令集的解析,知道這一條語言到底進(jìn)行了什么硬件上的操作,后面章節(jié)會詳細(xì)的解釋;
外設(shè)的控制——可以通過寫寄存器控制單片機(jī)的外設(shè),如GPIO、uart、spi、IIC等;
那么對于FPGA而言呢?
無論是FPGA、單片機(jī),又或是ARM系統(tǒng)、我們的PC,其實本質(zhì)上就是一個計算平臺,是一個信息處理系統(tǒng)。作為一個系統(tǒng),它的輸入、計算、輸出的構(gòu)成是永遠(yuǎn)不會變的。那變的是什么?變得是計算的原理。
對于單片機(jī)而言,取指、譯碼、輸出是它的原理,那么對于FPGA而言,它的原理又是什么?在介紹之前,我們先回顧一下《數(shù)字電路》這門課里面的基礎(chǔ)內(nèi)容——組合邏輯和時序邏輯電路。
D觸發(fā)器是時許邏輯電路的基本組件,與、或、非們是組合邏輯電路的基本組建。利用這些組建我們可以實現(xiàn)很多小的功能。
比如,通過D觸發(fā)器我們可以設(shè)計一個計數(shù)器:
比如,我們可以通過簡單的組合邏輯來實現(xiàn)一個比較器
講到這里,大家可能已經(jīng)知道了,這兩個簡單的邏輯電路其實能夠構(gòu)成一個讓LED閃爍的簡單系統(tǒng)。我們只需要將計數(shù)器的輸出作為比較器的X輸入,而另外一個固定的電平值(比如說8)作為Y輸入,那么每當(dāng)X=Y的時候,比較器的X=Y都會輸出一個高電平。而將X=Y的輸出作為另一個1位計數(shù)器的輸入的時候,便會產(chǎn)生這么一個效果——每過8個時鐘周期后,最后輸出的電平就會反轉(zhuǎn)一次,達(dá)到LED閃爍的效果,整個電路的構(gòu)成如下:
為什么在這里要講LED閃爍的數(shù)字電路構(gòu)成呢?因為這正是FPGA的工作原理!FPGA全程Field Programmable Gate Array(現(xiàn)場可編程門陣列),這個“門”指的就是FPGA內(nèi)部芯片的主要組成部分——龐大數(shù)量的寄存器和門電路(詳細(xì)的構(gòu)成后面章節(jié)會介紹)。
至此,我們可以對比出單片機(jī)開發(fā)和FPGA工作原理了。它們的異同點(diǎn)如下表:
1.2.2 為什么要用FPGA
前面我們說到一個簡單的控制LED的例子,知道了整個流程是取指、譯碼、控制外設(shè)的流程。對于一個LED電頻翻轉(zhuǎn)來說,MCU當(dāng)然是足夠的,我們思考一下以下幾個問題:
1. 如果我要輸出高清的60幀/s的1080P視頻信號給顯示器怎么辦?用GPIO控制?
2. 如果我要進(jìn)行運(yùn)算量非常大的程序,比如現(xiàn)在非?;鸬?a href="http://www.delux-kingway.cn/tags/ai/" target="_blank">AI網(wǎng)絡(luò)訓(xùn)練,涉及到大量的乘法、加法,用MCU?PC?
回答了上述幾個問題也就解釋了為什么要用FPGA了。我們來挨個解釋一下:
1. 用GPIO翻轉(zhuǎn)輸出一個指定的電平需要幾十個時鐘周期(MCU的clock頻率),如果我要輸出一個60幀、1080P的視頻信號的話(其實也是電平的控制),那么翻轉(zhuǎn)的頻率可能要達(dá)到百兆的速度了,如果使用MCU這種方式的話,MCU要達(dá)到幾GHz的主頻了,這顯然是不現(xiàn)實的。而根據(jù)上面FPGA的電平翻轉(zhuǎn)的原理,D觸發(fā)器的時鐘頻率只需要百兆就可以了;
2. 計算機(jī)基礎(chǔ)告訴我們,無論是MCU還是PC的CPU,內(nèi)部都有相應(yīng)的乘法器和加法器。如果設(shè)計到大量的計算的話,單個乘法/加法器哪怕主頻再高,計算速度也跟不上。而對于FPGA來說,可以仿照上面計數(shù)器、比較器的方式,設(shè)計幾十個、幾百個甚至幾千個計算單元,哪怕主頻比CPU低很多,計算速度也遠(yuǎn)高于CPU。二者的關(guān)系可以用下圖形象地表示:
FPGA開發(fā)流程
二、FPGA開發(fā)流程
FPGA的開發(fā)有一個特點(diǎn),即開發(fā)環(huán)境和使用的芯片有非常強(qiáng)的關(guān)聯(lián)性。不像單片機(jī)開發(fā)的IDE,一個開發(fā)套件可以適配幾十上百家不同的單片機(jī)(各種51、PIC、stm32等)。但目前主流的FPGA芯片只有2家——Xilinx(賽靈思)和Altera(后被Intel收購,我們姑且稱之為英特爾的FPGA吧)。
這系列博文主要集中在Xilinx的FPGA芯片及其相應(yīng)的開發(fā)套件Vivado上。
以比較常見的stm32系列單片機(jī)和集成開發(fā)環(huán)境Keil為例,我們來對比一下單片機(jī)開發(fā)和FPGA開發(fā)的流程。
可以看到,相對于單片機(jī)(更不用說普通的PC軟件開發(fā)了),F(xiàn)PGA的開發(fā)流程復(fù)雜了許多。工程么,不就是各種tradeoff,開發(fā)便利和計算性取舍,就是后話了~
評論