MIPS單周期CPU實(shí)驗(yàn)報(bào)告_第1頁(yè)
MIPS單周期CPU實(shí)驗(yàn)報(bào)告_第2頁(yè)
MIPS單周期CPU實(shí)驗(yàn)報(bào)告_第3頁(yè)
MIPS單周期CPU實(shí)驗(yàn)報(bào)告_第4頁(yè)
MIPS單周期CPU實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

-.z."計(jì)算機(jī)組成原理實(shí)驗(yàn)"實(shí)驗(yàn)報(bào)告〔實(shí)驗(yàn)二〕學(xué)院名稱(chēng):專(zhuān)業(yè)〔班級(jí)〕:學(xué)生姓名:**:時(shí)間:2017年11月25日成績(jī):實(shí)驗(yàn)二:?jiǎn)沃芷贑PU設(shè)計(jì)與實(shí)現(xiàn)實(shí)驗(yàn)?zāi)康?1)掌握單周期CPU數(shù)據(jù)通路圖的構(gòu)成、原理及其設(shè)計(jì)方法;(2)掌握單周期CPU的實(shí)現(xiàn)方法,代碼實(shí)現(xiàn)方法;(3)認(rèn)識(shí)和掌握指令與CPU的關(guān)系;(4)掌握測(cè)試單周期CPU的方法;(5)掌握單周期CPU的實(shí)現(xiàn)方法。實(shí)驗(yàn)內(nèi)容設(shè)計(jì)一個(gè)單周期的MIPSCPU,使其能實(shí)現(xiàn)以下指令:==>算術(shù)運(yùn)算指令〔1〕addrd,rs,rt〔說(shuō)明:以助記符表示,是匯編指令;以代碼表示,是機(jī)器指令〕000000rs(5位)rt(5位)rd(5位)reserved功能:rd←rs+rt。reserved為預(yù)留局部,即未用,一般填"0〞?!?〕addirt,rs,immediate000001rs(5位)rt(5位)immediate(16位)功能:rt←rs+(sign-e*tend)immediate;immediate符號(hào)擴(kuò)展再參加"加〞運(yùn)算?!?〕subrd,rs,rt000010rs(5位)rt(5位)rd(5位)reserved功能:rd←rs-rt==>邏輯運(yùn)算指令〔4〕orirt,rs,immediate010000rs(5位)rt(5位)immediate(16位)功能:rt←rs|(zero-e*tend)immediate;immediate做"0〞擴(kuò)展再參加"或〞運(yùn)算?!?〕andrd,rs,rt010001rs(5位)rt(5位)rd(5位)reserved功能:rd←rs&rt;邏輯與運(yùn)算?!?〕orrd,rs,rt010010rs(5位)rt(5位)rd(5位)reserved功能:rd←rs|rt;邏輯或運(yùn)算。==>移位指令〔7〕sllrd,rt,sa011000未用rt(5位)rd(5位)sareserved功能:rd<-rt<<(zero-e*tend)sa,左移sa位,(zero-e*tend)sa==>比較指令〔8〕sltrd,rs,rt帶符號(hào)數(shù)011100rs(5位)rt(5位)rd(5位)reserved功能:if(rs<rt)rd=1elserd=0,具體請(qǐng)看表2ALU運(yùn)算功能表,帶符號(hào)==>存儲(chǔ)器讀/寫(xiě)指令〔9〕swrt,immediate(rs)寫(xiě)存儲(chǔ)器100110rs(5位)rt(5位)immediate(16位)功能:memory[rs+(sign-e*tend)immediate]←rt;immediate符號(hào)擴(kuò)展再相加。即將rt存放器的內(nèi)容保存到rs存放器內(nèi)容和立即數(shù)符號(hào)擴(kuò)展后的數(shù)相加作為地址的內(nèi)存單元中?!?0)lwrt,immediate(rs)讀存儲(chǔ)器100111rs(5位)rt(5位)immediate(16位)功能:rt←memory[rs+(sign-e*tend)immediate];immediate符號(hào)擴(kuò)展再相加。即讀取rs存放器內(nèi)容和立即數(shù)符號(hào)擴(kuò)展后的數(shù)相加作為地址的內(nèi)存單元中的數(shù),然后保存到rt存放器中。==>分支指令〔11〕beqrs,rt,immediate110000rs(5位)rt(5位)immediate(16位)功能:if(rs=rt)pc←pc+4+(sign-e*tend)immediate<<2elsepc←pc+4特別說(shuō)明:immediate是從PC+4地址開(kāi)場(chǎng)和轉(zhuǎn)移到的指令之間指令條數(shù)。immediate符號(hào)擴(kuò)展之后左移2位再相加。為什么要左移2位?由于跳轉(zhuǎn)到的指令地址肯定是4的倍數(shù)〔每條指令占4個(gè)字節(jié)〕,最低兩位是"00〞,因此將immediate放進(jìn)指令碼中的時(shí)候,是右移了2位的,也就是以上說(shuō)的"指令之間指令條數(shù)〞。12〕bners,rt,immediate110001rs(5位)rt(5位)immediate功能:if(rs!=rt)pc←pc+4+(sign-e*tend)immediate<<2elsepc←pc+4特別說(shuō)明:與beq不同點(diǎn)是,不等時(shí)轉(zhuǎn)移,相等時(shí)順序執(zhí)行?!?3〕bgtzrs,immediate110010rs(5位)00000immediate功能:if(rs>0)pc←pc+4+(sign-e*tend)immediate<<2elsepc←pc+4==>跳轉(zhuǎn)指令〔14〕jaddr111000addr[27..2]==>停機(jī)指令〔15〕halt111111000000000(26位)功能:停機(jī);不改變PC的值,PC保持不變。實(shí)驗(yàn)原理1.時(shí)間周期:?jiǎn)沃芷贑PU指的是一條指令的執(zhí)行在一個(gè)時(shí)鐘周期內(nèi)完成,然后開(kāi)場(chǎng)下一條指令的執(zhí)行,即一條指令用一個(gè)時(shí)鐘周期完成。電平從低到高變化的瞬間稱(chēng)為時(shí)鐘上升沿,兩個(gè)相鄰時(shí)鐘上升沿之間的時(shí)間間隔稱(chēng)為一個(gè)時(shí)鐘周期。時(shí)鐘周期一般也稱(chēng)振蕩周期〔如果晶振的輸出沒(méi)有經(jīng)過(guò)分頻就直接作為CPU的工作時(shí)鐘,則時(shí)鐘周期就等于振蕩周期。假設(shè)振蕩周期經(jīng)二分頻后形成時(shí)鐘脈沖信號(hào)作為CPU的工作時(shí)鐘,這樣,時(shí)鐘周期就是振蕩周期的兩倍?!矯PU在處理指令時(shí),一般需要經(jīng)過(guò)以下幾個(gè)步驟:(1)取指令(IF):根據(jù)程序計(jì)數(shù)器PC中的指令地址,從存儲(chǔ)器中取出一條指令,同時(shí),PC根據(jù)指令字長(zhǎng)度自動(dòng)遞增產(chǎn)生下一條指令所需要的指令地址,但遇到"地址轉(zhuǎn)移〞指令時(shí),則控制器把"轉(zhuǎn)移地址〞送入PC,當(dāng)然得到的"地址〞需要做些變換才送入PC。(2)指令譯碼(ID):對(duì)取指令操作中得到的指令進(jìn)展分析并譯碼,確定這條指令需要完成的操作,從而產(chǎn)生相應(yīng)的操作控制信號(hào),用于驅(qū)動(dòng)執(zhí)行狀態(tài)中的各種操作。(3)指令執(zhí)行(E*E):根據(jù)指令譯碼得到的操作控制信號(hào),具體地執(zhí)行指令動(dòng)作,然后轉(zhuǎn)移到結(jié)果寫(xiě)回狀態(tài)。(4)存儲(chǔ)器訪問(wèn)(MEM):所有需要訪問(wèn)存儲(chǔ)器的操作都將在這個(gè)步驟中執(zhí)行,該步驟給出存儲(chǔ)器的數(shù)據(jù)地址,把數(shù)據(jù)寫(xiě)入到存儲(chǔ)器中數(shù)據(jù)地址所指定的存儲(chǔ)單元或者從存儲(chǔ)器中得到數(shù)據(jù)地址單元中的數(shù)據(jù)。(5)結(jié)果寫(xiě)回(WB):指令執(zhí)行的結(jié)果或者訪問(wèn)存儲(chǔ)器中得到的數(shù)據(jù)寫(xiě)回相應(yīng)的目的存放器中。單周期CPU,是在一個(gè)時(shí)鐘周期內(nèi)完成這五個(gè)階段的處理。對(duì)于不同的指令,需要執(zhí)行的步驟是不同的,其中取字指令〔lw〕需要執(zhí)行全部五個(gè)步驟。因此,CPU的時(shí)間周期由取字指令決定。2.指令類(lèi)型:MIPS的三種指令類(lèi)型:其中,op:為操作碼;rs:只讀。為第1個(gè)源操作數(shù)存放器,存放器地址〔編號(hào)〕是00000~11111,00~1F;rt:可讀可寫(xiě)。為第2個(gè)源操作數(shù)存放器,或目的操作數(shù)存放器,存放器地址〔同上〕;rd:只寫(xiě)。為目的操作數(shù)存放器,存放器地址〔同上〕;sa:為位移量〔shiftamt〕,移位指令用于指定移多少位;funct:為功能碼,在存放器類(lèi)型指令中〔R類(lèi)型〕用來(lái)指定指令的功能與操作碼配合使用;immediate:為16位立即數(shù),用作無(wú)符號(hào)的邏輯操作數(shù)、有符號(hào)的算術(shù)操作數(shù)、數(shù)據(jù)加載〔Load〕/數(shù)據(jù)保存〔Store〕指令的數(shù)據(jù)地址字節(jié)偏移量和分支指令中相對(duì)程序計(jì)數(shù)器〔PC〕的有符號(hào)偏移量;address:為地址。在本CPU設(shè)計(jì)中,由于指令的類(lèi)型較少,所以所有指令均由操作碼〔op〕確定。在R型指令中,功能碼〔funct〕為000000。3.控制線路圖與數(shù)據(jù)通路:上圖為CPU的數(shù)據(jù)通路和必要的控制線路圖,其中Ins.Mem為指令存儲(chǔ)器,Data.Mem為數(shù)據(jù)存儲(chǔ)器。訪問(wèn)存儲(chǔ)器時(shí),先給出內(nèi)存地址,然后由讀或?qū)懶盘?hào)控制操作。對(duì)于存放器組,先給出存放器地址,讀操作時(shí),輸出端就直接輸出相應(yīng)數(shù)據(jù);而在寫(xiě)操作時(shí),在WE使能信號(hào)為1,在時(shí)鐘邊沿觸發(fā)將數(shù)據(jù)寫(xiě)入存放器。4.控制信號(hào):控制信號(hào)的作用控制信號(hào)名狀態(tài)"0〞狀態(tài)"1〞Reset初始化PC為0PC接收新地址PCWrePC不更改,相關(guān)指令:haltPC更改,相關(guān)指令:除指令halt外ALUSrcA來(lái)自存放器堆data1輸出,相關(guān)指令:add、sub、addi、or、and、ori、beq、bne、bgtz、slt、sw、lw來(lái)自移位數(shù)sa,同時(shí),進(jìn)展(zero-e*tend)sa,即{{27{0}},sa},相關(guān)指令:sllALUSrcB來(lái)自存放器堆data2輸出,相關(guān)指令:add、sub、or、and、sll、slt、beq、bne、bgtz來(lái)自sign或zero擴(kuò)展的立即數(shù),相關(guān)指令:addi、ori、sw、lwDBDataSrc來(lái)自ALU運(yùn)算結(jié)果的輸出,相關(guān)指令:add、addi、sub、ori、or、and、slt、sll來(lái)自數(shù)據(jù)存儲(chǔ)器〔DataMEM〕的輸出,相關(guān)指令:lwRegWre無(wú)寫(xiě)存放器組存放器,相關(guān)指令:beq、bne、bgtz、sw、halt、j存放器組寫(xiě)使能,相關(guān)指令:add、addi、sub、ori、or、and、slt、sll、lwInsMemRW寫(xiě)指令存儲(chǔ)器讀指令存儲(chǔ)器(Ins.Data)/RD讀數(shù)據(jù)存儲(chǔ)器,相關(guān)指令:lw輸出高阻態(tài)/WR寫(xiě)數(shù)據(jù)存儲(chǔ)器,相關(guān)指令:sw無(wú)操作RegDst寫(xiě)存放器組存放器的地址,來(lái)自rt字段,相關(guān)指令:addi、ori、lw寫(xiě)存放器組存放器的地址,來(lái)自rd字段,相關(guān)指令:add、sub、and、or、slt、sllE*tSel(zero-e*tend)immediate〔0擴(kuò)展〕,相關(guān)指令:ori(sign-e*tend)immediate〔符號(hào)擴(kuò)展〕,相關(guān)指令:addi、sw、lw、bne、bne、bgtzPCSrc[1..0]00:pc<-pc+4,相關(guān)指令:add、addi、sub、or、ori、and、slt、sll、sw、lw、beq(zero=0)、bne(zero=1)、bgtz(sign=1,或zero=1);01:pc<-pc+4+(sign-e*tend)immediate,相關(guān)指令:beq(zero=1)、bne(zero=0)、bgtz(sign=0,zero=0);10:pc<-{(pc+4)[31..28],addr[27..2],0,0},相關(guān)指令:j;11:未用ALUOp[2..0]ALU8種運(yùn)算功能選擇(000-111),看功能表ALU功能表ALUOp[2..0]功能描述000Y=A+B加001Y=A–B減010Y=B<<AB左移A位011Y=A∨B或100Y=A∧B與101Y=〔A<B〕"1:0比較A與B不帶符號(hào)110if(A<B&&(A[31]==B[31]))Y=1;elseif(A[31]&&!B[31)Y=1;elseY=0;比較A與B帶符號(hào)111Y=AB異或附:本CPU的指令集并未用到ALU的全部功能。5.主要模塊接口說(shuō)明:InstructionMemory:指令存儲(chǔ)器,address,指令存儲(chǔ)器地址輸入端口DataIn,指令存儲(chǔ)器數(shù)據(jù)輸入端口〔指令代碼輸入端口〕DataOut,指令存儲(chǔ)器數(shù)據(jù)輸出端口〔指令代碼輸出端口〕InsMemRW,指令存儲(chǔ)器讀寫(xiě)控制信號(hào),為0寫(xiě),為1讀DataMemory:數(shù)據(jù)存儲(chǔ)器,address,數(shù)據(jù)存儲(chǔ)器地址輸入端口DataOut,數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)輸出端口/RD,數(shù)據(jù)存儲(chǔ)器讀控制信號(hào),為0讀/WR,數(shù)據(jù)存儲(chǔ)器寫(xiě)控制信號(hào),為0寫(xiě)RegisterFile:存放器組ReadReg1,rs存放器地址輸入端口ReadReg2,rt存放器地址輸入端口WriteReg,將數(shù)據(jù)寫(xiě)入的存放器端口,其地址來(lái)源rt或rd字段WriteData,寫(xiě)入存放器的數(shù)據(jù)輸入端口ReadData1,rs存放器數(shù)據(jù)輸出端口ReadData2,rt存放器數(shù)據(jù)輸出端口WE,寫(xiě)使能信號(hào),為1時(shí),在時(shí)鐘邊沿觸發(fā)寫(xiě)入RST,存放器清零信號(hào),為0時(shí)存放器清零ALU:算術(shù)邏輯單元result,ALU運(yùn)算結(jié)果zero,運(yùn)算結(jié)果標(biāo)志,結(jié)果為0,則zero=1;否則zero=0sign,運(yùn)算結(jié)果標(biāo)志,結(jié)果最高位為0,則sign=0,正數(shù);否則,sign=1,負(fù)數(shù)實(shí)驗(yàn)器材電腦一臺(tái),*ilin*Vivado軟件一套,Basys3板一塊。實(shí)驗(yàn)過(guò)程與結(jié)果1.各個(gè)指令對(duì)應(yīng)的控制信號(hào)指令PCWreALUSrcAALUSrcBDBDataSrcRegWreInsMemRWRDWRRegDstE*tSelAdd100011111*Addi1010111101Sub100011111*Ori1010111100And100011111*Or100011111*Sll110011111*Slt100011111*Sw101*0110*1Lw1011110101Beq100*0111*1Bne100*0111*1Bgtz100*0111*1J1***0111**Halt0***0111**控制信號(hào)ALUOpAdd000Addi000Sub001Ori011And100Or011Sll010Slt110Sw000Lw000Beq001Bne001Bgtz101J010Halt***除異或運(yùn)算〔111〕外,ALU所有功能均被使用。PCSrc指令00add、addi、sub、or、ori、and、slt、sll、sw、lw、beq(zero=0)、bne(zero=1)、bgtz(sign=1,或zero=1)01beq(zero=1)、bne(zero=0)、bgtz(sign=0,zero=0)10j2.主要模塊代碼及仿真〔1〕控制單元〔controlunit〕Verilog代碼:module

