CPU可以分成幾個(gè)部分,不同的設(shè)計(jì)方案有不同的分割方式,在經(jīng)典的五級(jí)流水線中被分割成取指、譯碼、執(zhí)行、訪存和寫回五級(jí)。
首先是取指。取指就是從指令內(nèi)存中讀取出CPU要執(zhí)行的指令。計(jì)算機(jī)的指令是由0和1組成的。比如說00000000000100010000000110110011這個(gè)指令的意思是把寄存器x1與x2的數(shù)相加后的值放入寄存器x3中。不同的指令集的指令都不相同,這個(gè)是RISC-V架構(gòu)指令。就像這樣的指令一條接一條占滿了內(nèi)存。那么我們要想從內(nèi)存中讀出這些指令肯定不能隨便讀,我們需要一個(gè)像書簽一樣的東西告訴我們讀到哪里了,這個(gè)東西被稱作程序計(jì)數(shù)器PC(program counter)。我們就根據(jù)PC值作為地址去訪問內(nèi)存,每訪問完一次內(nèi)存就把PC值往下加,讓PC值始終指向我們接下去要讀的位置。
這邊所指的內(nèi)存是指令內(nèi)存,此外還有數(shù)據(jù)內(nèi)存。顧名思義,指令內(nèi)存中存儲(chǔ)的是指令,數(shù)據(jù)內(nèi)存中存儲(chǔ)的是數(shù)據(jù)。比如打開相冊(cè),相冊(cè)作為一個(gè)程序是在指令內(nèi)存中被讀取出來的,而相冊(cè)中的圖片則是在數(shù)據(jù)內(nèi)存中被讀取。這個(gè)只是個(gè)比喻,真實(shí)情況應(yīng)該不是這樣的。而對(duì)于單片機(jī)等計(jì)算機(jī),這兩種內(nèi)存是分開的;對(duì)于手機(jī)電腦等大多數(shù)設(shè)備這兩種內(nèi)存是被承載在同一個(gè)物理內(nèi)存上的,但是其內(nèi)涵還是有區(qū)別的。這邊所說的是內(nèi)存,要與處理器的緩存和硬盤區(qū)分開。
接著是譯碼。我們需要把像上面那樣的指令翻譯成電路實(shí)際操作的控制信號(hào),控制數(shù)據(jù)的走向完成指令所要求的任務(wù)。比如說這個(gè)指令是個(gè)加法指令,那么我就要把數(shù)據(jù)往加法器那兒領(lǐng),而不是把數(shù)據(jù)送向減法器。而這個(gè)起向?qū)ё饔玫木褪亲g碼完的控制信號(hào)。
譯碼單元(部分)
再是執(zhí)行?;A(chǔ)的RISC-V的架構(gòu)中有加、減、與、或、移位、比大小等操作。所謂執(zhí)行就是算出結(jié)果。這邊說說移位是什么,移位就是把數(shù)字?jǐn)U大或縮小2的整數(shù)次方倍,在二進(jìn)制中看起來就是數(shù)字往高位或低位移動(dòng)了幾位。這里拿十進(jìn)制數(shù)字舉例。例如2048000縮小1000(10的3次方)倍,那就變?yōu)榱?048,看起來就像數(shù)字向右移了三位。
?
執(zhí)行單元
然后是訪存。這里的存指的就是數(shù)據(jù)內(nèi)存了。訪存既可以是訪(讀?。┮部梢允谴妫▽懭耄?。同樣的我們要知道我們要訪哪或者存哪,因此我們還是需要一個(gè)書簽,但是不同于前面的PC,我們需要在一個(gè)相對(duì)集中卻又不一定按順序的地方讀取數(shù)據(jù)。這里應(yīng)該很好理解,我們編程的時(shí)候是按順序編輯的(程序不一定按順序執(zhí)行,程序也可以進(jìn)行跳轉(zhuǎn),但大部分情況按順序執(zhí)行),但是我們的文件可是隨便哪讀隨便哪寫的,甚至可能沒有一點(diǎn)順序可言。因此我們需要一個(gè)相對(duì)靈活的書簽。這個(gè)書簽被稱作基地址,我們想訪存的地址與基地址的差值被稱作偏移量?;刂芳由掀屏烤褪俏覀兿胍哪繕?biāo)地址了,基地址相對(duì)固定,偏移量由指令給出,這樣我們就可以靈活的進(jìn)行訪存了。
?
訪存單元
最后是寫回。當(dāng)指令進(jìn)行完了之后,我們需要把最后的結(jié)果寫回寄存器組,把結(jié)果記錄下來。有些指令可能沒有什么要寫回的,比如儲(chǔ)存某個(gè)數(shù)到內(nèi)存這樣的指令就沒什么要寫回的,那就忽略這一級(jí)流水線(走個(gè)過場)就行了。這個(gè)圖很零散,就不放上來了。
審核編輯:劉清
評(píng)論
查看更多