CPU計(jì)算機(jī)組成原理實(shí)驗(yàn)報(bào)告_第1頁
CPU計(jì)算機(jī)組成原理實(shí)驗(yàn)報(bào)告_第2頁
CPU計(jì)算機(jī)組成原理實(shí)驗(yàn)報(bào)告_第3頁
CPU計(jì)算機(jī)組成原理實(shí)驗(yàn)報(bào)告_第4頁
CPU計(jì)算機(jī)組成原理實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

-.z.計(jì)算機(jī)組成與系統(tǒng)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告CPU設(shè)計(jì)與實(shí)現(xiàn)院(系):專業(yè)班級:計(jì)算機(jī)科學(xué)與技術(shù)組員:指導(dǎo)教師:實(shí)驗(yàn)?zāi)康?設(shè)計(jì)實(shí)現(xiàn)CPU部件。實(shí)驗(yàn)儀器:PC機(jī)(安裝Altebra公司的開發(fā)軟件QuartusII,Modelsim)兩臺TEC-CA計(jì)算機(jī)組成原理試驗(yàn)箱實(shí)驗(yàn)過程:一、理論設(shè)計(jì)1.1、設(shè)計(jì)指令集設(shè)計(jì)CPU第一步,就是根據(jù)需求,確定功能,并且設(shè)計(jì)出指令集。指令集包括每一條指令的編碼方式,操作碼以及每一條指令實(shí)現(xiàn)的功能??紤]到第一次設(shè)計(jì)CPU,在指令集設(shè)計(jì)過程中難免會出現(xiàn)考慮不周全或者指令集設(shè)計(jì)不科學(xué)的問題,我們借鑒了經(jīng)典的31條MIPS指令集。在對指令集每一條指令進(jìn)行解讀、分析后,我們確定:31條MIPS指令可以滿足我們的CPU的基本功能。下面將31條MIPS指令的編碼格式、對應(yīng)的操作類型以表格的形式列舉出來:MIPS指令集(共31條)Bit*31..2625..2120..1615..1110..65..0

R-typeoprsrtrdshamtfunc

add000000rsrtrd00000100000

add$1,$2,$3

$1=$2+$3

rd<-rs+rt

;其中rs=$2,rt=$3,rd=$1addu000000rsrtrd00000100001

addu$1,$2,$3

$1=$2+$3

rd<-rs+rt

;其中rs=$2,rt=$3,rd=$1,無符號數(shù)sub000000rsrtrd00000100010

sub$1,$2,$3

$1=$2-$3

rd<-rs-rt

;其中rs=$2,rt=$3,rd=$1subu000000rsrtrd00000100011

subu$1,$2,$3

$1=$2-$3

rd<-rs-rt

;其中rs=$2,rt=$3,rd=$1,無符號數(shù)and000000rsrtrd00000100100

and$1,$2,$3

$1=$2

&

$3

rd<-rs&rt

;其中rs=$2,rt=$3,rd=$1or000000rsrtrd00000100101

or$1,$2,$3

$1=$2

|

$3

rd<-rs|rt

;其中rs=$2,rt=$3,rd=$1*or000000rsrtrd00000100110

*or$1,$2,$3

$1=$2

^

$3

rd<-rs*orrt

;其中rs=$2,rt=$3,rd=$1(異或)nor000000rsrtrd00000100111

nor$1,$2,$3

$1=~($2

|

$3)

rd<-not(rs|rt)

;其中rs=$2,rt=$3,rd=$1(或非)slt000000rsrtrd00000101010

slt$1,$2,$3

if($2<$3)

$1=1

else

$1=0

if(rs<rt)rd=1

else

rd=0;其中rs=$2,rt=$3,rd=$1sltu000000rsrtrd00000101011

sltu$1,$2,$3

if($2<$3)

$1=1

else

$1=0

if(rs<rt)rd=1

else

rd=0;其中rs=$2,rt=$3,rd=$1

(無符號數(shù))sll00000000000rtrdshamt000000

sll$1,$2,10

$1=$2<<10

rd<-rt<<shamt

;shamt存放移位的位數(shù),

也就是指令中的立即數(shù),其中rt=$2,rd=$1srl00000000000rtrdshamt000010

srl$1,$2,10

$1=$2>>10

rd<-rt>>shamt;(logical),其中rt=$2,rd=$1sra00000000000rtrdshamt000011

sra$1,$2,10

$1=$2>>10

rd<-rt>>shamt

;(arithmetic)

注意符號位保留

其中rt=$2,rd=$1sllv000000rsrtrd00000000100

sllv$1,$2,$3

$1=$2<<$3

rd<-rt

<<rs

;其中rs=$3,rt=$2,rd=$1srlv000000rsrtrd00000000110

srlv$1,$2,$3

$1=$2>>$3

rd<-rt

>>rs

;(logical)其中rs=$3,rt=$2,rd=$1srav000000rsrtrd00000000111

srav$1,$2,$3

$1=$2>>$3

rd<-rt

>>rs

;(arithmetic)

注意符號位保留

其中rs=$3,rt=$2,rd=$1jr000000rs000000000000000001000

jr

$31

goto

$31

PC<-

rsI-typeoprsrtimmediate

addi001000rsrtimmediate

addi

$1,$2,100

$1=$2+100

rt<-rs+(sign-e*tend)immediate

