版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
FPGA實驗報告簡單微處理器的設(shè)計與實現(xiàn)
[實驗?zāi)康腯通過實驗,將“數(shù)字電路與邏輯設(shè)計〞的根本理論和具體實踐相結(jié)合,設(shè)計包括CPU、除法器在內(nèi)的一系列簡單的數(shù)字系統(tǒng),在調(diào)試程序的同時,完成軟件仿真和硬件下載等工作。同時,熟悉VHDL語言和MAXPLUSII軟件的應(yīng)用。[實驗要求]運用在“數(shù)字電路與邏輯設(shè)計〞課程中學(xué)過的根本理論知識,設(shè)計并用可編程邏輯器件實現(xiàn)一個簡單的四位操作數(shù)的微處理器,完成微處理器硬件系統(tǒng)設(shè)計和指令系統(tǒng)設(shè)計兩方面的任務(wù),使微處理器能夠?qū)崿F(xiàn)兩個不帶符號位的四位二進制數(shù)原碼相乘等功能。簡單微處理器介紹1.微處理器硬件系統(tǒng)及原理微處理器硬件系統(tǒng)包括運算器、控制器、存儲器以及其它必要的邏輯部件。下列圖為微處理器的原理框圖,說明如下:程序計數(shù)器PC:存放將要執(zhí)行指令的地址。指令存儲器IRAM:存放用戶指令,容量為16×8的RAM〔或存放器堆〕。開關(guān)S的狀態(tài)用于控制指令的寫入或讀出操作。指令存放器IR:存放被執(zhí)行的指令的操作碼,直接供運算控制器??刂破鰿ON:產(chǎn)生一系列時序邏輯信號,控制微處理器各個部件協(xié)調(diào)一致地完成每條指令相應(yīng)的操作,實現(xiàn)兩個四位數(shù)操作的運算。通用存放器堆RAM:它由四個四位的通用存放器R0,R1,R2,R3組成,用來存放運算過程中讀出和寫入的數(shù)據(jù)。緩沖存放器RS和RD:用于存放處理器的兩個操作數(shù)〔S〕和〔D〕。運算器ALU和進位存放器C:運算器是四位算術(shù)邏輯運算單元,它對兩個四位二進制數(shù)〔S〕和〔D〕進行處理,進位輸入端C0所加的是控制器送來的CI信號,運算結(jié)果的低四位直接輸出,而運算結(jié)果的進位C4輸出到進位存放器中。運算結(jié)果顯示送七段數(shù)碼管顯示,用十六進制顯示。2.處理器指令系統(tǒng)及功能處理器規(guī)定根本指令字長為8位,指令的每一位從高到低用D7~D0表示,指令系統(tǒng)共包括三類指令:存放器指令、轉(zhuǎn)移指令和停機指令,指令的編碼方式如下列圖:指令格式指令位76543210存放器指令OPCCSD轉(zhuǎn)移指令11CCADDR停機指令1100LHD2.1存放器指令這類指令能夠執(zhí)行兩個存放器之間的運算操作,包含OP、CC、S和D四個字段。其中S和D字段指定了兩個存放器。記號〔S〕表示由S字段所指定的存放器的內(nèi)容;記號〔D〕表示由D字段所指的D存放器的內(nèi)容。OP字段規(guī)定了在〔S〕和〔D〕之間執(zhí)行的操作種類,OP字段的編碼狀態(tài)詳細(xì)功能對應(yīng)關(guān)系如下表所示:存放器指令操作碼和OP與功能表操作碼OP功能00D←〔S〕+CI01D←〔S〕+〔D〕+CI10D←〔not(S)〕+〔D〕+CI表中〔S〕和〔D〕分別表示源存放器S和目的存放器D的內(nèi)容。CC字段決定了控制器送給ALU的進位信號CI的狀況。CC字段編碼的功能對照關(guān)系如下表所示。進位標(biāo)志字段CC功能表CCCI00001110C11not(C)每當(dāng)執(zhí)行存放器指令時,都將影響C存放器的內(nèi)容,而其它兩類指令不影響C存放器的內(nèi)容。2.2轉(zhuǎn)移指令指令碼高兩位D7D6為11時表示轉(zhuǎn)移指令。當(dāng)CI為1時,轉(zhuǎn)移到指令的ADDR字段指定的指令地址繼續(xù)執(zhí)行。根據(jù)CC字段的內(nèi)容實際上可以構(gòu)成三種轉(zhuǎn)移指令:無條件轉(zhuǎn)移,有進位轉(zhuǎn)移和無進位轉(zhuǎn)移,如下表所示:轉(zhuǎn)移指令功能表轉(zhuǎn)移類型指令碼C功能說明無條件轉(zhuǎn)移1101ADDRXPC←(ADDR)無條件跳轉(zhuǎn)到〔ADDR〕有進位轉(zhuǎn)移1110ADDR0PC←(PC)+1如果C=1就跳轉(zhuǎn)到〔ADDR〕否那么繼續(xù)執(zhí)行1PC←(ADDR)無進位轉(zhuǎn)移1111ADDR0PC←(ADDR)如果C=0就跳轉(zhuǎn)到〔ADDR〕否那么繼續(xù)執(zhí)行1PC←PC+12.3停機及輸入、輸出〔I/O〕指令指令碼的高4位D7D6D5D4為1100時表示停機及輸入、輸出指令。其中L、H字段決定該指令的具體功能,見下表:L、H字段功能表LH功能10把輸入開關(guān)的數(shù)據(jù)打入到由D字段所指定的存放器中01在執(zhí)行完該條指令后停機。停機時顯示出由D字段所指定的存放器的內(nèi)容11停機,同時顯示出D字段所指定的存放器的舊內(nèi)容,并將輸入開關(guān)的新數(shù)據(jù)送入D存放器。示范程序〔乘法器指令〕下表是兩個不帶符號為的四位二進制數(shù)相乘的程序,程序為8位。該程序保存于指令存儲器中。PC顯示程序地址指令碼操作說明0000011001101R1←(SW),停機R1←X1000110010000R0←(R0)-(R0)R0←02001010000100R0←(R0)-(R1)-1R0←-(X+1)3001111001001R1←(SW)R1←Y4010010011010R2←(R2)-(R2)R2←05010110011111R3←(R3)-(R3)R3←06011000010000R0←(RO)+1R0+17011111101011如果C=1,跳轉(zhuǎn)至1011測試R0是否為08100001000110R2←(R1)+(R2)Y+局部積9100100101111R3←(R3)+C記高位A101011010110無條件跳轉(zhuǎn)至0110轉(zhuǎn)回循環(huán)B101111000111顯示R3,停機顯示高四位C110011000110顯示R2,停機顯示低四位D110111010000無條件跳轉(zhuǎn)至0000重新運行系統(tǒng)輸入與輸出的要求①.“復(fù)位〞開關(guān)——用于置初態(tài)和去除PC。②.“啟動〞開關(guān)——用于啟動,使PC指示的程序開始執(zhí)行。③.“單步/連續(xù)〞開關(guān)——單步工作用于調(diào)試,以便檢查處理器運行情況。④.“程序、數(shù)據(jù)輸入〞開關(guān)——12個開關(guān),分別用于輸入數(shù)據(jù)和程序。⑤.“單脈沖〞按鈕——單步工作時,產(chǎn)生時鐘脈沖。⑥.“數(shù)據(jù)顯示〞——七段顯示器,顯示指令執(zhí)行的結(jié)果。⑦.“PC〞顯示——七段顯示器,顯示PC的內(nèi)容。⑧.“指令碼顯示〞——八個發(fā)光管,顯示指令碼。[設(shè)計思路]〔1〕狀態(tài)設(shè)置及狀態(tài)轉(zhuǎn)移為了實現(xiàn)處理器的功能,教材建議將其運行過程根據(jù)4拍時鐘劃分為4個狀態(tài),我在程序設(shè)計的過程中,將其細(xì)化為0~6一共7個狀態(tài),具體對應(yīng)狀態(tài)如下:“0分析指令〞“1把S送至RS〞“2把D送至RD/判斷是否停機〞“3根據(jù)指令類別進行相應(yīng)操作〞“4運算〞“5取指令〞“6停機〞(說明:狀態(tài)1、2分別對應(yīng)教材上的狀態(tài)1、2,狀態(tài)3、4、6對應(yīng)教材上的狀態(tài)3,狀態(tài)5和狀態(tài)0對應(yīng)教材上的狀態(tài)0)其狀態(tài)轉(zhuǎn)移圖如下:0123546具體的狀態(tài)轉(zhuǎn)移可以根據(jù)指令類別分為以下三種情況:存放器指令狀態(tài)0——1——2——3——4——5完成存放器指令轉(zhuǎn)移指令狀態(tài)0——1——2——3——5完成轉(zhuǎn)移指令停機——I/O指令狀態(tài)0——1——2——3——4——6完成停機指令〔2〕和上升沿同步的啟動信號的實現(xiàn)由于按鍵〔電平或脈沖〕的寬度較寬,需要預(yù)處理電路整形和同步。實際上就是利用傳輸延時,這樣可以得到符合要求的啟動信號。〔3〕主要模塊說明根據(jù)程序的要求,我們將其分成以下幾個模塊,下面簡要做一下介紹:(一些具體的東西指示書已經(jīng)介紹得相當(dāng)詳盡,而且我對源程序的注釋也十分具體,因此在這里不作過多說明)PC程序記數(shù)器:〔存放將要執(zhí)行指令的地址〕輸入端口:CLK——系統(tǒng)時鐘CLR——置0電平INTSTRUNCTION——指令類型ADDR——跳轉(zhuǎn)到的地址輸出端口:PC——程序地址的四位二進制代碼PC_DISPLAY——程序地址的字碼管輸出0001加法器ADDRPC停機CLRCLK多路選擇器譯碼器INSTRUNCTIONPC_DISPLAYIRAM指令存儲器:〔存放用戶讓CPU執(zhí)行的一系列指令〕輸入端口:WR——讀/寫控制CLK——系統(tǒng)時鐘CODE_IN——指令輸入IRAM地址輸出端口:OUTPUTIRAM地址〔PC或number〕IRAMWRINPUT/OUTPUTOUTPUTCLKCODE_INIR指令存放器:〔存放CPU當(dāng)前執(zhí)行的指令〕輸入端口:CLK——系統(tǒng)時鐘WR——讀/寫控制RESET——清0端IRAM——指令存儲器PC——指令地址輸出端口:IR——指令存放CLKWRRESETNOTANDIRAM〔CONV_INTEGER(PC)〕D觸發(fā)器IR
RAM通用存放器堆:〔由四個四位的通用存放器R0、R1、R2、R3組成,用于存放運算過程中需要的一些數(shù)據(jù)〕輸入端口:RAM輸出端口:RAM讀寫電路RAM〔4*4〕通用存放器堆RSRDALUresultCON:〔根據(jù)指令結(jié)構(gòu)判斷出其所屬類別,利用不同的代碼表示〕輸入端口:IRCLK——系統(tǒng)時鐘輸出端口:instruction——利用不同的代碼代表不同的指令類型IRCONinstructionCLKALU:〔對RD、RS提供的數(shù)據(jù)進行計算,將結(jié)果送入RAM中保存〕輸入端口:RS、RD——暫存器CLK——系統(tǒng)時鐘instruction——指令類型輸出端口:RAM——通用存放器堆,存放運算結(jié)果CLKinstructionALURAMRSRD[波形圖]指令輸入:通過上圖可以看出,指令通過code_in輸入〔波形圖中已經(jīng)用16進制表示〕,此時WR置為0;當(dāng)指令輸入完畢后,WR=1,等待啟動信號開始程序的執(zhí)行。這時我們可以看到,在IRAM中的數(shù)據(jù)為CD9084C99A9F10EB462FD6C7C6D00000,也就是所有指令碼已經(jīng)按輸入的次序存儲在IRAM中了,這樣,啟動脈沖到來之后程序就開始執(zhí)行。下面的波形圖演示計算2*E的過程通過波形圖可以看到程序執(zhí)行的流程,是嚴(yán)格按照指令碼的定義運行的,同時通過RD_output值的變化我們也可以看出結(jié)果為2*E=1C,運行結(jié)果是正確的。[程序清單]--------------------------------------------------------實驗五簡單微處理器的設(shè)計與實現(xiàn)----無03班001174陳陽--------------------------------------------------------libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;--定義CPU的輸入、輸出各端口entitycpu2tryisport(--輸入端口--clock_set,clocks,clockc,reset,start,WR :instd_logic; code_in:instd_logic_vector(7downto0); sw:instd_logic_vector(3downto0);--clock_set:單步/連續(xù)選擇0--連續(xù)1--單步;--時鐘Clocks:連續(xù)時鐘;Clockc:單步時鐘;--reset:重置;--start:啟動;--WR:讀寫控制;--code_in處理器指令--sw輸入開關(guān)輸入的數(shù)據(jù)--輸出端口--pc_display,d_display :outstd_logic_vector(6downto0);code_in_display :outstd_logic_vector(7downto0)--pc_display:PC顯示--d_display:d顯示,顯示指令執(zhí)行的結(jié)果;--code_in_display:指令碼顯示);endcpu2try;architecturebehaveOFcpu2tryIStypeIRAMtypeISarray(0to15)ofstd_logic_vector(7downto0);--指令碼存儲類型說明typeRAMtypeISarray(0to3)ofstd_logic_vector(3downto0);--存放器存儲類型說明signalIRAM:IRAMtype;--指令碼存儲器〔16*8〕signalRAM:RAMtype;--通用存放器堆〔4*4〕signalIR :std_logic_vector(7downto0);--指令存放器signalC,CI,L,H:std_logic; --C:進位;CI:進位信號;L、H:功能字段;signaltemp1,temp2,start_strobe :std_logic;--START_strobe:處理器得到的開始信號signalS,D,instruction :std_logic_vector(1downto0);--S:源存放器D:目的存放器instruction:指令類型〔01為存放器指令;10為轉(zhuǎn)移指令;11為停機指令〕signalPC,ADDR :std_logic_vector(3downto0); --PC:程序計數(shù)器;ADDR:指定的指令地址;signalnumber:std_logic_vector(3downto0);--number:輸入地址時控制存儲位置;signalRS,RD,RD_output:std_logic_vector(3downto0);--RS、RD:緩沖存放器;RD_output:輸出時顯示在數(shù)碼管的RD; signalresult :std_logic_vector(4downto0);--運算器計算結(jié)果signalcondition :integerrange0to6;--condition:狀態(tài)說明〔0~6一共7個狀態(tài)〕signalCLK:std_logic;--CLK:處理器所用的時鐘;begin--choose"STEPBYSTEPMODE"or"CONTINOUSMODE"----clock_set為0時為連續(xù)時鐘;clock_set為1時為單步時鐘--choose:process(clock_set,clocks,clockc)beginifclock_set='0'thenCLK<=clocks;elseCLK<=clockc;endif;endprocesschoose;--providethesignal"start"----和上升沿同步的啟動信號startsignal:process(CLK,START)beginifCLK'EVENTANDCLK='1'thentemp1<=start;temp2<=temp1;start_strobe<=temp1AND(NOTtemp2); endif;endprocessstartsignal;--savetheconditionment--save:process(Clockc)beginifClockc'EVENTANDClockc='1'then --單步時鐘觸發(fā)ifWR='0'then --指令碼寫入指令存儲器當(dāng)中IRAM(conv_integer(number))<=code_in;number<=number+"0001";endif;endif;endprocesssave;--display--display:process(PC,CLK,RD_output)beginifCLK'EVENTANDCLK='1'then casePCIS --顯示PCwhen"0000"=>pc_display<="1111110";--輸出0when"0001"=>pc_display<="0110000";--輸出1when"0010"=>pc_display<="1101101";--輸出2when"0011"=>pc_display<="1111001";--輸出3when"0100"=>pc_display<="0110011";--輸出4when"0101"=>pc_display<="1011011";--輸出5when"0110"=>pc_display<="1011111";--輸出6when"0111"=>pc_display<="1110000";--輸出7when"1000"=>pc_display<="1111111";--輸出8when"1001"=>pc_display<="1111011";--輸出9when"1010"=>pc_display<="1110111";--輸出Awhen"1011"=>pc_display<="0011111";--輸出Bwhen"1100"=>pc_display<="1001110";--輸出Cwhen"1101"=>pc_display<="0111101";--輸出Dwhen"1110"=>pc_display<="1001111";--輸出Ewhen"1111"=>pc_display<="1000111";--輸出FwhenOTHERS=>NULL;endcase;caseRD_outputiswhen"0000"=>d_display<="1111110";--輸出0when"0001"=>d_display<="0110000";--輸出1when"0010"=>d_display<="1101101";--輸出2when"0011"=>d_display<="1111001";--輸出3when"0100"=>d_display<="0110011";--輸出4when"0101"=>d_display<="1011011";--輸出5when"0110"=>d_display<="1011111";--輸出6when"0111"=>d_display<="1110000";--輸出7when"1000"=>d_display<="1111111";--輸出8when"1001"=>d_display<="1111011";--輸出9when"1010"=>d_display<="1110111";--輸出Awhen"1011"=>d_display<="0011111";--輸出Bwhen"1100"=>d_display<="1001110";--輸出Cwhen"1101"=>d_display<="0111101";--輸出Dwhen"1110"=>d_display<="1001111";--輸出Ewhen"1111"=>d_display<="1000111";--輸出FwhenOTHERS=>NULL;endcase;endif;endprocessdisplay;--changethecondition--change:process(CLK,reset,start_strobe)begin--0分析指令--1把S送至RS--2把D送至RD/判斷是否停機--3根據(jù)指令類別進行相應(yīng)操作--4運算--5取指令--6停機ifreset='1'thencondition<=6;--重置elsifCLK'EVENTANDCLK='1'thenifWR='1'thenifcondition=1orcondition=2orcondition=4orcondition=0then condition<=condition+1;--直接進入下一狀態(tài)elsifcondition=5thencondition<=0;--狀態(tài)5的下一狀態(tài)為狀態(tài)0elsifcondition=3then--狀態(tài)3的下一狀態(tài)根據(jù)指令有所不同ifIR(7downto4)="1100"thenifH='1'thencondition<=6;--停機elsecondition<=5;endif; elsifIR(7downto6)/="11"then condition<=4;--進入執(zhí)行存放器指令的狀態(tài)elsifIR(7downto6)="11"andIR(5downto4)/="00"then condition<=5;--直接轉(zhuǎn)移指令,不執(zhí)行存放器指令endif;elsifcondition=6ANDSTART_strobe='1'thencondition<=5;--啟動endif;endif;endif;endprocesschange;--CON&ALU--con_alu:process(WR,condition,CLK,reset)beginifreset='1'thenPC<="0000";c<='0';result<="00000";elsifCLK'EVENTANDCLK='1'thenifWR='1'ANDreset='0'thenIR<=IRAM(CONV_integer(PC)); --將指令存儲器中的指令讀出,放入指令存放器;code_in_display<=IR; --顯示讀出的指令ifIR(7downto4)="1100"then instruction<="11"; --停機指令11-00-L-H-D L<=IR(3); H<=IR(2); D<=IR(1downto0);elsifIR(7downto6)="11"then instruction<="10"; --轉(zhuǎn)移指令11-CC-ADDR ADDR<=IR(3downto0);else instruction<="01"; --存放器指令OP-CC-S-D S<=IR(3downto2);--從存放器指令中別離出S D<=IR(1downto0);--從存放器指令中別離出Dendif;ifIR(7downto4)/="1100"thencaseIR(5downto4)is--進位信號處理when"00" =>CI<='0'; when"01" =>CI<='1';when"10" =>CI<=C; when"11"=>CI<=notC;whenothers=>NULL;endcase;endif;ifinstruction="01"then --存放器指令 caseconditionIS when1 =>RS<=RAM(CONV_integer(S));--S送入RS when2 =>RD<=RAM(CONV_integer(D));--D送入RD when3 => caseIR(7downto6)is when"00" =>result<=RS+CI; when"01" =>result<=RS+RD+CI;when"10"=>result<=(notRS)+RD+CI; whenOTHERS=>NULL; endcase;when4=> RAM(CONV_integer(D))<=result(3downto0); C<=result(4);PC<=PC+1;whenOTHERS => NULL; endcase;elsifinstruction="10"then --轉(zhuǎn)移指令 caseconditionISwhen1=>NULL;when2=>NULL; when3=> ifCI='1'thenPC<=ADDR;elsePC<=PC+1;endif;whenOTHERS=
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025 小學(xué)四年級科學(xué)下冊壓縮空氣玩具原理講解課件
- 2026湖北荊州市監(jiān)利市事業(yè)單位人才引進64人參考考試試題附答案解析
- 2026福建南平市建陽區(qū)文化體育和旅游局招聘1人備考考試試題附答案解析
- 2026年上半年黑龍江省人民政府黑瞎子島建設(shè)和管理委員會事業(yè)單位公開招聘工作人員4人參考考試試題附答案解析
- 建立有效的家屬溝通與教育
- 2026山東臨沂莒南縣部分事業(yè)單位招聘綜合類崗位29人備考考試題庫附答案解析
- 2026廣西柳州市融安縣公安局招聘警務(wù)輔助人員50人備考考試試題附答案解析
- 2026重慶銅梁區(qū)慶隆鎮(zhèn)人民政府向社會公開招聘1人參考考試試題附答案解析
- 2026“夢工場”招商銀行重慶分行寒假實習(xí)生招聘備考考試題庫附答案解析
- 2026年度菏澤鄄城縣事業(yè)單位公開招聘初級綜合類崗位人員備考考試試題附答案解析
- 2024-2025學(xué)年七年級語文上學(xué)期期末專題復(fù)習(xí):基礎(chǔ)知識運用(含答案)
- 膠體與界面化學(xué)
- 高溫熔融金屬企業(yè)安全知識培訓(xùn)
- 深圳益電通變頻器說明書TD90
- 2024至2030年中國公安信息化與IT行業(yè)發(fā)展形勢分析及運行策略咨詢報告
- 機動車商業(yè)保險條款(2020版)
- 食管破裂的護理查房
- 民辦高中辦學(xué)方案
- 高教主賽道創(chuàng)業(yè)計劃書
- 一年級上冊生字練字帖(僅打印)
- 委托付款三方協(xié)議中英文版
評論
0/150
提交評論