controlUnit(

input

[5:0]

opcode,

input

zero,

input

sign,

output

reg

PCWre,

output

reg

ALUSrcA,

output

reg

ALUSrcB,

output

reg

DBDataSrc,

output

reg

RegWre,

output

reg

InsMemRW,

output

reg

RD,

output

reg

WR,

output

reg

RegDst,

output

reg

E*tSel,

output

reg

[1:0]

PCSrc,

output

reg

[2:0]

ALUOp

);

initial

begin

RD

=

1;

WR

=

1;

RegWre

=

0;

InsMemRW

=

0;

end

always

(opcode)

begin

case(opcode)

6'b000000:begin

//

add

PCWre

=

1;

ALUSrcA

=

0;

ALUSrcB

=

0;

DBDataSrc

=

0;

RegWre

=

1;

InsMemRW

=

1;

RD

=

1;

WR

=

1;

RegDst

=

1;

ALUOp

=

3'b000;

end

6'b000001:begin

//addi

PCWre

=

1;

ALUSrcA

=

0;

ALUSrcB

=

1;

DBDataSrc

=

0;

RegWre

=

1;

InsMemRW

=

1;

RD

=

1;

WR

=

1;

RegDst

=

0;

E*tSel

=

1;

ALUOp

=

3'b000;