;其中rt=$1,rs=$2addiu001001rsrtimmediateaddiu

$1,$2,100

$1=$2+100

rt<-rs+(zero-e*tend)immediate

;其中rt=$1,rs=$2andi001100rsrtimmediate

andi

$1,$2,10

$1=$2&10

rt<-rs&(zero-e*tend)immediate

;其中rt=$1,rs=$2ori001101rsrtimmediate

andi

$1,$2,10

$1=$2|10

rt<-rs|(zero-e*tend)immediate

;其中rt=$1,rs=$2*ori001110rsrtimmediate

andi

$1,$2,10

$1=$2^10

rt<-rs*or(zero-e*tend)immediate

;其中rt=$1,rs=$2lui00111100000rtimmediate

lui

$1,100

$1=100*65536

rt<-immediate*65536

;將16位立即數(shù)放到目標(biāo)寄存器高16

位,目標(biāo)寄存器的低16位填0lw100011rsrtimmediate

lw

$1,10($2)

$1=memory[$2

+10]

rt<-memory[rs+(sign-e*tend)immediate]

;rt=$1,rs=$2sw101011rsrtimmediate

sw

$1,10($2)

memory[$2+10]

=$1

memory[rs+(sign-e*tend)immediate]<-rt

;rt=$1,rs=$2beq000100rsrtimmediate

beq

$1,$2,10

if($1==$2)

goto

PC+4+40

if(rs==rt)PC<-PC+4+(sign-e*tend)immediate<<2

bne000101rsrtimmediate

bne

$1,$2,10

if($1!=$2)

goto

PC+4+40

if(rs!=rt)PC<-PC+4+(sign-e*tend)immediate<<2

slti001010rsrtimmediate

slti$1,$2,10

if($2<10)

$1=1

else

$1=0

if(rs<(sign-e*tend)immediate)rt=1

else

rt=0;

其中rs=$2,rt=$1sltiu001011rsrtimmediate

sltiu$1,$2,10

if($2<10)

$1=1

else

$1=0

if(rs<(zero-e*tend)immediate)rt=1

else

rt=0;

其中rs=$2,rt=$1J-typeopaddress

j000010address

j

10000

goto

10000

PC<-(PC+4)[31..28],address,0,0

;address=10000/4jal000011address

jal

10000

$31<-PC+4;

goto

10000

$31<-PC+4;PC<-(PC+4)[31..28],address,0,0

