一、指令集
圖片來(lái)源:互聯(lián)網(wǎng)
依據(jù)指令長(zhǎng)度的不同,指令系統(tǒng)可分為復(fù)雜指令系統(tǒng)(Complex Instruction Set Computer,簡(jiǎn)稱CISC )、精簡(jiǎn)指令系統(tǒng)(Reduced Instruction Set Computer,簡(jiǎn)稱 RISC)和超長(zhǎng)指令字(Very Long Instruction Word,簡(jiǎn)稱VLIW)指令集三種。
CISC中的指令長(zhǎng)度可變;RISC中的指令長(zhǎng)度比較固定;VLIW本質(zhì)上來(lái)講是多條同時(shí)執(zhí)行的指令的組合,其“同時(shí)執(zhí)行”的特征由編譯器指定,無(wú)須硬件進(jìn)行判斷。超標(biāo)量處理器是動(dòng)態(tài)調(diào)度,由硬件發(fā)現(xiàn)指令級(jí)并行機(jī)會(huì)并負(fù)責(zé)正確調(diào)度,VLIW是靜態(tài)調(diào)度,由編譯器發(fā)現(xiàn)指令級(jí)并行機(jī)會(huì)并負(fù)責(zé)正確調(diào)度。
VLIW結(jié)構(gòu)的最初思想是最大限度利用指令級(jí)并行(Instruction Level Parallelism,簡(jiǎn)稱ILP),VLIW的一個(gè)超長(zhǎng)指令字由多個(gè)互相不存在相關(guān)性(控制相關(guān)、數(shù)據(jù)相關(guān)等)的指令組成,可并行進(jìn)行處理。VLIW可顯著簡(jiǎn)化硬件實(shí)現(xiàn),但增加了編譯器的設(shè)計(jì)難度。由于AI和DSP領(lǐng)域,數(shù)據(jù)基本上是數(shù)據(jù)流,沒(méi)有跳轉(zhuǎn),因此特別適合靜態(tài)的VLIW,近期有不少AI芯片使用VLIW架構(gòu)。
圖片來(lái)源:互聯(lián)網(wǎng)
早期的CPU都采用CISC結(jié)構(gòu),如IBM的System360、Intel的8080和8086系列、Motorola的68000系列等。這與當(dāng)時(shí)的時(shí)代特點(diǎn)有關(guān),早期處理器設(shè)備昂貴且處理速度慢,設(shè)計(jì)者不得不加入越來(lái)越多的復(fù)雜指令來(lái)提高執(zhí)行效率,部分復(fù)雜指令甚至可與高級(jí)語(yǔ)言中的操作直接對(duì)應(yīng)。這種設(shè)計(jì)簡(jiǎn)化了軟件和編譯器的設(shè)計(jì),但也顯著提高了硬件的復(fù)雜性。
當(dāng)硬件復(fù)雜度逐漸提高時(shí),CISC結(jié)構(gòu)出現(xiàn)了一系列問(wèn)題。大量復(fù)雜指令在實(shí)際中很少用到,典型程序所使用的80%的指令只占指令集總指令數(shù)的20%,消耗大量精力的復(fù)雜設(shè)計(jì)只有很少的回報(bào)。同時(shí),復(fù)雜的微代碼翻譯也會(huì)增加流水線設(shè)計(jì)難度,并降低頻繁使用的簡(jiǎn)單指令的執(zhí)行效率。針對(duì)CISC結(jié)構(gòu)的缺點(diǎn),RISC遵循簡(jiǎn)化的核心思路。
RISC簡(jiǎn)化了指令功能,單個(gè)指令執(zhí)行周期短;簡(jiǎn)化了指令編碼,使得譯碼簡(jiǎn)單;簡(jiǎn)化了訪存類(lèi)型,訪存只能通過(guò)load/store指令實(shí)現(xiàn)。RISC指令的設(shè)計(jì)精髓是簡(jiǎn)化了指令間的關(guān)系,有利于實(shí)現(xiàn)高效的流水線、多發(fā)射等技術(shù),從而提高主頻和效率。
RISC指令系統(tǒng)的最本質(zhì)特征是通過(guò)load/store結(jié)構(gòu)簡(jiǎn)化了指令間關(guān)系,即所有運(yùn)算指令都是對(duì)寄存器運(yùn)算,所有訪存都通過(guò)專用的訪存指令(load/store)進(jìn)行。這樣,CPU只要通過(guò)寄存器的比較就能判斷運(yùn)算指令之間以及運(yùn)算指令和訪存指令之間有沒(méi)有數(shù)據(jù)相關(guān)性,而較復(fù)雜的訪存指令相關(guān)判斷(需要對(duì)訪存的物理地址進(jìn)行比較)則只在執(zhí)行l(wèi)oad/store指令的訪存部件上進(jìn)行,從而大大簡(jiǎn)化了指令間相關(guān)性判斷的復(fù)雜度,有利于CPU采用指令流水線、多發(fā)射、亂序執(zhí)行等提高性能。因此,RISC不僅是一種指令系統(tǒng)類(lèi)型,同時(shí)也是一種提高CPU性能的技術(shù)。X86處理器中將 CISC指令譯碼為類(lèi)RISC的內(nèi)部操作,然后對(duì)這些內(nèi)部操作使用諸如超流水、亂序執(zhí)行、多發(fā)射等高效實(shí)現(xiàn)手段。而以PowerPC為例的RISC處理器則包含了許多功能強(qiáng)大的指令。
RISC的設(shè)計(jì)初衷針對(duì)CISC CPU復(fù)雜的弊端,選擇一些可以在單個(gè)CPU周期完成的指令,以降低CPU的復(fù)雜度,將復(fù)雜性交給編譯器。舉個(gè)例子,CISC提供的乘法指令,調(diào)用時(shí)可完成內(nèi)存a和內(nèi)存b中的兩個(gè)數(shù)相乘,結(jié)果存入內(nèi)存a,需要多個(gè)CPU周期才可以完成;而RISC不提供“一站式”的乘法指令,需調(diào)用四條單CPU周期指令完成兩數(shù)相乘:內(nèi)存a加載到寄存器,內(nèi)存b加載到寄存器,兩個(gè)寄存器中數(shù)相乘,寄存器結(jié)果存入內(nèi)存a。按此思路,早期設(shè)計(jì)出的RISC指令集,指令數(shù)是比CISC少些,但后來(lái),很多RISC的指令集中指令數(shù)反超了CISC,因此,引用指令的復(fù)雜度而非數(shù)量來(lái)區(qū)分兩種指令集。
CISC指令的格式長(zhǎng)短不一,執(zhí)行時(shí)的周期次數(shù)也不統(tǒng)一,而RISC結(jié)構(gòu)剛好相反,它是定長(zhǎng)的,故適合采用管線處理架構(gòu)的設(shè)計(jì),進(jìn)而可以達(dá)到平均一周期完成一指令的方向努力。顯然,在設(shè)計(jì)上RISC較CISC簡(jiǎn)單,同時(shí)因?yàn)镃ISC的執(zhí)行步驟過(guò)多,閑置的單元電路等待時(shí)間增長(zhǎng),不利于平行處理的設(shè)計(jì),所以就效能而言RISC較CISC還是站了上風(fēng),但RISC因指令精簡(jiǎn)化后造成應(yīng)用程式碼變大,需要較大的程式存儲(chǔ)空間,且存在指令種類(lèi)較多等等的缺點(diǎn)。
對(duì)CPU內(nèi)核結(jié)構(gòu)的影響X86指令集早期通常只有8個(gè)通用寄存器。所以,CISC的CPU執(zhí)行是大多數(shù)時(shí)間是在訪問(wèn)存儲(chǔ)器中的數(shù)據(jù),而不是寄存器中的。這就拖慢了整個(gè)系統(tǒng)的速度。RISC系統(tǒng)往往具有非常多的通用寄存器,早期多是27個(gè),并采用了重疊寄存器窗口和寄存器堆等技術(shù)使寄存器資源得到充分的利用。
大部分情況下(90%)的時(shí)間內(nèi)處理器都在運(yùn)行少數(shù)的指令,其余的時(shí)間則運(yùn)行各式各樣的復(fù)雜指令(復(fù)雜就意味著較長(zhǎng)的運(yùn)行時(shí)間),RISC就是將這些復(fù)雜的指令剔除掉,只留下最經(jīng)常運(yùn)行的指令(所謂的精簡(jiǎn)指令集),然而被剔除掉的那些指令雖然實(shí)現(xiàn)起來(lái)比較麻煩,卻在某些領(lǐng)域確實(shí)有其價(jià)值,RISC的做法就是將這些麻煩都交給軟件,CISC的做法則是像現(xiàn)在這樣: 由硬件設(shè)計(jì)完成。因此RISC指令集對(duì)編譯器要求很高,而CISC則很簡(jiǎn)單。對(duì)編程人員的要求也類(lèi)似。
因此x86架構(gòu)通常只需要一個(gè)復(fù)雜解碼器,簡(jiǎn)單解碼器可以將一條x86指令(包括大部分SSE指令在內(nèi))翻譯為一條微指令(uop),而復(fù)雜解碼器則將一些特別的(單條)x86指令翻譯為1~4 條uops——在極少數(shù)的情況下,某些指令需通過(guò)額外的可編程microcode解碼器解碼為更多的uops (有時(shí)候甚至可達(dá)幾百個(gè),因?yàn)橐恍㊣A指令很復(fù)雜,并且可以帶有很多的前綴/修改量,當(dāng)然這種情況很少見(jiàn))。
二、運(yùn)算架構(gòu)
馮諾伊曼架構(gòu)與哈佛架構(gòu)
圖片來(lái)源:互聯(lián)網(wǎng)
馮諾伊曼架構(gòu)與哈佛架構(gòu)最大區(qū)別是存儲(chǔ)總線,馮諾依曼架構(gòu)的指令和數(shù)據(jù)是共用一條總線,也就是說(shuō),不能同時(shí)讀取指令和數(shù)據(jù),必須在時(shí)間序列上分開(kāi)。哈佛架構(gòu)是指令和數(shù)據(jù)用不同的總線,可以同時(shí)讀取指令和數(shù)據(jù)。
早期的計(jì)算機(jī)設(shè)計(jì)中,程序和數(shù)據(jù)是倆個(gè)截然不同的概念,數(shù)據(jù)放在存儲(chǔ)器中,而程序作為控制器的一部分,這樣的計(jì)算機(jī)計(jì)算效率低,靈活性較差。馮.諾依曼結(jié)構(gòu)中,將程序和數(shù)據(jù)一樣看待,將程序編碼為數(shù)據(jù),然后與數(shù)據(jù)一同存放在存儲(chǔ)器中,這樣計(jì)算機(jī)就可以調(diào)用存儲(chǔ)器中的程序來(lái)處理數(shù)據(jù)了。這意味著無(wú)論什么程序,最終都是會(huì)轉(zhuǎn)換為數(shù)據(jù)的形式存儲(chǔ)在存儲(chǔ)器中,要執(zhí)行相應(yīng)的程序只需要從存儲(chǔ)器中依次取出指令、執(zhí)行,而無(wú)需再?gòu)目刂破髦腥〕?,馮.諾依曼結(jié)構(gòu)的靈魂所在正是這里:這種設(shè)計(jì)思想導(dǎo)致了硬件和軟件的分離,即硬件設(shè)計(jì)和程序設(shè)計(jì)可以分開(kāi)執(zhí)行。
現(xiàn)代計(jì)算架構(gòu)中,整個(gè)計(jì)算架構(gòu)通常都采用馮諾依曼架構(gòu),在CPU內(nèi)部采用類(lèi)哈佛架構(gòu),在現(xiàn)代CPU內(nèi)部的一級(jí)緩存中,指令和數(shù)據(jù)是分開(kāi)存儲(chǔ)的,但指令和數(shù)據(jù)的尋址空間address space還是共享的,這不能算嚴(yán)格的哈佛架構(gòu),但思路是哈佛架構(gòu)的思路。
馮諾依曼詳細(xì)架構(gòu)
圖片來(lái)源:互聯(lián)網(wǎng)
虛線框內(nèi)再加上多級(jí)緩存就是現(xiàn)代意義上的CPU,鼠標(biāo)鍵盤(pán)是輸入設(shè)備、顯示器是輸出設(shè)備;手機(jī)觸摸屏既是輸入設(shè)備又是輸出設(shè)備;服務(wù)器中網(wǎng)卡既是輸入設(shè)備又是輸出設(shè)備;所有的計(jì)算機(jī)程序都可以抽象為輸入設(shè)備讀取信息,通過(guò)CPU來(lái)執(zhí)行存儲(chǔ)在存儲(chǔ)器中的程序,結(jié)果通過(guò)輸出設(shè)備反饋給用戶。
算術(shù)邏輯單元(Arithmetic Logic Unit,ALU)。ALU的主要功能就是在控制信號(hào)的作用下,完成加、減、乘、除等算術(shù)運(yùn)算以及與、或、非、異或等邏輯運(yùn)算以及移位、補(bǔ)位等運(yùn)算??刂茊卧–ontrol Unit),是計(jì)算機(jī)的神經(jīng)中樞和指揮中心,只有在控制器的控制下,整個(gè)計(jì)算機(jī)才能有條不紊地工作、自動(dòng)執(zhí)行程序。
控制器的工作流程為:從內(nèi)存中取指令、翻譯指令、分析指令,然后根據(jù)指令的內(nèi)存向有關(guān)部件發(fā)送控制命令,控制相關(guān)部件執(zhí)行指令所包含的操作。 計(jì)算機(jī)內(nèi)部,程序和數(shù)據(jù)都是以二進(jìn)制代碼的形式存儲(chǔ)的,均以字節(jié)為單位(8位)存儲(chǔ)在存儲(chǔ)器中,一個(gè)字節(jié)占用一個(gè)存儲(chǔ)單元,且每個(gè)存儲(chǔ)單元都有唯一的地址號(hào)。
CPU可以直接使用指令對(duì)內(nèi)部存儲(chǔ)器按照地址進(jìn)行讀寫(xiě)兩種操作,讀:將內(nèi)存中某個(gè)存儲(chǔ)單元的內(nèi)容讀出,送入CPU的某個(gè)寄存器中;寫(xiě):在控制器的控制下,將CPU中某寄存器內(nèi)容傳到某個(gè)存儲(chǔ)單元中。要注意,內(nèi)存中的數(shù)據(jù)和地址碼都是二進(jìn)制數(shù),但是倆者是不同的,一個(gè)地址碼可以指向一個(gè)存儲(chǔ)單元,地址是存儲(chǔ)單元的位置,數(shù)據(jù)是存儲(chǔ)單元的內(nèi)容。地址碼的長(zhǎng)度由內(nèi)存單元的個(gè)數(shù)確定。
內(nèi)存的存取速度會(huì)直接影響計(jì)算機(jī)的運(yùn)算速度,由于CPU是高速器件,但是CPU的速度是受制于內(nèi)存的存取速度的,所以為解決CPU與內(nèi)存速度不匹配的問(wèn)題,在CPU和內(nèi)存直接設(shè)置了一種高速緩沖存儲(chǔ)器Cache。Cache是計(jì)算機(jī)中的一個(gè)高速小容量存儲(chǔ)器,其中存放的是CPU近期要執(zhí)行的指令和數(shù)據(jù),其存取速度可以和CPU的速度匹配,一般采用靜態(tài)RAM充當(dāng)Cache即緩存。
內(nèi)存按工作方式的不同又可以分為倆部分:RAM:隨機(jī)存儲(chǔ)器,可以被CPU隨機(jī)讀取,一般存放CPU將要執(zhí)行的程序、數(shù)據(jù),斷電丟失數(shù)據(jù)。ROM:只讀存儲(chǔ)器,只能被CPU讀,不能輕易被CPU寫(xiě),用來(lái)存放永久性的程序和數(shù)據(jù),比如:系統(tǒng)引導(dǎo)程序、監(jiān)控程序等。具有掉電非易失性。
哈佛架構(gòu)
圖片來(lái)源:互聯(lián)網(wǎng)
通常哈佛架構(gòu)有四條總線,處理器與存儲(chǔ)器之間有兩條總線,一條是尋址,一條是數(shù)據(jù),哈佛架構(gòu)的指令(即編程Program)和數(shù)據(jù)分開(kāi)存儲(chǔ),也就是四條總線。
典型的哈佛架構(gòu)是DSP,通常我們把馮諾依曼架構(gòu)的處理器叫GPP,即通用型處理器。DSP是為單一密集計(jì)算任務(wù)如視頻編解碼、FIR濾波器,這些任務(wù)拆解到底層通常是乘法或乘積累加。DSP為了進(jìn)行這些密集計(jì)算任務(wù),添加了一些固定算法指令,比如單周期乘加指令、逆序加減指令(FFT時(shí)特別有用,不是ARM的那種逆序),塊重復(fù)指令(減少跳轉(zhuǎn)延時(shí))等等,甚至將很多常用的由幾個(gè)操作組成的一個(gè)序列專門(mén)設(shè)計(jì)一個(gè)指令可以一周期完成(比如一指令作一個(gè)乘法,把結(jié)果累加,同時(shí)將操作數(shù)地址逆序加1),極大地提高了信號(hào)處理的速度。
由于數(shù)字處理的讀數(shù)、回寫(xiě)量非常大,為了提高速度,采用指令、數(shù)據(jù)空間分開(kāi)的方式,以兩條總線來(lái)分別訪問(wèn)兩個(gè)空間,同時(shí),一般在DSP內(nèi)部有高速RAM,數(shù)據(jù)和程序要先加載到高速片內(nèi)RAM中才能運(yùn)行。DSP為提高數(shù)字計(jì)算效率,犧牲了存儲(chǔ)器管理的方便性,對(duì)多任務(wù)的支持要差的多,所以DSP不適合于作多任務(wù)控制作用。
像乘積累加計(jì)算,早期GPP(通用處理器)處理一般是用加法代替乘法,要n多CPU周期,盡管CPU主頻很快,但還是要相當(dāng)時(shí)間,所以早期CPU會(huì)特設(shè)一個(gè)乘法器專門(mén)做乘法。乘法都如此麻煩,乘積累加就更麻煩,通常做一次乘法會(huì)發(fā)生4次存儲(chǔ)器訪問(wèn),用掉至少四個(gè)指令周期。再做加法,再用掉兩個(gè)指令周期,而DSP只需要一個(gè)指令周期。
現(xiàn)在典型的高性能GPP實(shí)際上已包含兩個(gè)片內(nèi)高速緩存,一個(gè)是數(shù)據(jù),一個(gè)是指令,它們直接連接到處理器核,以加快運(yùn)行時(shí)的訪問(wèn)速度。從物理上說(shuō),這種片內(nèi)的雙存儲(chǔ)器和總線的結(jié)構(gòu)幾乎與哈佛結(jié)構(gòu)的一樣了。然而從邏輯上講,兩者還是有重要的區(qū)別。GPP使用控制邏輯來(lái)決定哪些數(shù)據(jù)和指令字存儲(chǔ)在片內(nèi)的高速緩存里,其程序員并不加以指定(也可能根本不知道)。
與此相反,DSP使用多個(gè)片內(nèi)存儲(chǔ)器和多組總線來(lái)保證每個(gè)指令周期內(nèi)存儲(chǔ)器的多次訪問(wèn)。在使用DSP時(shí),程序員要明確地控制哪些數(shù)據(jù)和指令要存儲(chǔ)在片內(nèi)存儲(chǔ)器中,哪些要放在片外。也就是說(shuō)GPP的數(shù)據(jù)和指令程序員無(wú)法修改,有時(shí)可能出現(xiàn)錯(cuò)誤,也會(huì)導(dǎo)致效率的下降,不過(guò)由于在一個(gè)尋址空間內(nèi),即便出現(xiàn)錯(cuò)誤,帶來(lái)的后果也只是延遲,效率降低。而DSP不同,它是非常靈活的,可以保證任何狀況下效率都是最高,當(dāng)然缺點(diǎn)是萬(wàn)一數(shù)據(jù)和指令錯(cuò)誤,可能會(huì)出現(xiàn)中斷乃至系統(tǒng)崩潰,因此DSP只能執(zhí)行比較簡(jiǎn)單純粹的任務(wù)。
程序員在寫(xiě)程序時(shí),必須保證處理器能夠有效地使用其雙總線。此外,DSP處理器幾乎都不具備數(shù)據(jù)高速緩存。這是因?yàn)镈SP的典型數(shù)據(jù)是數(shù)據(jù)流。也就是說(shuō),DSP處理器對(duì)每個(gè)數(shù)據(jù)樣本做計(jì)算后,就丟棄了,幾乎不再重復(fù)使用。 DSP算法的一個(gè)共同的特點(diǎn),即大多數(shù)的處理時(shí)間是花在執(zhí)行較小的循環(huán)上,也就容易理解,為什么大多數(shù)的DSP都有專門(mén)的硬件,用于零開(kāi)銷(xiāo)循環(huán)。所謂零開(kāi)銷(xiāo)循環(huán)是指處理器在執(zhí)行循環(huán)時(shí),不用花時(shí)間去檢查循環(huán)計(jì)數(shù)器的值、條件轉(zhuǎn)移到循環(huán)的頂部、將循環(huán)計(jì)數(shù)器減1。
與此相反,GPP的循環(huán)使用軟件來(lái)實(shí)現(xiàn)。某些高性能的GPP使用轉(zhuǎn)移預(yù)報(bào)硬件,幾乎達(dá)到與硬件支持的零開(kāi)銷(xiāo)循環(huán)同樣的效果。 GPP的程序通常并不在意處理器的指令集是否容易使用,因?yàn)樗麄円话闶褂孟馛或C++等高級(jí)語(yǔ)言。而對(duì)于DSP的程序員來(lái)說(shuō),不幸的是主要的DSP應(yīng)用程序都是用匯編語(yǔ)言寫(xiě)的(至少部分是匯編語(yǔ)言優(yōu)化的)。
這里有兩個(gè)理由:首先,大多數(shù)廣泛使用的高級(jí)語(yǔ)言,例如C,并不適合于描述典型的DSP算法。其次,DSP結(jié)構(gòu)的復(fù)雜性,如多存儲(chǔ)器空間、多總線、不規(guī)則的指令集、高度專門(mén)化的硬件等,使得難于為其編寫(xiě)高效率的編譯器。即便用編譯器將C源代碼編譯成為DSP的匯編代碼,優(yōu)化的任務(wù)仍然很重。典型的DSP應(yīng)用都具有大量計(jì)算的要求,并有嚴(yán)格的開(kāi)銷(xiāo)限制,使得程序的優(yōu)化必不可少(至少是對(duì)程序的最關(guān)鍵部分)。因此,考慮選用DSP的一個(gè)關(guān)鍵因素是,是否存在足夠的能夠較好地適應(yīng)DSP處理器指令集的程序員。
除DSP外,MCU一般也是哈佛架構(gòu),因?yàn)镸CU所需要的數(shù)據(jù)和指令體積都很小,分開(kāi)存儲(chǔ)也不會(huì)增加多少成本。MCU的運(yùn)算能力一般較弱,運(yùn)行頻率較低,一般只有幾十MHz到300MHz,因此運(yùn)算需要高效率,馮諾依曼架構(gòu)不適合。再有就是MCU一般是嵌入式系統(tǒng),電池供電,對(duì)功耗要求高,需要低功耗,需要高效率的哈佛架構(gòu)。
三、FPGA
大部分FPGA器件采用了查找表(Look Up Table,LUT)結(jié)構(gòu)。查找表的原理類(lèi)似于ROM,其物理結(jié)構(gòu)是靜態(tài)存儲(chǔ)器(SRAM),N個(gè)輸入項(xiàng)的邏輯函數(shù)能夠由一個(gè)2^N位容量的SRAM實(shí)現(xiàn), 函數(shù)值存放在SRAM中,SRAM的地址線起輸入線的作用,地址即輸入變量值,SRAM的輸出為邏輯函數(shù)值。由連線開(kāi)關(guān)實(shí)現(xiàn)與其它功能塊的連接。
RAM基本的作用就是存儲(chǔ)代碼和數(shù)據(jù)供CPU在需要的時(shí)候調(diào)用??墒沁@些數(shù)據(jù)并非像用袋子盛米那么簡(jiǎn)單。更像是圖書(shū)館中用有格子的書(shū)架存放書(shū)籍一樣。不但要放進(jìn)去還要可以在需要的時(shí)候準(zhǔn)確地調(diào)用出來(lái)。盡管都是書(shū)可是每本書(shū)是不同的。對(duì)于RAM等存儲(chǔ)器來(lái)說(shuō)也是一樣的,盡管存儲(chǔ)的都是代表0和1的代碼,可是不同的組合就是不同的數(shù)據(jù)。讓我們又一次回到書(shū)和書(shū)架上來(lái),假設(shè)有一個(gè)書(shū)架上有10行和10列格子(每行和每列都有0-9的編號(hào)),有100本書(shū)要存放在里面,那么我們使用一個(gè)行的編號(hào)+一個(gè)列的編號(hào)就能確定某一本書(shū)的位置。假設(shè)已知這本書(shū)的編號(hào)87,那么我們首先鎖定第8行。然后找到第7列就能準(zhǔn)確的找到這本書(shū)了。
在RAM存儲(chǔ)器中也是利用了相似的原理。如今讓我們回到RAM存儲(chǔ)器上,對(duì)于RAM存儲(chǔ)器而言數(shù)據(jù)總線是用來(lái)傳入數(shù)據(jù)或者傳出數(shù)據(jù)的。由于存儲(chǔ)器中的存儲(chǔ)空間是假設(shè)前面提到的存放圖書(shū)的書(shū)架一樣通過(guò)一定的規(guī)則定義的,所以我們能夠通過(guò)這個(gè)規(guī)則來(lái)把數(shù)據(jù)存放到存儲(chǔ)器上相應(yīng)的位置。而進(jìn)行這樣的定位的工作就要依靠地址總線來(lái)實(shí)現(xiàn)了。對(duì)于CPU來(lái)說(shuō),RAM就像是一條長(zhǎng)長(zhǎng)的有非常多空格的細(xì)線。每一個(gè)空格都有一個(gè)唯一的地址與之相應(yīng)。假設(shè)CPU想要從RAM中調(diào)用數(shù)據(jù),首先需要給地址總線發(fā)送地址數(shù)據(jù)定位要存取的數(shù)據(jù),然后等待若干個(gè)時(shí)鐘周期之后,數(shù)據(jù)總線就會(huì)把傳輸數(shù)據(jù)給CPU。
FPGA是基于邏輯門(mén)和觸發(fā)器的,它是并行執(zhí)行方式,沒(méi)有取指到執(zhí)行這種操作。簡(jiǎn)單而言,就是通過(guò)燒寫(xiě)文件去配置查找表的內(nèi)容,從而在相同的電路情況下實(shí)現(xiàn)了不同的邏輯功能,數(shù)字電路中所有邏輯門(mén)和觸發(fā)器均可以實(shí)現(xiàn),適合真正意義上的并行任務(wù)處理。FPGA程序在編譯后實(shí)際上是轉(zhuǎn)換為內(nèi)部的連線表,相當(dāng)于FPGA內(nèi)部提供了大量的與非門(mén)、或非門(mén)、觸發(fā)器等基本數(shù)字邏輯器件,編程決定了有多少器件被使用以及它們之間的連接方式。
通過(guò)編程,用戶可對(duì)FPGA內(nèi)部的邏輯模塊和I/O模塊重新配置,以實(shí)現(xiàn)用戶的邏輯。它還具有靜態(tài)可重復(fù)編程和動(dòng)態(tài)在系統(tǒng)重新配置的特性,使得硬件的功能可以像軟件一樣通過(guò)編程來(lái)修改。只要FPGA規(guī)模夠大,這些數(shù)字器件理論上能形成一切數(shù)字系統(tǒng),包括MCU,甚至CPU。因FPGA是純數(shù)字電路,在抗干擾和速度性能上有很大優(yōu)勢(shì)。 FPGA沒(méi)有取指到執(zhí)行這種操作,效率極高,功耗很低,又是天生的并行計(jì)算結(jié)構(gòu)。
但是FPGA采用的是統(tǒng)計(jì)型連線結(jié)構(gòu)。這類(lèi)器件具有較復(fù)雜的可編程布線資源,內(nèi)部包含多種長(zhǎng)度的金屬連線,從而使片內(nèi)互連十分靈活。因此每次編程后的連線可不盡相同。但是這些布線資源消耗了很大一部分芯片面積,而ASIC只需要選用最短長(zhǎng)度的布線即可,面積大大縮小,同樣密度,ASIC大約可以縮小40%的面積,這就意味著FPGA比ASIC要貴40%左右,F(xiàn)PGA的算力達(dá)到一定程度后,再增加算力,價(jià)格會(huì)飛速增長(zhǎng)。