end

6'b000010:begin

//sub

PCWre

=

1;

ALUSrcA

=

0;

ALUSrcB

=

0;

DBDataSrc

=

0;

RegWre

=

1;

InsMemRW

=

1;

RD

=

1;

WR

=

1;

RegDst

=

1;

ALUOp

=

3'b001;

end

6'b010000:begin

//

ori

PCWre

=

1;

ALUSrcA

=

0;

ALUSrcB

=

1;

DBDataSrc

=

0;

RegWre

=

1;

InsMemRW

=

1;

RD

=

1;

WR

=

1;

RegDst

=

0;

E*tSel

=

0;

ALUOp

=

3'b011;

end

6'b010001:begin

//and

PCWre

=

1;

ALUSrcA

=

0;

ALUSrcB

=

0;

DBDataSrc

=

0;

RegWre

=

1;

InsMemRW

=

1;

RD

=

1;

WR

=

1;

RegDst

=

1;

ALUOp

=

3'b100;

end

6'b010010:begin

//

or

PCWre

=

1;

ALUSrcA

=

0;

ALUSrcB

=

0;

DBDataSrc

=

0;

RegWre

=

1;

InsMemRW

=

1;

RD

=

1;

WR

=

1;

RegDst

=

1;

ALUOp

=

3'b011;