;address=10000/4經(jīng)典的MIPS指令有三種格式:R-TYPE、I-TYPE、J-TYPE。其編碼格式各不相同,分別代表寄存器操作指令、立即數(shù)操作指令、跳轉(zhuǎn)指令。寄存器操作主要是將寄存器中的樹取出進(jìn)行運(yùn)算并存回寄存器;立即數(shù)操作為一個寄存器數(shù)與指令中的擴(kuò)展后的立即數(shù)進(jìn)行運(yùn)算得到結(jié)果再存回寄存器;跳轉(zhuǎn)我們后面的設(shè)計(jì)都是對這31條指令進(jìn)行具體實(shí)現(xiàn),所有的容緊密圍繞這31條指令。1.2、畫數(shù)據(jù)通路圖在設(shè)計(jì)完指令后,要做的就是根據(jù)指令描述的功能確定CPU有哪些部件,并且確定各部件之間的連線方式。首先,一個CPU最重要的部件一定是控制器??刂破骶拖袢说拇竽X,控制其他各個部件的工作。其次,由于是基于MIPS指令集的CPU,大多數(shù)操作基于寄存器,因此必須設(shè)計(jì)一個寄存器堆。此外,ALU運(yùn)算部件對于CPU來說也是必不可少的。由于有六條指令涉及比較操作,并且給有效位置位??紤]到本CPU設(shè)計(jì)初衷是四級流水控制,若一條指令多個節(jié)拍使用ALU部件會造成部件沖突,后期控制會比較復(fù)雜。因此,在本CPU中額外設(shè)計(jì)了一個比較部件。此外,還有其他部件,如PC部件、立即數(shù)擴(kuò)展部件、數(shù)據(jù)寄存器、地址寄存器等。再根據(jù)31條指令,畫出數(shù)據(jù)通路圖。這只是一個初步的數(shù)據(jù)通路圖,卻奠定了CPU的基本構(gòu)架??赡茉诤罄m(xù)的詳細(xì)設(shè)計(jì)過程中,會對這個數(shù)據(jù)通路有所改動,但一定是以現(xiàn)有的圖為基礎(chǔ)??梢哉f,這就是我們將要設(shè)計(jì)的CPU的一個初步藍(lán)圖。二、詳細(xì)設(shè)計(jì)2.1、控制信號的提取與分析這一部分可以說是整個CPU設(shè)計(jì)過程里最重要、最復(fù)雜的過程之一了。在這一部分,我們將依據(jù)數(shù)據(jù)通路圖,分析數(shù)據(jù)通路中所有控制信號的組成與賦值。第一步,我們將31條指令都劃分為四個節(jié)拍執(zhí)行完成:取指與譯碼、取數(shù)與ALU操作、主存取數(shù)、寫回寄存器。我們需要對每一條指令的每一個控制信號進(jìn)行分析,判斷它應(yīng)該在第幾節(jié)拍給出。經(jīng)分析,我們在CPU工作過程中共需要控制信號38個(其中包括4位ALUCtr),分別是:0,1,ALU_AR,PC_1,RT_DR,PC_AB,DB_IR,DB_DR,RS_ALU,RT_ALU,DE_ALU,PC_ALU,ZERO_ALU,HE*_ALU,SHAMT_ALU,DR_REG,REG_W,REG_R,ALUCtr0,ALUCtr1,ALUCtr2,ALUCtr3,ADDR_PC,DR_DB,ALU_DR,AR_AB,DR_PC,DR_REG31,PC_W,PC_R,J_PC,IMM_DE,DE_U,RD_REG,RS_REG,RT_REG,RS_,RT_,DE_,_NVST,ZERO_REG,PC_JIE。具體的信號表在的E*cel中。列出所有控制信號后,對每一條指令需要哪些控制信號,在第幾節(jié)拍需要這些控制信號都要標(biāo)識清楚。如對于一號指令有符號數(shù)加:在第一節(jié)拍(取指與譯碼),要給出控制信號PC_1,PC_AB,DB_IR,將PC地址傳入地址總線并取出相應(yīng)的指令送入指令寄存器,PC再完成自加一的操作;第二節(jié)拍(取數(shù)與ALU操作)需要的控制信號是RS_ALU,RT_ALU,REG_R,ALU_DR,RS_REG,RT_REG(ALUCtr為0,四個控制信號都不給出),將指令中rs,rt地址傳給寄存器,寄存器將對應(yīng)寄存器中的數(shù)取出送到ALU,ALU根據(jù)給出的ALUCtr進(jìn)行不同的操作。第三節(jié)拍是寫回寄存器,給出控制信號DR_REG,REG_W,RD_REG,將DR中的數(shù)、rd地址送至寄存器,并打開寄存器寫開關(guān)。用這種方式分析所有指令。在分析完控制信號后,我們就可以對控制器進(jìn)行具體設(shè)計(jì)了。2.2、各部件具體設(shè)計(jì)、ALU部件ALU是基于指令集來設(shè)計(jì)的,可完成二進(jìn)制信息的算術(shù)運(yùn)算、邏輯運(yùn)算和移位操作,共包含31條MIPS指令。我們將其總結(jié)為13種ALU操作類型,用四位二進(jìn)制數(shù)進(jìn)行編碼,如下圖所示。這些二進(jìn)制編碼作為ALU控制信號,即aluctr。編號操作類型二進(jìn)制編碼1有符號加00002無符號加00013有符號減00104無符號減00115與01006或01017異或01108非或01119有符號比較100010無符號比較100111邏輯左移101012邏輯右移101113數(shù)字右移1100在ALU中,為符合它的雙操作數(shù)功能,我們設(shè)計(jì)了兩個寄存器r1和r2,作為ALU的兩個輸入。經(jīng)過對指令集的分析,將進(jìn)入ALU數(shù)據(jù)來源分為rt、rs,shamt,imm,PC幾種類型,為了避免數(shù)據(jù)操作時(shí)發(fā)生沖突,將其分別放在兩個寄存器中,其中rt、imm放在r1中,rs、shamt和PC放在r2中。除了兩個寄存器輸入外,還有ALU控制信號輸入端口aluctr。一個輸出端口out。在ALU運(yùn)行過程中,從r1、r2中取出數(shù)據(jù),根據(jù)aluctr給出的控制信號進(jìn)行相應(yīng)的運(yùn)算,從out端口輸出。ALU部件的代碼見附錄。、PC部件PC部件是用來計(jì)算下一條指令的,在一般情況下,指令都是順序執(zhí)行下去的,即PC+1,而在遇到跳轉(zhuǎn)指令時(shí),則需要進(jìn)行其他復(fù)雜的操作,所以我們制作的PC部件主要分了這兩種操作方法。在編寫的PC部件代碼中,共有四個輸入端口,分別是從當(dāng)前執(zhí)行的指令中取來的地址address,用于下一條PC的拼接,既然有PC拼接和PC+1的兩種操作,我們就分別給出了兩個輸入的PC操作信號:pc_ctr和pc_pj,另外還有從ALU來的運(yùn)算結(jié)果alu_pc作為第四個輸入端口。輸出端口有pc_out和pc_alu。當(dāng)接收到pc_ctr信號時(shí),進(jìn)行PC+1的操作,而當(dāng)接收到pc_pj信號時(shí),進(jìn)行PC的拼接操作。PC部件的代碼見附錄。、寄存器組寄存器是計(jì)算機(jī)的一個重要部件,用于暫存數(shù)據(jù)和指令等。由于考慮到存儲空間的大小,我們將原有的32個32位的寄存器組修改為4個32位的寄存器組。在寄存器組中,存在兩個控制信號,分別為讀和寫,當(dāng)收到讀信號時(shí),我們接收到的地址所對應(yīng)的寄存器的數(shù)據(jù)取出,若接收到的是寫信號,我們就將接收到的數(shù)據(jù)寫回之前發(fā)過來的地址所指示的寄存器中。其中,地址的來源有指令中的rs_add,rrt_addr和rd_addr,數(shù)據(jù)來源為rd_data,共有兩個輸出端口,分別為rt_out,rs_out。寄存器組的代碼見附錄。、立即數(shù)擴(kuò)展部件立即數(shù)擴(kuò)展部件的主要工作是將指令中的16位的立即數(shù)擴(kuò)展成為32位的數(shù),并且有有符號擴(kuò)展和無符號擴(kuò)展兩種。因此,對于一個立即數(shù)擴(kuò)展部件來說,有兩個輸入一個輸出。輸入分別是16位的立即數(shù)和控制擴(kuò)展方式的控制信號,輸出是擴(kuò)展之后的32位的數(shù)。立即數(shù)擴(kuò)展部件具體代碼見附錄。、比較部件比較部件是我們在本次設(shè)計(jì)中的一個創(chuàng)新點(diǎn)??紤]到每一次比較操作都要經(jīng)過ALU,而涉及到比較操作的指令除了比較操作本身還會用一次ALU操作,這在流水設(shè)計(jì)中無疑會帶來部件沖突。盡管在發(fā)生沖突時(shí),我們可以采用檢測沖突、加入阻塞的方法進(jìn)行排除,但這無疑給控制的設(shè)計(jì)帶來了很大的困難。我們考慮:能否為比較操作專門設(shè)置一個比較部件,用來判斷兩個操作數(shù)大小并依據(jù)指令類型為標(biāo)志位賦值。為后面的操作提供依據(jù)。我們設(shè)計(jì)的比較部件,可以完成如下四種操作:判等置1,判不等置1,判大于置1,判小于置1。因此比較部件有四個輸入:比較控制信號1,比較控制信號2(兩個信號組合起來表示現(xiàn)在在做哪一種判斷),比較數(shù)1以及比較數(shù)2,一個輸出對標(biāo)志位置位。具體代碼見附錄。、信號發(fā)生器信號發(fā)生器是根據(jù)脈沖信號循環(huán)給出節(jié)拍控制信號的部件。學(xué)過熟悉邏輯的都應(yīng)該就得不難。首先將clk進(jìn)行分頻,將分頻后的信號與clk組合起來,表示四個節(jié)拍,從一到四分別為:00,01,10,11。在仿真后出現(xiàn)了下面的情況(圖):圖仔細(xì)觀察可以發(fā)現(xiàn),途中輸出信號w1,w2,w3,w4出現(xiàn)了毛刺(如4600ns處w1信號)。在查閱相關(guān)資料并向教員請教后我們意識到,這就是數(shù)電中說到的“毛刺”。由于從“01”到“10”,兩個輸入信號同時(shí)發(fā)生了變化,所以在變化的一瞬間出現(xiàn)了不想要的“毛刺”。我們又查閱數(shù)電書,發(fā)現(xiàn)解決毛刺的方法就是采用“格雷碼”編碼方式,即每次信號變化時(shí)只有一個信號發(fā)生變化。因此我們又添加了一個分頻信號在clk的時(shí)鐘下降沿翻轉(zhuǎn),與原先始終上升沿翻轉(zhuǎn)的信號一起,組成了新的控制信號,從一到四分別為:00,01,11,10。這樣產(chǎn)生的信號就符合“格雷碼”編碼方式,也不會產(chǎn)生“毛刺”。(如圖)圖信號發(fā)生器源碼見附錄。、硬布線控制器在設(shè)計(jì)CPU之初,我們就決定了使用硬布線方式設(shè)計(jì)控制器。在IDE工具的幫助下設(shè)計(jì)硬布線控制器比真實(shí)的大規(guī)模集成電路設(shè)計(jì)硬布線要簡單的多。運(yùn)用一些固定的格式,IDE會自動生成硬布線電路。之前在2.1的部分,我們就已經(jīng)完成了控制信號的提取與分析,這時(shí)候只需要細(xì)心地將E*cel表格中的容轉(zhuǎn)換成代碼??刂破鞯妮斎胗辛鶄€:6位的OP,6位的FUNC,節(jié)拍信號w1,w2,w3,w4,輸出為所有控制信號。如在*條指令中,需要在第幾節(jié)拍給出哪個信號,就將該信號等于對應(yīng)的節(jié)拍輸入即可,IDE會自動生成硬布線電路。源碼見附錄。實(shí)驗(yàn)感悟唐玲芳的實(shí)驗(yàn)感悟經(jīng)過幾個星期的努力,雖然沒能把CPU制作出來,卻收獲了不少。在這次實(shí)驗(yàn)中,我最大的收獲是對計(jì)算機(jī)組成原理這門課程的理解更加深刻了。在制作的過程中,我們不懂就問,自己動腦去理解,因?yàn)槲覀冎?,如果不理解,?shí)驗(yàn)是無法進(jìn)行下去的,在教員的悉心幫助下,我們也取得了一些成果。在實(shí)驗(yàn)的前期,我們一步一個腳?。捍_定CPU的功能、能執(zhí)行指令集,制定通路路線圖,分析出所有的控制信號等等。在這個過程中,我們也充分理解到“結(jié)構(gòu)決定功能”這句話,在沒能全面考慮到所有的功能時(shí),在通路圖上總會少幾個部件,只有將所有功能走通了,都能實(shí)現(xiàn)了,我們的通路才真的制定完整了。在實(shí)驗(yàn)的過程中,我主要參與了ALU部件、寄存器組、PC部件的制作。在編寫程序的過程中,也遇到了不少麻煩。比如說部件的中心思想、主要結(jié)構(gòu)沒有弄清楚,導(dǎo)致程序出錯,而無法進(jìn)行下去。在之前我們一直以為控制器所給的控制信號是在ALU部的,控制信號一來,才知道數(shù)據(jù)是從哪來ALU的,然后再從ALU中的寄存器中取出來進(jìn)行相應(yīng)的運(yùn)算,但是后來才發(fā)現(xiàn),控制器的控制信號并不歸ALU管,它是各部件連接的通路上的,在ALU中我們只需要從寄存器中取數(shù),根據(jù)ALU控制信號進(jìn)行相應(yīng)的運(yùn)算就可以了。明白了這一點(diǎn)后,我們的ALU才基本完成了正確的實(shí)現(xiàn)。另外就是我對所用的Verilog語言不夠熟悉,很多語法都沒有完全掌握,在寫程序時(shí),斷斷續(xù)續(xù),影響進(jìn)度。總的來說,在這次實(shí)驗(yàn)中,我的收獲還是很大的。無論是對課程的理解還是對編程、動手能力的提高,都有一定程度的幫助。戚洪源的實(shí)驗(yàn)感悟在回到信大之前,心里是非常向往這次實(shí)驗(yàn)的。在科大學(xué)習(xí)了一學(xué)期計(jì)算機(jī)原理,第一次如此深入地接觸計(jì)算機(jī),當(dāng)時(shí)教員說會在暑期學(xué)期用整整兩周時(shí)間來做這個實(shí)驗(yàn)。原本以為自己沒有這樣的機(jī)會,但很幸運(yùn)還是解除了這個實(shí)驗(yàn)。整體感覺是:很難。設(shè)計(jì)CPU不是紙上談兵,是要實(shí)實(shí)在在寫代碼燒板子的,一個小小的錯誤可能就導(dǎo)致了最后的失敗。我在試驗(yàn)中最大的感受有以下幾點(diǎn):萬事開頭難做這個實(shí)驗(yàn)擺在面前的第一個問題就是:現(xiàn)在干嘛?這是一個很實(shí)際的問題,如果沒有教員指導(dǎo),應(yīng)該怎么開始?在實(shí)驗(yàn)開始前我就著手資料準(zhǔn)備,和許多研究生學(xué)長交流之后確定了從指令集到通路圖的方案。浴室我著手開始搜關(guān)于設(shè)計(jì)指令集的資料,并且確定以31條MIPS指令集為基礎(chǔ)。事后回想起來,真是萬事開頭難。當(dāng)一個復(fù)雜的任務(wù)來臨不知道從何入手時(shí),一定要注意,千萬不能自己搞自己那一套,很可能一開始就走到了一個錯誤的道路上。既然不知道從何入手,就去查資料,請教別人,這是本次實(shí)驗(yàn)的收獲之一。模塊化設(shè)計(jì)思想和黑盒設(shè)計(jì)思想CPU這幾工作量很大,而且各部分之間緊密聯(lián)系。首先時(shí)間緊,一個人去完成不太可能實(shí)現(xiàn),而合作的話,如何將一個聯(lián)系非常緊密的東西分開去做呢?這就要用到模塊化設(shè)計(jì)思想和黑盒設(shè)計(jì)思想。將這個數(shù)據(jù)通路圖中的元器件按照功能進(jìn)行最小化劃分。一個元器件有什么輸入什么輸出,實(shí)現(xiàn)什么樣的功能,這和總體連線是沒有太大關(guān)聯(lián)的。確定出來大致有哪幾個元器件,分別是什么輸入輸出,比如ALU部件,就兩個操作數(shù)輸入,一個控制信號輸入,一個結(jié)果輸出,至于怎么和寄存器堆相連,輸出到哪里之類的問題,不需要AlU設(shè)計(jì)者去考慮。最終,在所有元器件確認(rèn)沒有問題之后進(jìn)行頂層連線。講一個個元件看成黑盒,元件設(shè)計(jì)者不需要知道外界怎么連接它,頂層設(shè)計(jì)者不需要知道部如何運(yùn)行。這樣,就可以把CPU這個有機(jī)的整體合理劃分成幾小塊,交給不同人去分別實(shí)現(xiàn)。這種思想還是令我感觸十分深的。在以后的大項(xiàng)目、大問題出現(xiàn)的時(shí)候,也可以考慮這種方式進(jìn)行分工合作。對于中央處理器有了更深一步的認(rèn)識實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)。經(jīng)過這一次的實(shí)驗(yàn),我對于CPU的理解又深了一層。在科大的時(shí)候做過一個簡單的,七條指令的單周期CPU的元器件連線圖,連控制信號都是教員給出來的,也可以跑指令,當(dāng)時(shí)覺得非常激動。這一次,我自己動手設(shè)計(jì)31條指領(lǐng)的流水CPU。從設(shè)計(jì)指令集開始,一步一步地提取控制信號,這個過程的收獲非常大。這一次實(shí)驗(yàn)讓我徹底理解了設(shè)計(jì)CPU的控制器應(yīng)該遵循一個什么樣的流程,絕不是簡單復(fù)制*本書上的真值表。在走遍31條指令后,整個CPU的數(shù)據(jù)通路圖已經(jīng)深深刻在我的腦海里。還有太多太多,整個過程的確讓我受益匪淺。對于硬件設(shè)計(jì)有了更深的了解原先也學(xué)習(xí)過數(shù)字設(shè)計(jì)課程,不過幾乎沒有接觸實(shí)驗(yàn)。以至于學(xué)完之后許多邏輯上的問題根本無法理解。這一次做了實(shí)驗(yàn),再回過頭來想想,許多東西就可以理解了。特別是一些問題的處理,必須用到數(shù)電的知識。如:設(shè)計(jì)信號發(fā)生器的時(shí)候遇到的“毛刺”問題,一開始一頭霧水,根本不懂為什么會出現(xiàn)這個東西。后來經(jīng)教員點(diǎn)撥,一下子想起來這是數(shù)電中學(xué)習(xí)過的“格雷碼”編碼問題。這時(shí)運(yùn)用數(shù)電知識問題迎刃而解??偨Y(jié)總結(jié)起來,這一次實(shí)驗(yàn)即使最終沒有完整地拿出結(jié)果來,但是已經(jīng)有了許多收獲了。今年暑假的時(shí)候和科大的教員交流,說到CPU實(shí)驗(yàn)的問題時(shí),她說作為一個計(jì)算機(jī)專業(yè)的學(xué)生,沒有去自己嘗試過做一個CPU,還是有點(diǎn)遺憾的。做過一次,不管結(jié)果如何,都會有所收獲?,F(xiàn)在這學(xué)期的實(shí)驗(yàn)也告一段落,收獲肯定遠(yuǎn)比上面說的要多。真的不虛此行,后面有機(jī)會,一定要把這個CPU再拿出來,把它做完。不知道這個可不可以算一個畢業(yè)設(shè)計(jì)。如果做出來,能算信大CPU第一人嗎?哈哈,開玩笑了。附錄ALU部件源碼moduleALU(alucrt,r1,r2,out);input[3:0]alucrt;input[31:0]r1,r2;outputreg[31:0]out;always(*)begincase(alucrt)0000:beginif(r2[31]==r1[31])beginout[31]=r2[31];out[30:0]=r2[30:0]+r1[30:0];endelsebeginif(r2[30:0]>r1[30:0])beginout[31]=r2[31];out[30:0]=r2[30:0]-r1[30:0];endelsebeginout[31]=r1[31];out[30:0]=r1[30:0]-r2[30:0];endendend0001:beginout=r2+r1;end0010:beginif(r2[31]==r1[31])beginif(r2[30:0]>r1[30:0])beginout[31]=r2[31];out[30:0]=r2[30:0]-r1[30:0];endelsebeginout[31]=r1[31];out[30:0]=r1[30:0]-r2[30:0];endendelsebeginout[31]=r2[31];out[30:0]=r2[30:0]+r1[30:0];endend0011:beginout=r2-r1;end0100:beginout=r2&r1;end0101:beginout=r2|r1;end0110:beginout=r2^r1;end0111:beginout=r2~^r1;end1000:beginif(r2[31]==r1[31])beginif(r2[31]==1)beginif(r2[30:0]>r1[30:0])beginout=1;endelsebeginout=0;endendelsebeginif(r2[30:0]<r1[30:0])beginout=1;endelsebeginout=0;endendendelsebeginif(r1[31]==1)beginout=1;endelsebeginout=0;endendend1001:beginif(r2<r1)beginout=1;endelsebeginout=0;endend1010:beginout=(r2<<r1);end1011:beginout=(r2>>r1);end1100:beginout=(r2>>>r1);endendcaseendendmodulePC部件源碼modulePC(address,alu_pc,pc_alu,pc_ctr,pc_pj,pc_out);input[25:0]address;input[31:0]alu_pc,pc_ctr,pc_pj;output[31:0]pc_out,pc_alu;reg[31:0]r;always(*)beginif(pc_ctr)beginr=r+4;endif(pc_pj)beginr=r+4;r[27:2]=address;r[1:0]=0;endendendmodule寄存器組源碼moduleRegister(rs_addr,rt_addr,rd_addr,rd_data,read,write,rt_out,rs_out);input[4:0]rs_addr,rt_addr,rd_addr;input[31:0]rd_data;inputread,write;output[31:0]rt_out,rs_out;reg[31:0]rt_out,rs_out;reg[31:0]r[0:3];always(*)beginif(read)beginif(rs_addr)begincase(rs_addr)00000:beginrs_out=r[0];end00001:beginrs_out=r[1];end00010:beginrs_out=r[2];end00011:beginrs_out=r[3];endendcaseendif(rt_addr)begincase(rt_addr)00000:beginrt_out=r[0];end00001:beginrt_out=r[1];end00010:beginrt_out=r[2];end00011:beginrt_out=r[3];endendcaseendendelsebegincase(rd_addr)00000:beginr[0]=rd_data;end00001:beginr[1]=rd_data;end00010:beginr[2]=rd_data;end00011:beginr[3]=rd_data;endendcaseendendendmodule立即數(shù)擴(kuò)展部件源碼moduleDE(DE_U,IMM,DE_OUT);inputDE_U;input[15:0]IMM;output[31:0]DE_OUT;reg[31:0]DE_OUT;always(*)begin DE_OUT[15:0]=IMM; if(DE_U=0) begin DE_OUT[31]=IMM[15]; DE_OUT[30]=IMM[15]; DE_OUT[29]=IMM[15]; DE_OUT[28]=IMM[15]; DE_OUT[27]=IMM[15]; DE_OUT[26]=IMM[15]; DE_OUT[25]=IMM[15]; DE_OUT[24]=IMM[15]; DE_OUT[23]=IMM[15]; DE_OUT[22]=IMM[15]; DE_OUT[21]=IMM[15]; DE_OUT[20]=IMM[15]; DE_OUT[19]=IMM[15]; DE_OUT[18]=IMM[15]; DE_OUT[17]=IMM[15]; DE_OUT[16]=IMM[15]; end else begin DE_OUT[31]=0; DE_OUT[30]=0; DE_OUT[29]=0; DE_OUT[28]=0; DE_OUT[27]=0; DE_OUT[26]=0; DE_OUT[25]=0; DE_OUT[24]=0; DE_OUT[23]=0; DE_OUT[22]=0; DE_OUT[21]=0; DE_OUT[20]=0; DE_OUT[19]=0; DE_OUT[18]=0; DE_OUT[17]=0; DE_OUT[16]=0; endendendmodule比較部件源碼module(R1,R2,NVST,0,1);input0,1;input[31:0]R1,R2;outputNVST;regNVST;regnum;num=0+1*2;always(*)begin case(num) 0: begin if(R1==R2) NVST=1; else NVST=0; end 1: begin if(R1==R2) NVST=0; else NVST=1; end 2: begin if(R1<R2) NVST=1; else NVST=0; end 3: begin if(R1>R2) NVST=1; else NVST=0; end endcaseendendmodule信號發(fā)生器源碼modulesignal(clk,w1,w2,w3,w4);inputclk;outputw1,w2,w3,w4;regw1,w2,w3,w4;regclk2,clk3;always(posedgeclk)begin clk2<=~clk2;endalways(negedgeclk)begin clk3<=~clk3;endalways(clkorclk2)begin w1=~clk&~clk2; w2=~clk2&clk; w3=~clk&clk2; w4=clk&clk2;endendmodule硬布線控制器源碼modulecontrol(OP,FUNC,W1,W2,W3,W4,RT_DR,0,1,PC_1,PC_AB,DB_IR,DB_DR,RS_ALU,RT_ALU,DE_ALU,PC_ALU,ZERO_ALU,HE*_ALU,SHAMT_ALU,DR_REG,REG_W,REG_R,ALUCtr0,ALUCtr1,ALUCtr2,ALUCtr3,ADDR_PC,DR_DB,ALU_DR,ALU_AR,AR_AB,DR_PC,DR_REG31,PC_W,PC_R,J_PC,IMM_DE,DE_U,RD_REG,RS_REG,RT_REG,RS_,RT_,DE_,_NVST,ZERO_REG,PC_JIE);inputW1,W2,W3,W4;input[5:0]OP,FUNC;output0,1,ALU_AR,PC_1,RT_DR,PC_AB,DB_IR,DB_DR,RS_ALU,RT_ALU,DE_ALU,PC_ALU,ZERO_ALU,HE*_ALU,SHAMT_ALU,DR_REG,REG_W,REG_R,ALUCtr0,ALUCtr1,ALUCtr2,ALUCtr3,ADDR_PC,DR_DB,ALU_DR,AR_AB,DR_PC,DR_REG31,PC_W,PC_R,J_PC,IMM_DE,DE_U,RD_REG,RS_REG,RT_REG,RS_,RT_,DE_,_NVST,ZERO_REG,PC_JIE;reg0,1,ALU_AR,PC_1,RT_DR,PC_AB,DB_IR,DB_DR,RS_ALU,RT_ALU,DE_ALU,PC_ALU,ZERO_ALU,HE*_ALU,SHAMT_ALU,DR_REG,REG_W,REG_R,ALUCtr0,ALUCtr1,ALUCtr2,ALUCtr3,ADDR_PC,DR_DB,ALU_DR,AR_AB,DR_PC,DR_REG31,PC_W,PC_R,J_PC,IMM_DE,DE_U,RD_REG,RS_REG,RT_REG,RS_,RT_,DE_,_NVST,ZERO_REG,PC_JIE;always(W1orW2orW3orW4)begin PC_1=0; PC_AB=0; DB_IR=0; DB_DR=0; RS_ALU=0; RT_ALU=0; DE_ALU=0; PC_ALU=0; ZERO_ALU=0; HE*_ALU=0; SHAMT_ALU=0; DR_REG=0; REG_W=0; REG_R=0; ALUCtr0=0; ALUCtr1=0; ALUCtr2=0; ALUCtr3=0; ADDR_PC=0; DR_DB=0; ALU_DR=0; AR_AB=0; DR_PC=0; DR_REG31=0; PC_W=0; PC_R=0; J_PC=0; IMM_DE=0; DE_U=0; RD_REG=0; RS_REG=0; RT_REG=0; RS_=0; RT_=0; DE_=0; _NVST=0; ZERO_REG=0; PC_JIE=0; case(OP) 000000: begin case(FUNC) 100000: begin PC_1=W1; PC_AB=W1; DB_IR=W1; RS_ALU=W2; RT_ALU=W2; DR_REG=W3; REG_W=W3; REG_R=W2; ALU_DR=W2; RD_REG=W3; RS_REG=W2; RT_REG=W2; end 100001: begin PC_1=W1; PC_AB=W1; DB_IR=W1; RS_ALU=W2; RT_ALU=W2; DR_REG=W3; REG_W=W3; REG_R=W2; ALU_DR=W2; RD_REG=W3; RS_REG=W2; RT_REG=W2; ALUCtr0=W2; end 100010: begin PC_1=W1; PC_AB=W1; DB_IR=W1; RS_ALU=W2; RT_ALU=W2; DR_REG=W3; REG_W=W3; REG_R=W2; ALU_DR=W2; RD_REG=W3; RS_REG=W2; RT_REG=W2; ALUCtr1=W2; end 100011: begin PC_1=W1; PC_AB=W1; DB_IR=W1; RS_ALU=W2; RT_ALU=W2; DR_REG=W3; REG_W=W3; REG_R=W2; ALU_DR=W2; RD_REG=W3; RS_REG=W2; RT_REG=W2; ALUCtr0=W2; ALUCtr1=W2; end 100100: begin PC_1=W1; PC_AB=W1; DB_IR=W1; RS_ALU=W2; RT_ALU=W2; DR_REG=W3; REG_W=W3; REG_R=W2; ALU_DR=W2; RD_REG=W3; RS_REG=W2; RT_REG=W2; ALUCtr2=W2; end 100101: begin PC_1=W1; PC_AB=W1; DB_IR=W1; RS_ALU=W2; RT_ALU=W2; DR_REG=W3; REG_W=W3; REG_R=W2; ALU_DR=W2; RD_REG=W3; RS_REG=W2; RT_REG=W2; ALUCtr2=W2; ALUCtr0=W2; end 100110: begin PC_1=W1; PC_AB=W1; DB_IR=W1; RS_ALU=W2; RT_ALU=W2; DR_REG=W3; REG_W=W3; REG_R=W2; ALU_DR=W2; RD_REG=W3; RS_REG=W2; RT_REG=W2; ALUCtr2=W2; ALUCtr1=W2; end 100111: begin PC_1=W1; PC_AB=W1; DB_IR=W1; RS_ALU=W2; RT_ALU=W2; DR_REG=W3; REG_W=W3; REG_R=W2; ALU_DR=W2; RD_REG=W3; RS_REG=W2; RT_REG=W2; ALUCtr2=W2; ALUCtr1=W2; ALUCtr0=W2; end 101010: begin end 101011: begin end 000000: begin PC_1=W1; PC_AB=W1; DB_IR=W1; SHAMT_ALU=W2; RT_ALU=W2; DR_REG=W3; REG_W=W3; REG_R=W2; ALU_DR=W2; RD_REG=W3; RT_REG=W2; ALUCtr3=W2; ALUCtr1=W2; end 000010: begin PC_1=W1; PC_AB=W1; DB_IR=W1; SHAMT_ALU=W2; RT_ALU=W2; DR_REG=W3; REG_W=W3; REG_R=W2; ALU_DR=W2; RD_REG=W3; RT_REG=W2; ALUCtr3=W2; ALUCtr1=W2; ALUCtr0=W2; end 000011: begin PC_1=W1; PC_AB=W1; DB_IR=W1; SHAMT_ALU=W2; RT_ALU=W2; DR_REG=W3; REG_W=W3; REG_R=W2; ALU_DR=W2; RD_REG=W3; RT_REG=W2; ALUCtr3=W2; ALUCtr2=W2; end 000100: begin PC_1=W1; PC_AB=W1; DB_IR=W1; RS_ALU=W2; RT_ALU=W2; DR_REG=W3; REG_W=W3; REG_R=W2; ALU_DR=W2; RD_REG=W3; RS_REG=W2; RT_REG=W2; ALUCtr3=W2; ALUCtr1=W2; end 000110: begin PC_1=W1; PC_AB=W1; DB_IR=W1; RS_ALU=W2; RT_ALU=W2; DR_REG=W3; REG_W=W3; REG_R=W2; ALU_DR=W2; RD_REG=W3; RS_REG=W2; RT_REG=W2; ALUCtr3=W2; ALUCtr1=W2; ALUCtr0=W2; end 000111: begin PC_1=W1; PC_AB=W1; DB_IR=W1; RS_ALU=W2; RT_ALU=W2; DR_REG=W3; REG_W=W3; REG_R=W2; ALU_DR=W2; RD_REG=W3; RS_REG=W2; RT_REG=W2; ALUCtr3=W2; ALUCtr2=W2; end 001000: begin PC_1=W1; PC_AB=W1; DB_IR=W1; RS_ALU=W2; ZERO_ALU=W2; REG_R=W2; ALU_DR=W2; RS_REG=W2; DR_PC=W3; PC_W=W3; end endcase end 001000: begin PC_1=W1; PC_AB=W1; DB_IR=W1; RS_ALU=W2; DE_ALU=W2; IMM_DE=W2; DR_REG=W3; REG_W=W3; REG_R=W2; ALU_DR=W2; RS_REG=W2; RT_REG=W3; end 001001: begin PC_1=W1; PC_AB=W1; DB_IR=W1; RS_ALU=W2; DE_ALU=W2; IMM_DE=W2; DR_REG=W3; REG_W=W3; REG_R=W2; ALU_DR=W2; RS_REG=W2; RT_REG=W3; ALUCtr0=W2; DE_U=W2; end 001100: begin PC_1=W1; PC_AB=W1;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論