FPGA之道(6)軟件編程思路與FPGA編程思路的變革
文章目錄
前言
名稱(chēng)對(duì)比分析
“軟件”對(duì)比“硬件”
“設(shè)計(jì)”對(duì)比“描述”
抽象層級(jí)對(duì)比
編譯原理對(duì)比
執(zhí)行方式對(duì)比
軟件程序的執(zhí)行方式
FPGA程序的執(zhí)行方式
資源占用與釋放
前言
一言以蔽之,軟件編程與FPGA編程之間最本質(zhì)的區(qū)別在于FPGA編程是并行的,而軟件編程是串行的,為了更深刻理解這句話(huà),我們看FPGA之道中對(duì)這一區(qū)別是如何解釋的。
名稱(chēng)對(duì)比分析
在軟件設(shè)計(jì)中,所采用的語(yǔ)言一般稱(chēng)之為軟件設(shè)計(jì)語(yǔ)言,而在FPGA設(shè)計(jì)中,所采用的語(yǔ)言一般統(tǒng)稱(chēng)為HDL。HDL,英文全稱(chēng)Hardware Description Language,即硬件描述語(yǔ)言,其中包括兩對(duì)關(guān)鍵字對(duì)比——“軟件”對(duì)比“硬件”和“設(shè)計(jì)”對(duì)比“描述”。
“軟件”對(duì)比“硬件”
什么是軟件?什么是硬件?這是我們首先應(yīng)該搞清楚的一件事。
在現(xiàn)實(shí)生活中,硬件是具體的、形象的,也是看得見(jiàn)、摸得著的,例如一張桌子、一把椅子。而軟件則相反,它沒(méi)有具體的形態(tài)與形象的外觀,你看不見(jiàn)它,也摸不著它,但是你卻能感受到它,因?yàn)檐浖偸且劳杏谟布嬖诘模憧梢酝ㄟ^(guò)硬件的行為去感受它。如果以人本身打個(gè)比方的話(huà),人的硬件就是指人的身體,包括人的骨骼、大腦、五臟六腑、皮膚等等,而人的軟件就是指人的智商、情商、身體協(xié)調(diào)性、速度、力量等等。
具體到我們的計(jì)算機(jī)及電子相關(guān)領(lǐng)域,軟件一般指的就是程序代碼,而硬件指的就是具體的電路板、芯片、電子元器件等等。很明顯,程序代碼是看不見(jiàn)摸不著的(有人說(shuō)我天天編程,怎么可能看不見(jiàn)代碼?其實(shí)編程時(shí)看到的僅僅是顯示器,顯示器也是一種硬件載體罷了),你不可能將它捧在手心(因?yàn)槟芘踉谑中牡闹挥小皟?yōu)樂(lè)美”和你的U盤(pán)),但是一旦有了電腦等相關(guān)硬件的支撐,程序代碼可以發(fā)揮出自己的本領(lǐng),例如視頻播放、電子游戲、智能機(jī)器人等。
經(jīng)過(guò)上述關(guān)于軟件、硬件概念的討論,我們知道軟件設(shè)計(jì)語(yǔ)言針對(duì)的對(duì)象自然是軟件,而從HDL的名稱(chēng),我們知道HDL語(yǔ)言針對(duì)的對(duì)象是硬件。那么這個(gè)區(qū)別就是造成軟件編程思路與FPGA編程思路不同的根源所在。
“設(shè)計(jì)”對(duì)比“描述”
“描述”,描寫(xiě)敘述的意思。一般什么情況下我們用這個(gè)詞?試想你剛剛看到一個(gè)美女(或帥哥),這會(huì)正在給朋友激動(dòng)的形容這個(gè)美女(或帥哥)頭發(fā)有多長(zhǎng)、眼睛有多大等等,這就叫描述。
“設(shè)計(jì)”,有目標(biāo)有計(jì)劃進(jìn)行的創(chuàng)作活動(dòng)叫設(shè)計(jì)。一般什么情況下我們用設(shè)計(jì)這個(gè)詞?試想,你給鳳姐整容了,讓她變成了世界第一美女,你這就叫設(shè)計(jì)。
因此,雖然并不能完全割裂開(kāi)來(lái),但“描述”偏重的是對(duì)已知事物的轉(zhuǎn)述,而“設(shè)計(jì)”偏重的是對(duì)未知事物的創(chuàng)造。除此以外,“描述”是可以不十分精確的,但是“設(shè)計(jì)”是來(lái)不得半點(diǎn)含糊的。
例如,我們可以這樣形象的來(lái)理解軟件“設(shè)計(jì)”與硬件“描述”行為上的不同:
如果我們要用軟件設(shè)計(jì)語(yǔ)言在一個(gè)不支持乘法的硬件系統(tǒng)上實(shí)現(xiàn)一個(gè)乘法功能,那么在編寫(xiě)軟件代碼的時(shí)候我們的思路大概是這樣的:第一步應(yīng)該判斷乘數(shù)的最高位是否為‘1’,如果是怎么怎么樣,如果不是怎么怎么樣;第二步應(yīng)該判斷乘數(shù)的次高位……;最后一步輸出結(jié)果到那里等等;每一步都要很具體。
如果我們要用HDL在一個(gè)沒(méi)有硬件乘法器的FPGA芯片上實(shí)現(xiàn)一個(gè)乘法功能,那么在編寫(xiě)HDL代碼的時(shí)候我們的思路可以是這樣的:這個(gè)功能對(duì)應(yīng)的硬件結(jié)構(gòu)相當(dāng)于一個(gè)黑盒,那么這個(gè)黑盒有什么特征呢?它有兩個(gè)輸入和一個(gè)輸出,并且輸出等于輸入的兩個(gè)數(shù)按照無(wú)符號(hào)數(shù)形式相乘的結(jié)果,描述結(jié)束!當(dāng)然,這是一個(gè)很極端的描述,它描述的非常含糊,因此至于編譯器會(huì)用FPGA中什么樣的硬件結(jié)構(gòu)來(lái)實(shí)現(xiàn)乘法功能我們不確定,甚至編譯器能不能根據(jù)我們的描述做出這樣一個(gè)乘法功能來(lái)我們也不敢保證。因此,軟件編程可以天馬行空,只要你寫(xiě)的代碼符合語(yǔ)法標(biāo)準(zhǔn),那么你寫(xiě)的出來(lái),PC機(jī)就執(zhí)行的起來(lái),充其量死機(jī)而已;而FPGA編程要腳踏實(shí)地,不能毫無(wú)忌憚的去寫(xiě)代碼,如果無(wú)法用底層的基本單元完成你所描述的功能,那么一切都白搭。所以對(duì)于用HDL編寫(xiě)FPGA設(shè)計(jì)來(lái)說(shuō),描述的越具體、越詳細(xì)、越充分,最終電路的成功性、可行性和可控性就越好,但與此同時(shí),“描述”的工作量和內(nèi)容也就會(huì)越接近“設(shè)計(jì)”。
最后,結(jié)合“軟件”與“硬件”的對(duì)比,讓我們來(lái)最終闡明一下“設(shè)計(jì)”與“描述”的本質(zhì)區(qū)別。通常來(lái)說(shuō),代碼即是程序,程序即是軟件,編寫(xiě)代碼即是軟件創(chuàng)作,那么如果我們寫(xiě)的代碼最終轉(zhuǎn)化為軟件產(chǎn)品,也就是從軟件到軟件,這就叫“設(shè)計(jì)”,因此承載這種功能的語(yǔ)言就叫軟件設(shè)計(jì)語(yǔ)言;如果我們寫(xiě)的代碼最終轉(zhuǎn)化為硬件產(chǎn)品,也就是從軟件到硬件,那這就叫“描述”,因此承載這種功能的語(yǔ)言就叫做硬件描述語(yǔ)言。
抽象層級(jí)對(duì)比
軟件的執(zhí)行必須依附于硬件,在編程時(shí),如果需要對(duì)軟件運(yùn)行的硬件環(huán)境有詳細(xì)的了解,那么這種代碼對(duì)應(yīng)的軟件產(chǎn)品一般叫驅(qū)動(dòng)程序;如果不需要對(duì)軟件運(yùn)行的硬件環(huán)境有太多了解,那么這種代碼對(duì)應(yīng)的軟件產(chǎn)品一般叫應(yīng)用程序。不管是驅(qū)動(dòng)程序還是應(yīng)用程序,它們都是直接或間接的利用它們所基于的硬件資源做事情,而無(wú)法改變硬件資源本身的行為和結(jié)構(gòu),因此我們稱(chēng)之為軟件編程。這也是為什么再厲害的計(jì)算機(jī)病毒程序也無(wú)法直接破壞電腦硬件(間接的情況是存在的,例如通過(guò)程序控制光驅(qū)的不斷讀寫(xiě),導(dǎo)致光驅(qū)過(guò)勞死;通過(guò)程序修改cpu或者顯卡的一些倍頻參數(shù),導(dǎo)致硬件超負(fù)荷工作致死;等等),這是因?yàn)檐浖倪\(yùn)行層級(jí)比硬件高,“皮之不存毛將焉附”,因此,軟件的抽象級(jí)別肯定是凌駕于硬件之上的。
而基于FPGA芯片的HDL編程,最終直接改變的是FPGA芯片內(nèi)部的硬件結(jié)構(gòu),因此HDL代碼的編寫(xiě)是位于硬件層級(jí)的,因此抽象級(jí)別較軟件編程低很多。
因此,編程語(yǔ)言抽象級(jí)別的不同,也是造成軟件編程思路與FPGA編程思路不同的原因。
最后,多余說(shuō)明一下,位于抽象層級(jí)較高的軟件編程與抽象級(jí)別較低的FPGA編程之間,還有一種編程的抽象層級(jí),叫做嵌入式編程。嵌入式編程一般運(yùn)行于單片機(jī)、ARM、DSP等微處理器相關(guān)硬件產(chǎn)品,它主要還是具有軟件編程的特征,但是程序中通過(guò)設(shè)置也可以對(duì)微處理器內(nèi)部一些靈活的硬件結(jié)構(gòu)等進(jìn)行模式配置,從而一定程度上改變了硬件的結(jié)構(gòu)。
編譯原理對(duì)比
同樣是代碼,為什么一個(gè)是軟件產(chǎn)品,而一個(gè)是硬件產(chǎn)品呢?我們都知道,寫(xiě)出來(lái)的代碼是不能直接運(yùn)行的,無(wú)論是軟件設(shè)計(jì)語(yǔ)言還是硬件描述語(yǔ)言,寫(xiě)出的代碼都需要經(jīng)過(guò)編譯,才可以被硬件使用(對(duì)于解釋型的軟件設(shè)計(jì)語(yǔ)言,相當(dāng)于實(shí)時(shí)編譯)。因此,要了解軟件編程與硬件編程的區(qū)別,還需要從代碼的編譯過(guò)程說(shuō)起。
先看軟件設(shè)計(jì)語(yǔ)言,以C語(yǔ)言程序設(shè)計(jì)為例。C語(yǔ)言是一種高級(jí)程序設(shè)計(jì)語(yǔ)言,用它編寫(xiě)的程序方便人的理解,但是CPU卻不懂。因此,編譯的第一步,是按照一定規(guī)則,將C語(yǔ)言的代碼轉(zhuǎn)換為一種叫匯編語(yǔ)言的中間代碼。匯編語(yǔ)言的代碼人閱讀起來(lái)比較困難,但是比較接近CPU的理解方式,不過(guò)CPU還是不懂。接下來(lái),編譯的第二步,把匯編語(yǔ)言每條語(yǔ)句劃分為指令和操作數(shù),然后根據(jù)相應(yīng)的翻譯對(duì)照表格翻譯成為機(jī)器語(yǔ)言,俗稱(chēng)“01”代碼。機(jī)器語(yǔ)言的代碼,人幾乎無(wú)法閱讀,但是CPU卻可以完全理解。因此,整個(gè)編譯過(guò)程結(jié)束后,將以前的C語(yǔ)法代碼轉(zhuǎn)換為CPU可以直接執(zhí)行的機(jī)器代碼,從代碼到代碼,本質(zhì)沒(méi)有任何改變,所以軟件設(shè)計(jì)語(yǔ)言最終對(duì)應(yīng)的是軟件產(chǎn)品。
再看硬件描述語(yǔ)言——HDL。用HDL語(yǔ)言編寫(xiě)的程序方便人的理解,但是FPGA卻一點(diǎn)都不懂。因此,編譯第一步,將HDL語(yǔ)言轉(zhuǎn)化成為以FPGA內(nèi)部基本資源模塊為基礎(chǔ)的門(mén)級(jí)網(wǎng)表。目前這個(gè)階段我們可以把門(mén)級(jí)網(wǎng)表理解為一個(gè)用基本門(mén)電路搭建的數(shù)字電路圖,這種門(mén)級(jí)網(wǎng)表,稍微有點(diǎn)規(guī)模,人就很難理解,但是卻比較符合FPGA的理解方式,不過(guò)FPGA還是不懂。接下來(lái),編譯第二步,將門(mén)級(jí)網(wǎng)表的各個(gè)資源映射到FPGA芯片內(nèi)部的具體位置,并卻定好連線(xiàn)開(kāi)關(guān)等一些資源的配置狀態(tài),進(jìn)而再生成用于配置FPGA的流文件。這種流文件人無(wú)法閱讀,但是FPGA卻能很好理解,并通過(guò)載入該流文件,從而對(duì)自己的硬件電路結(jié)構(gòu)進(jìn)行配置。從代碼到FPGA硬件結(jié)構(gòu)配置,所以硬件描述語(yǔ)言最終對(duì)應(yīng)的是硬件產(chǎn)品。
執(zhí)行方式對(duì)比
軟件程序的執(zhí)行方式
盡管現(xiàn)在多核、多線(xiàn)程等概念已經(jīng)充斥著CPU市場(chǎng),但是這都無(wú)法改變軟件程序串行執(zhí)行的本質(zhì)。多線(xiàn)程可以簡(jiǎn)單理解為CPU分時(shí)的執(zhí)行多個(gè)任務(wù),而多核可以簡(jiǎn)單理解為將多個(gè)單核CPU集成到一個(gè)芯片中。例如以下是C語(yǔ)言的一段代碼:
int a; //step 1
a = 100; //step 2
a += 1; //step 3
a *= 2; //step 4
printf(“%d”, a); //step 5
上述代碼,必須嚴(yán)格按照從上到下的順序一步一步執(zhí)行,最后打印的正確結(jié)果應(yīng)該是202。無(wú)論是以后出現(xiàn)再新的名詞,再時(shí)髦的概念,軟件代碼的執(zhí)行永遠(yuǎn)都必須是順序的。對(duì)于上述例子,在任何時(shí)候,都不可能有任意兩個(gè)步驟顛倒,更不可能有兩個(gè)步驟并發(fā)執(zhí)行,否則結(jié)果肯定會(huì)出錯(cuò)(盡管CPU最終執(zhí)行的是機(jī)器語(yǔ)言,但是,我們以上述C語(yǔ)言的源代碼來(lái)闡述軟件的執(zhí)行過(guò)程更加明白易懂些,并且原理上是一致的)。
下面,就詳細(xì)講解一下軟件的執(zhí)行方式。通常情況下,上述C代碼編譯好的可執(zhí)行文件會(huì)存儲(chǔ)在電腦的硬盤(pán)上,當(dāng)我們雙擊該可執(zhí)行文件后,CPU會(huì)將該可執(zhí)行文件調(diào)入計(jì)算機(jī)內(nèi)存中,并且為該程序劃分一片獨(dú)占的程序存儲(chǔ)區(qū)和數(shù)據(jù)存儲(chǔ)區(qū)。可執(zhí)行文件載入內(nèi)存后,程序指針(簡(jiǎn)稱(chēng)PC指針)通常會(huì)初始化指向程序存儲(chǔ)區(qū)中的第一行代碼,CPU會(huì)從根據(jù)PC指針的初始值從程序存儲(chǔ)段中讀取一行代碼,然后完成譯碼、執(zhí)行等步驟。如果該代碼的功能不涉及到程序跳轉(zhuǎn)及中斷,那么PC指針默認(rèn)自增1,然后CPU會(huì)讀取新的一條指令,繼續(xù)重復(fù)譯碼、執(zhí)行等步驟。如果某條指令改變了PC的值,那么CPU下一指令周期便會(huì)去讀取新PC指針值所對(duì)應(yīng)的指令來(lái)進(jìn)行譯碼、執(zhí)行等操作。若PC指針移動(dòng)到程序段的末尾后,整個(gè)程序執(zhí)行結(jié)束,結(jié)果可能已經(jīng)顯示在屏幕上或者存儲(chǔ)到硬盤(pán)上,稍后,可執(zhí)行文件占用的整個(gè)內(nèi)存空間也會(huì)被釋放掉。
因此,關(guān)于軟件程序的執(zhí)行方式,可以總結(jié)為:串行、離散、有限。串行,表示通常每次只能執(zhí)行一條語(yǔ)句;離散,表示指令順序執(zhí)行的時(shí)間間隔為若干個(gè)指令周期,而指令周期跟CPU主頻有關(guān);有限,表示程序的生命周期一般有限,除了至關(guān)重要的系統(tǒng)進(jìn)程外,一般都小于開(kāi)機(jī)時(shí)間。
FPGA程序的執(zhí)行方式
雖然HDL也有自己嚴(yán)格的語(yǔ)法解釋?zhuān)⑶乙仓С执械恼Z(yǔ)句,但是這主要是為了便于人和仿真器理解所設(shè)定的。真正的FPGA程序的執(zhí)行方式都是并行的,這種并行可不是類(lèi)似CPU多核概念那么簡(jiǎn)單。如果說(shuō)單核CPU同一時(shí)刻只能執(zhí)行一條機(jī)器代碼的話(huà),那么X核CPU充其量同一時(shí)刻也就執(zhí)行X條機(jī)器指令而已,并且這X條機(jī)器指令還必須分屬于不同的線(xiàn)程。而FPGA的并行執(zhí)行,舉個(gè)不太恰當(dāng)?shù)睦樱瑢?duì)于具有1000行功能代碼的HDL程序,同一時(shí)刻會(huì)有1000行代碼都在運(yùn)行。為什么會(huì)這樣呢,讓我們通過(guò)一段HDL代碼的例子來(lái)了解一下:
– VHDL example
a1 <= b1 and b2;
a2 <= c1 or c2;
a3 <= a1 xor a2;
// Verilog example
assign a1 = b1 & b2;
assign a2 <= c1 | c2;
assign a3 <= a1 ^ a2;
這兩段代碼分別用VHDL和Verilog語(yǔ)法描述了下圖這樣的一個(gè)數(shù)字電路結(jié)構(gòu),因此在FPGA中,最終實(shí)現(xiàn)的硬件結(jié)構(gòu)也類(lèi)似如此。
如果,在該電路的4個(gè)輸入b1、b2、c1、c2波形如下:
那么如果可能的話(huà),將三臺(tái)示波器的探針?lè)謩e置于a1、a2、a3處,得到的波形圖應(yīng)該如下:
通過(guò)上例,關(guān)于FPGA程序的執(zhí)行方式,可以總結(jié)為:并行、連續(xù)、無(wú)限。并行,表示通常HDL代碼都是并發(fā)執(zhí)行的;連續(xù),表示HDL代碼的執(zhí)行是無(wú)時(shí)間間隔的,即無(wú)時(shí)無(wú)刻都在執(zhí)行;無(wú)限,表示HDL代碼的生命周期是和系統(tǒng)運(yùn)行時(shí)間一致的。因此,在編寫(xiě)HDL代碼的時(shí)候,可不是像編寫(xiě)軟件代碼那樣,僅僅考慮和前后句之間的銜接那么簡(jiǎn)單。
其實(shí),考慮到硬件電路的工作事實(shí),F(xiàn)PGA程序執(zhí)行方式的特點(diǎn)是顯而易見(jiàn)的。
資源占用與釋放
針對(duì)軟件程序與FPGA程序的執(zhí)行方式對(duì)比,還有一點(diǎn)需要說(shuō)明,那么就是資源的占用與釋放。
對(duì)于軟件程序來(lái)說(shuō),可以動(dòng)態(tài)的申請(qǐng)與釋放資源。對(duì)于某一個(gè)具體的可執(zhí)行文件,通過(guò)合理的控制,例如及時(shí)的釋放掉沒(méi)有用的內(nèi)存,可以到達(dá)整個(gè)執(zhí)行期間對(duì)系統(tǒng)存儲(chǔ)資源占用率一直比較低的水平。
而對(duì)于FPGA程序來(lái)說(shuō),由于它對(duì)應(yīng)的是FPGA中具體的硬件資源,這就就好比電路板上的電子元器件和芯片一樣,你用或不用,它就在那里,不多不少!因此,如果FPGA程序中用到了一個(gè)乘法器,又用到了一個(gè)加法器,即使不是同時(shí)需要用到,那么FPGA程序也必須一直占用著兩個(gè)資源,只不過(guò)不需要用的時(shí)候就不去讀取相應(yīng)資源的輸出而已。
最后,一個(gè)CPU可以同時(shí)運(yùn)行多個(gè)軟件程序,因此軟件程序分享硬件資源;而一片F(xiàn)PGA芯片只能運(yùn)行一個(gè)FPGA程序,因此FPGA程序獨(dú)占FPGA芯片。
C 語(yǔ)言 FPGA
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。