16位CPU怎么做,DIY大神給你支支招兒
要理解這些概念需要一點(diǎn)時(shí)間。
本文引用地址:http://www.ex-cimer.com/article/201903/398604.htm一個(gè)CPU的基本結(jié)構(gòu)以及必要組件
這個(gè)例子引用自DE2開(kāi)發(fā)板套件帶的光盤(pán)上的Lab Exercise 9,我們從圖中可以看到,一個(gè)CPU包含了通用寄存器組R0~R7,一個(gè)ALU(算術(shù)邏輯單元),指令寄存器IR,控制器(一般這部分是一個(gè)有限狀態(tài)機(jī)或 者是用微指令實(shí)現(xiàn)),還有就是數(shù)據(jù)通路(圖中的連線)。當(dāng)然真正的CPU不可能只包含這么一點(diǎn)點(diǎn)組件,這是一個(gè)模型CPU,也就是說(shuō)只是說(shuō)明CPU的原 理,真正復(fù)雜的CPU要涉及到很多復(fù)雜的結(jié)構(gòu)和時(shí)序,例如虛擬模式需要使用一些特殊的寄存器、為了支持分頁(yè)需要使用頁(yè)表寄存器等,為了加速內(nèi)存的訪問(wèn)需要 使用TLB,加速數(shù)據(jù)和指令的訪問(wèn)而使用data cache和instruction cache等等。。。。。當(dāng)然,那都是后面該考慮的,所以我們先從這個(gè)簡(jiǎn)單的部分開(kāi)始講起。
例子中能實(shí)現(xiàn)如下指令:
mv指令將Ry的數(shù)據(jù)轉(zhuǎn)移到Rx中,mvi將立即數(shù)D轉(zhuǎn)移到Rx當(dāng)中,add將Rx和Ry的和放到Rx中,sub同上,不過(guò)執(zhí)行的是減法。
首先來(lái)說(shuō)明mv指令是如何執(zhí)行的:mv指令將Ry的值移入Rx寄存器當(dāng)中,這兩個(gè)寄存器都是由一組D觸發(fā)器構(gòu)成,而D觸發(fā)器的個(gè)數(shù)取決于寄存器的寬度,就像 32位機(jī)、64位機(jī)這樣,那他們的寄存器使用的D觸發(fā)器的個(gè)數(shù)就是不一樣的。當(dāng)執(zhí)行mv rx,ry時(shí),中間的多路器(圖中最大的那個(gè)multiplexer)選通Ry,讓Ry寄存器驅(qū)動(dòng)總線,這個(gè)時(shí)候Bus上的信號(hào)就是Ry的值;然后再看到 R0~R7上分別有R0in~R7in信號(hào),這個(gè)信號(hào)是使能信號(hào),當(dāng)這個(gè)信號(hào)有效時(shí),在上升沿此觸發(fā)器會(huì)將din的數(shù)據(jù)輸入,所以說(shuō)到這里大家一定想到 了,這個(gè)時(shí)候Rx觸發(fā)器上的Din信號(hào)就會(huì)變?yōu)橛行?,這樣過(guò)了一個(gè)時(shí)鐘周期后Ry的值就被送到了Rx當(dāng)中。
與mv指令類(lèi)似,mvi指令也將一個(gè)數(shù)據(jù)送入Rx當(dāng)中,只不過(guò)這次的數(shù)據(jù)存在指令當(dāng)中,是立即數(shù),所以Rx的Din信號(hào)會(huì)變?yōu)橛行?,而多路器?huì)選擇IR中的數(shù)據(jù),因?yàn)閙vi指令的立即數(shù)存在指令當(dāng)中。并且進(jìn)行一定處理,例如擴(kuò)展等。
add 指令會(huì)讓多路器先選擇Rx,然后Ain信號(hào)有效,這樣一個(gè)時(shí)鐘周期后,Rx數(shù)據(jù)被送入Alu的A寄存器當(dāng)中,這時(shí)多路器選擇Ry,addsub信號(hào)為 add以指示ALU進(jìn)行加法操作,Gin有效讓G寄存器存放運(yùn)算結(jié)果,然后再過(guò)一個(gè)時(shí)鐘周期G當(dāng)中的數(shù)據(jù)就是Rx與Ry的和,這時(shí)多路器再選擇 Gin,Rx的Din有效,過(guò)了一個(gè)時(shí)鐘周期后數(shù)據(jù)就被存放到Rx當(dāng)中了。
sub的過(guò)程與add差不多,不過(guò)addsub信號(hào)是sub指示ALU進(jìn)行減法。
我做的CPU模型
下面我就將我做的CPU模型的RTL網(wǎng)表發(fā)出來(lái),代碼我會(huì)上傳的,但是這個(gè)還只能進(jìn)行仿真,因?yàn)樵O(shè)計(jì) 的時(shí)候理念有問(wèn)題,出現(xiàn)了異步設(shè)計(jì),而且出現(xiàn)了將狀態(tài)機(jī)的輸出作為另一個(gè)器件的時(shí)鐘端的錯(cuò)誤,所以這個(gè)模型只能用于仿真。我用的synplify pro綜合出的RTL,而狀態(tài)轉(zhuǎn)移圖是用的Quartus的FSM Viewer截下來(lái)的。
首先是整個(gè)系統(tǒng)的概覽:
這個(gè)比上面的那個(gè)簡(jiǎn)單模型復(fù)雜多了吧!但是別擔(dān)心,其實(shí)這個(gè)只是上面的那個(gè)CPU變得稍微復(fù)雜了一點(diǎn),這個(gè)和上面那個(gè)不同的地方還有:這個(gè)CPU是一個(gè)多周期CPU而上面的Lab Exercise是一個(gè)單周期的CPU
下圖是程序計(jì)數(shù)器(PC),也就是常見(jiàn)x86處理器里面的ip(instruction poiniter):
紅色部分就是pc了,后面是一個(gè)三態(tài)橋,連接到了總線上面,這里的數(shù)據(jù)有時(shí)候是要送到地址總線,用于尋內(nèi)存中的數(shù)據(jù),以便完成Instruction Fetch過(guò)程。有時(shí)候又要送到通用寄存器的數(shù)據(jù)端,用于將pc的值送到其他寄存器。
下面這個(gè)是IR(Instruction Register),這個(gè)是多周期處理器的典型特征,因?yàn)樘幚砥髟诘谝粋€(gè)周期里面將機(jī)器碼從內(nèi)存取出,然后存放到這個(gè)寄存器里面,后面的幾個(gè)狀態(tài)都是通過(guò)這個(gè)寄存器里面的數(shù)據(jù)作為指示執(zhí)行操作的。
下面介紹一下ALU,ALU是Arithmetic Logic Unit,即算術(shù)邏輯單元,這個(gè)裝置的作用是進(jìn)行算術(shù)操作和邏輯操作。典型的算術(shù)操作例
如:1+1=2,11x23=253,而典型的邏輯操作例如:1 and 1=1,0 or 0 = 0,1<<3=8這種屬于邏輯操作。
而從圖中大家也看得到,ALU的輸出用一根很長(zhǎng)的線連接到了后面,參考整個(gè)CPU的圖的話,會(huì)發(fā)現(xiàn)這些線連到了通用寄存器上面,這是為了讓運(yùn)算的結(jié)果存放回 去,例如你用add eax,1的時(shí)候,eax的值被加上1然后放回eax,所以ALU的運(yùn)算結(jié)果要用反饋送回到通用寄存器,而ALU的輸入也應(yīng)該有通用寄存器的輸出。
下面再介紹ADDRMUX:
這個(gè)部件是用來(lái)選擇地址的,右邊的輸出是CPU的地址總線,而CPU的地址總線就已經(jīng)送出CPU了(也就是你能夠在芯片的外表上看到引腳了),CPU的地址總線是送到存儲(chǔ)器的地址端的,而現(xiàn)代的計(jì)算機(jī)系統(tǒng)實(shí)際上是相當(dāng)復(fù)雜的,所以其實(shí)你家的計(jì)算機(jī)上CPU是通過(guò)北橋芯片訪問(wèn)內(nèi)存的(當(dāng)然也有將內(nèi)存控制器做到 CPU里面的)左邊是地址的來(lái)源,地址的來(lái)源即有通用寄存器,也有程序計(jì)數(shù)器,還有一個(gè)是直接從IR里面送出,這是因?yàn)橛械牧⒓磾?shù)里面也包含內(nèi)存地址信息。
最后介紹通用寄存器:
通用寄存器的作用就是用來(lái)保存中間值或者用于運(yùn)算,例如
add eax,2
相當(dāng)于eax+2然后送回eax。
最后介紹一下?tīng)顟B(tài)機(jī),這個(gè)部分就是CPU的“靈魂”,如果說(shuō)有了上面那些部件CPU有了一副“軀體”的話,這一部分就是CPU的“靈魂”了:
評(píng)論