end

6'b011000:begin

//sll

PCWre

=

1;

ALUSrcA

=

1;

ALUSrcB

=

0;

DBDataSrc

=

0;

RegWre

=

1;

InsMemRW

=

1;

RD

=

1;

WR

=

1;

RegDst

=

1;

ALUOp

=

3'b010;

end

6'b011100:begin

//slt

PCWre

=

1;

ALUSrcA

=

0;

ALUSrcB

=

0;

DBDataSrc

=

0;

RegWre

=

1;

InsMemRW

=

1;

RD

=

1;

WR

=

1;

RegDst

=

1;

ALUOp

=

3'b110;

end

6'b100110:begin

//sw

PCWre

=

1;

ALUSrcA

=

0;

ALUSrcB

=

1;

RegWre

=

0;

InsMemRW

=

1;

RD

=

1;

WR

=

0;

E*tSel

=1;

ALUOp

=

3'b000;

end

6'b100111:begin

//lw

PCWre

=

1;

ALUSrcA

=

0;

ALUSrcB

=

1;

DBDataSrc

=

1;

RegWre

=

1;

InsMemRW

=

1;

RD

=

0;

WR

=

1;

RegDst

=

0;

E*tSel

=

1;

ALUOp

=

3'b000;

end

6'b110000:begin

