寫在最前面:
沒錯(cuò),我就是一名普普通通的工程師,有那么一兩項(xiàng)能養(yǎng)活自己的技術(shù)。技術(shù)這個(gè)東西,如果只是用在工作崗位上的話,就是一個(gè)“搬磚”的工具,如果把它分享出來,沒準(zhǔn)還能碰撞出有意思的東西來,你們說是吧?
好了,這一系列博文教程叫做“FPGA軟硬件加速入門”,顧名思義,就是利用FPGA本身的特點(diǎn),在軟硬件進(jìn)行不同的系統(tǒng)分工,加速系統(tǒng)輸出的速度(主要是計(jì)算),我會(huì)盡量從入門者的角度講解相關(guān)內(nèi)容,如果你覺得還行,挺受用,動(dòng)一動(dòng)手指,幫忙轉(zhuǎn)發(fā)一下,不勝感激啦~
一、 從嵌入式軟件開發(fā)到FPGA開發(fā)
1.1 單片機(jī)開發(fā)流程淺析
在開始介紹FPGA之前,讓我們來回顧一下簡(jiǎn)單的嵌入式軟件開發(fā)吧,相信大家或多或少都接觸過單片機(jī)(Micro Control Unit)的設(shè)計(jì)流程。作為一個(gè)簡(jiǎn)單的控制器,單片機(jī)的工作流程無非如下:
1、 單片機(jī)上電,程序從存儲(chǔ)器中加載到MCU內(nèi)部;
2、 根據(jù)單片機(jī)的輸入(如鍵盤輸入、傳感器數(shù)據(jù)的讀取等)、以及程序內(nèi)部的邏輯,計(jì)算得到控制結(jié)果;
3、 將結(jié)果輸出,控制單片機(jī)的外部設(shè)備(如LED的亮滅、控制電機(jī)轉(zhuǎn)速的PWM波形等);
也就是說,一個(gè)簡(jiǎn)單的單片機(jī)工作系統(tǒng)的構(gòu)成如下:

而為了搭建上面的這樣一個(gè)系統(tǒng),我們?cè)谲浖矫嫘枰龅氖虑榘ㄏ旅孢@幾部分:
1、 代碼編輯,這里主要包括輸入輸出設(shè)備驅(qū)動(dòng)和內(nèi)部的控制邏輯;
2、 代碼編譯,將源文件(.c或.cpp)轉(zhuǎn)化為指定單片機(jī)可執(zhí)行的二進(jìn)制文件;
3、 可執(zhí)行文件燒寫,將二進(jìn)制文件固話到單片機(jī)(內(nèi)部或外部)的存儲(chǔ)器中;
上面三個(gè)步驟,我們一般是在各種IDE(Integrated Development Environment)開發(fā)環(huán)境下實(shí)現(xiàn)的,也就是說在一個(gè)軟件里面實(shí)現(xiàn)編輯、編譯、燒寫的功能,常見的IDE軟件如下:
1.2 從單片機(jī)開發(fā)到FPGA開發(fā)
1.2.1 FPGA的基本工作原理
在進(jìn)行FPGA開發(fā)之前,我們必須得了解為什么要使用FPGA,也就必須得知道FPGA的工作原理。我們知道,對(duì)于一個(gè)簡(jiǎn)單單片機(jī)系統(tǒng)來說,工作原理和上文描述一樣,也就是說,對(duì)于一個(gè)簡(jiǎn)單的讓LED閃爍的功能,單片機(jī)要做的事情如下:
1、 從(內(nèi)部或外部)的程序存儲(chǔ)器中,取出一條讓LED點(diǎn)亮的指令;
2、 將該指令輸入到CPU的指令譯碼器中,根據(jù)譯碼器的結(jié)果(此處是將控制LED的GPIO的輸出寄存器的bit位拉高)控制相應(yīng)寄存器;
3、 加載下一條延時(shí)指令,輸入到譯碼器中,進(jìn)行空操作處理;
4、 繼續(xù)加載下一條讓LED滅的指令,譯碼后,控制GPIO總線上的指定bit位拉低,從而熄滅LED;
5、 循環(huán)上述操作達(dá)到閃爍LED的目的;
通過上面閃爍LED的例子,我們可以知道,對(duì)于單片機(jī)來說,它的核心有2點(diǎn):
指令的加載、譯碼——其實(shí)也就是對(duì)指令集的解析,知道這一條語言到底進(jìn)行了什么硬件上的操作,后面章節(jié)會(huì)詳細(xì)的解釋;
外設(shè)的控制——可以通過寫寄存器控制單片機(jī)的外設(shè),如GPIO、uart、spi、IIC等;
那么對(duì)于FPGA而言呢?
無論是FPGA、單片機(jī),又或是ARM系統(tǒng)、我們的PC,其實(shí)本質(zhì)上就是一個(gè)計(jì)算平臺(tái),是一個(gè)信息處理系統(tǒng)。作為一個(gè)系統(tǒng),它的輸入、計(jì)算、輸出的構(gòu)成是永遠(yuǎn)不會(huì)變的。那變的是什么?變得是計(jì)算的原理。
對(duì)于單片機(jī)而言,取指、譯碼、輸出是它的原理,那么對(duì)于FPGA而言,它的原理又是什么?在介紹之前,我們先回顧一下《數(shù)字電路》這門課里面的基礎(chǔ)內(nèi)容——組合邏輯和時(shí)序邏輯電路。
D觸發(fā)器是時(shí)許邏輯電路的基本組件,與、或、非們是組合邏輯電路的基本組建。利用這些組建我們可以實(shí)現(xiàn)很多小的功能。
比如,通過D觸發(fā)器我們可以設(shè)計(jì)一個(gè)計(jì)數(shù)器:

比如,我們可以通過簡(jiǎn)單的組合邏輯來實(shí)現(xiàn)一個(gè)比較器

講到這里,大家可能已經(jīng)知道了,這兩個(gè)簡(jiǎn)單的邏輯電路其實(shí)能夠構(gòu)成一個(gè)讓LED閃爍的簡(jiǎn)單系統(tǒng)。我們只需要將計(jì)數(shù)器的輸出作為比較器的X輸入,而另外一個(gè)固定的電平值(比如說8)作為Y輸入,那么每當(dāng)X=Y的時(shí)候,比較器的X=Y都會(huì)輸出一個(gè)高電平。而將X=Y的輸出作為另一個(gè)1位計(jì)數(shù)器的輸入的時(shí)候,便會(huì)產(chǎn)生這么一個(gè)效果——每過8個(gè)時(shí)鐘周期后,最后輸出的電平就會(huì)反轉(zhuǎn)一次,達(dá)到LED閃爍的效果,整個(gè)電路的構(gòu)成如下:

為什么在這里要講LED閃爍的數(shù)字電路構(gòu)成呢?因?yàn)檫@正是FPGA的工作原理!FPGA全程Field Programmable Gate Array(現(xiàn)場(chǎng)可編程門陣列),這個(gè)“門”指的就是FPGA內(nèi)部芯片的主要組成部分——龐大數(shù)量的寄存器和門電路(詳細(xì)的構(gòu)成后面章節(jié)會(huì)介紹)。

至此,我們可以對(duì)比出單片機(jī)開發(fā)和FPGA工作原理了。它們的異同點(diǎn)如下表:

1.2.2 為什么要用FPGA
前面我們說到一個(gè)簡(jiǎn)單的控制LED的例子,知道了整個(gè)流程是取指、譯碼、控制外設(shè)的流程。對(duì)于一個(gè)LED電頻翻轉(zhuǎn)來說,MCU當(dāng)然是足夠的,我們思考一下以下幾個(gè)問題:
1. 如果我要輸出高清的60幀/s的1080P視頻信號(hào)給顯示器怎么辦?用GPIO控制?
2. 如果我要進(jìn)行運(yùn)算量非常大的程序,比如現(xiàn)在非?;鸬?a href="http://www.brongaenegriffin.com/tags/ai/" target="_blank">AI網(wǎng)絡(luò)訓(xùn)練,涉及到大量的乘法、加法,用MCU?PC?
回答了上述幾個(gè)問題也就解釋了為什么要用FPGA了。我們來挨個(gè)解釋一下:
1. 用GPIO翻轉(zhuǎn)輸出一個(gè)指定的電平需要幾十個(gè)時(shí)鐘周期(MCU的clock頻率),如果我要輸出一個(gè)60幀、1080P的視頻信號(hào)的話(其實(shí)也是電平的控制),那么翻轉(zhuǎn)的頻率可能要達(dá)到百兆的速度了,如果使用MCU這種方式的話,MCU要達(dá)到幾GHz的主頻了,這顯然是不現(xiàn)實(shí)的。而根據(jù)上面FPGA的電平翻轉(zhuǎn)的原理,D觸發(fā)器的時(shí)鐘頻率只需要百兆就可以了;
2. 計(jì)算機(jī)基礎(chǔ)告訴我們,無論是MCU還是PC的CPU,內(nèi)部都有相應(yīng)的乘法器和加法器。如果設(shè)計(jì)到大量的計(jì)算的話,單個(gè)乘法/加法器哪怕主頻再高,計(jì)算速度也跟不上。而對(duì)于FPGA來說,可以仿照上面計(jì)數(shù)器、比較器的方式,設(shè)計(jì)幾十個(gè)、幾百個(gè)甚至幾千個(gè)計(jì)算單元,哪怕主頻比CPU低很多,計(jì)算速度也遠(yuǎn)高于CPU。二者的關(guān)系可以用下圖形象地表示:

FPGA開發(fā)流程
二、FPGA開發(fā)流程
FPGA的開發(fā)有一個(gè)特點(diǎn),即開發(fā)環(huán)境和使用的芯片有非常強(qiáng)的關(guān)聯(lián)性。不像單片機(jī)開發(fā)的IDE,一個(gè)開發(fā)套件可以適配幾十上百家不同的單片機(jī)(各種51、PIC、stm32等)。但目前主流的FPGA芯片只有2家——Xilinx(賽靈思)和Altera(后被Intel收購(gòu),我們姑且稱之為英特爾的FPGA吧)。
這系列博文主要集中在Xilinx的FPGA芯片及其相應(yīng)的開發(fā)套件Vivado上。
以比較常見的stm32系列單片機(jī)和集成開發(fā)環(huán)境Keil為例,我們來對(duì)比一下單片機(jī)開發(fā)和FPGA開發(fā)的流程。


可以看到,相對(duì)于單片機(jī)(更不用說普通的PC軟件開發(fā)了),F(xiàn)PGA的開發(fā)流程復(fù)雜了許多。工程么,不就是各種tradeoff,開發(fā)便利和計(jì)算性取舍,就是后話了~
電子發(fā)燒友App







評(píng)論