//beq

PCWre

=

1;

ALUSrcA

=

0;

ALUSrcB

=

0;

RegWre

=

0;

InsMemRW

=

1;

RD

=

1;

WR

=

1;

E*tSel

=

1;

ALUOp

=

3'b001;

end

6'b110001:begin

//bne

PCWre

=

1;

ALUSrcA

=

0;

ALUSrcB

=

0;

RegWre

=

0;

InsMemRW

=

1;

RD

=

1;

WR

=

1;

E*tSel

=

1;

ALUOp

=

3'b001;

end

6'b110010:begin

PCWre

=

1;

ALUSrcA

=

0;

ALUSrcB

=

0;

RegWre

=

0;

InsMemRW

=

1;

RD

=

1;

WR

=

1;

E*tSel

=

1;

ALUOp

=

3'b001;

end

6'b111000:begin

//j

PCWre

=

1;

RegWre

=

0;

InsMemRW

=

1;

RD

=

1;

WR

=

1;

ALUOp

=

3'b010;

end

6'b111111:begin

//halt

PCWre

=

1;

RegWre

=

0;

InsMemRW

=

1;

RD

=

1;

WR

=

1;

end

default:begin

RD

=

1;

WR

=

1;

RegWre

=

0;

InsMemRW

=

0;

end

endcase

end

always(opcode

or

zero

or

sign)

begin

if(opcode

==

6'b111000)

//

j

PCSrc

=

2'b10;

elseif(opcode[5:3]

==

3'b110)

begin

if(opcode[2:0]

==

3'b000)

begin

if(zero

==

1)

PCSrc

=

2'b01;

else

PCSrc

=

2'b00;

end

elseif(opcode[2:0]

==

3'b001)

begin

if(zero

==

0)

PCSrc

=

2'b01;

else

PCSrc

=

2'b00;

end

else

begin

if(zero

==

0

&&

sign

==

0)

PCSrc

=

2'b01;

else

PCSrc

=

2'b00;

end

end

else

begin

PCSrc

=

2'b00;

end

end

endmodule

仿真截圖:〔2〕程序計(jì)數(shù)器〔PC〕Verilog代碼:module

PC(

input

clk,

input

[31:0]

PCin,

input

PCWre,

input

Reset,

output

reg

[31:0]

PCout

);

initial

begin

PCout

<=

0;

end

always(posedge

clk)

begin

if(Reset

==

0)

begin

PCout

<=

0;

end

elseif(PCWre

==

0)

begin

PCout

<=

PCout;

end

else

begin

PCout

<=

PCin;

end

end

endmodule

仿真截圖:〔3〕程序存儲(chǔ)器〔instructionmemory〕Verilog代碼:module

IMemory(

input

InsMemRW,

input

[31:0]

address,

output

reg

[31:0]

DataOut

);

reg

[7:0]

mem

[0:127];

initial

begin

DataOut

=

32'b111111_0000000_0000000_0000000_00000;

$readmemb("C:/Users/ACER/Desktop/-p/project_1/rom_data.coe",

mem);

end

always(address

or

InsMemRW)

begin

if(InsMemRW

==

1)

begin

DataOut[31:24]

<=

mem[address];

DataOut[23:16]

<=

mem[address+1];

DataOut[15:8]

<=

mem[address+2];

DataOut[7:0]

<=

mem[address+3];

end

end

endmodule

仿真截圖:〔4〕ALUVerilog代碼:module

ALU(

input

[2:0]

ALUopcode,

input

[31:0]

rega,

input

[31:0]

regb,

output

reg

[31:0]

result,

output

zero,

output

sign

);

assign

zero

=

(result==0)"1:0;

assign

sign

=

result[31];

always

(

ALUopcode

or

rega

or

regb

)

begin

case

(ALUopcode)

3'b000

:

result

=

rega

+

regb;

3'b001

:

result

=

rega

-

regb;

3'b010

:

result

=

regb

<<

rega;

3'b011

:

result

=

rega

|

regb;

3'b100

:

result

=

rega

&

regb;

3'b101

:

result

=

(rega

<

regb)"1:0;

//

不帶符號(hào)比較

3'b110

:

begin

//

帶符號(hào)比較

if

(rega<regb

&&((

rega[31]

==

0

&&

regb[31]==0)

||

(rega[31]

==

1

&&

regb[31]==1)))

result

=

1;

elseif

(rega[31]

==

0

&&

regb[31]==1)

result

=

0;

elseif

(

rega[31]

==

1

&&

regb[31]==0)

result

=

1;

else

result

=

0;

end

3'b111

:

result

=

rega

^

regb;

endcase

end

endmodule

仿真截圖:〔5〕存放器堆Verilog代碼:module

RegFile(

input

CLK,

input

RST,

input

RegWre,

input

[4:0]

ReadReg1,

input

[4:0]

ReadReg2,

input

[4:0]

WriteReg,

input

[31:0]

WriteData,

output

[31:0]

ReadData1,

output

[31:0]

ReadData2

);

reg

[31:0]

regFile[1:31];

//

存放器定義必須用reg

類(lèi)型

integer

i;

assign

ReadData1

=

(ReadReg1

==

0)

"

0

:

regFile[ReadReg1];

//

讀存放器數(shù)據(jù)

assign

ReadData2

=

(ReadReg2

==

0)

"

0

:

regFile[ReadReg2];

always

(negedge

CLK)

begin

//

必須用時(shí)鐘邊沿觸發(fā)if

(RST==0)

begin

for(i=1;i<32;i=i+1)

regFile[i]

<=

0;

end

elseif(RegWre

==

1

&&

WriteReg

!=

0)

begin

regFile[WriteReg]

<=

WriteData;

end

end

endmodule

仿真截圖:〔6〕數(shù)據(jù)存儲(chǔ)單元〔DataMemory〕Verilog代碼:module

DataMemory(

input

clk,

input

[31:0]

address,

input

RD,

input

WR,

input

[31:0]

DataIn,

output

[31:0]

DataOut

);

reg

[7:0]

ram[0:127];

integer

i;

initial

begin;

for(i=0;i<128;i=i+1)

ram[i]<=0;

end

//

outputassign

DataOut[7:0]

=

(RD

==

0)"

ram[address+3]:8'bz;

assign

DataOut[15:8]

=

(RD

==

0)"

ram[address+2]:8'bz;

assign

DataOut[23:16]

=

(RD

==

0)"

ram[address+1]:8'bz;

assign

DataOut[31:24]

=

(RD

==

0)"

ram[address]:8'bz;

//

inputalways(negedge

clk)

begin

if(WR

==

0)

begin

if(address>=0

&&

address<128)

begin

ram[address]

<=

DataIn[31:24];

ram[address+1]

<=

DataIn[23:16];

ram[address+2]

<=

DataIn[15:8];

ram[address+3]

<=

DataIn[7:0];

end

end

end

endmodule

仿真截圖:3.測(cè)試程序:測(cè)試程序如下:地址匯編程序指令代碼op〔6〕rs(5)rt(5)rd(5)/immediate(16)16進(jìn)制數(shù)代碼0*00000000addi$1,$0,800000100000000010000000000001000040100080*00000004ori$2,$0,201000000000000100000000000000010400200020*00000008add$3,$2,$1000000000100000100011000000000000041180

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論