|
|
一.實(shí)驗(yàn)?zāi)康?/font>
1.深入理解基本模型計(jì)算機(jī)的功能、組成知識
2.深入學(xué)習(xí)計(jì)算機(jī)各類典型指令的執(zhí)行流程
3.學(xué)習(xí)微程序控制器的設(shè)計(jì)過程和相關(guān)技術(shù),掌握LPM_ROM的配置方法
4.在掌握部件單元電路實(shí)驗(yàn)的基礎(chǔ)上,進(jìn)一步將單元電路組成系統(tǒng),構(gòu)造一臺基本模型計(jì)算機(jī)。
5.定義六條機(jī)器指令,并編寫相應(yīng)的微程序,上機(jī)調(diào)試,掌握計(jì)算機(jī)整機(jī)概念。掌握微程序的設(shè)計(jì)方法,學(xué)會編寫二進(jìn)制微指令代碼表。
6.通過熟悉較完整的計(jì)算機(jī)設(shè)計(jì),全面了解并掌握微程序控制方式計(jì)算機(jī)的設(shè)計(jì)方法。
二.實(shí)驗(yàn)原理
1.在部件實(shí)驗(yàn)過程中,各不見單元的控制信號是認(rèn)為模擬產(chǎn)生的,而本實(shí)驗(yàn)將能在微過程控制下自動產(chǎn)生各部件單元控制信號,實(shí)現(xiàn)特定的功能。實(shí)驗(yàn)中,計(jì)算機(jī)數(shù)據(jù)通路的控制將由微過程控制器來完成,CPU從內(nèi)存中取出一條及其指令到指令執(zhí)行結(jié)束的一個指令周期,全部由微指令組成的序列來完成,即一條機(jī)器指令對應(yīng)一個微程序。
2.指令格式
(1)機(jī)器指令格式
采用寄存器直接尋址方式,其格式如下:
| 位 | 7 6 5 4 | 3 2 | 1 0 | | 功能 | 操作碼(OP-CODE) | 源寄存器(Rs) | 目的寄存器(Rd) |
其中寄存器地址規(guī)定如下
| Rs或Rd地址 | 選定的寄存器 | | 00 01 10 | R0 R1 R2 |
模型計(jì)算機(jī)支持的指令如下
| 指令助記符 | 機(jī)器指令碼 | Addr地址碼 | 功能說明 | IN
OUT addr
SUB addr
AND addr
OR addr
XOR addr
MOV #num
LDR addr
| 00H
10H xxH
20H xxH
30H xxH
40H xxH
50H xxH
60H xxH
70H xxH
| “INPUT”中的數(shù)據(jù) → R0
[addr] → OUT
R0 - [addr] → R0
R0 & [addr] → R0
R0 | [addr] → R0
R0 ^ [addr] → R0
num → R0
[addr] → R0
|
其中IN為單字節(jié)指令,其余為雙字節(jié)指令,xxH為addr對應(yīng)的十六進(jìn)制地址碼。為了向RAM中裝入程序和數(shù)據(jù),檢查寫入是否正確,并能啟動程序執(zhí)行,還需要設(shè)計(jì)三個控制臺微程序用于對控制器的控制。
1.存儲器讀操作(KRD):下載實(shí)驗(yàn)程序后按總清除按鍵(CLR)后,控制臺SWA、SWB為“00”時,可對RAM連續(xù)手動讀入操作。
2.存儲器寫操作(KWE):下載實(shí)驗(yàn)程序后按總清除按鍵(CLR)后,控制臺SWA、SWB為“01”時,可對RAM連續(xù)手動寫入操作。
3.啟動程序(RP):下載實(shí)驗(yàn)程序后按總清除按鍵(CLR)后,控制臺SWA、SWB為“11”時,即可轉(zhuǎn)入到微地址“01”號“取指令”微指令,啟動程序運(yùn)行。
控制臺微程序操作如下
| SWB | SWA | 控制臺指令 | | 0 0 1 | 0 1 1 | 讀內(nèi)存(KRD) 寫內(nèi)存(KWE) 啟動程序(RP) |
(2)微指令格式
24位微指令格式如下
| 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | | S3 | S2 | S1 | S0 | M | Cn | WE | A9 | A8 | A[2] | A[1] | A[0] | B[2] | B[1] | B[0] | C[2] | C[1] | C[0] | uA5 | uA4 | uA3 | uA2 | uA1 | uA0 | 其中A、B、C各個字段功能說明
(1)uA5-uA0:微程序控制器的微地址輸出信號,下一條要執(zhí)行的微指令的微地址。
(2)S3、S2、S1、S0:由微程序控制器輸出地ALU操作選擇信號,以控制指令16種算術(shù)操作中的某一種操作。
(3)M:微程序控制輸出地ALU操作方式選擇信號。M=0時執(zhí)行算術(shù)操作;M=1時執(zhí)行邏輯操作。
(4)Cn:微程序控制器輸出的進(jìn)位標(biāo)志信號,Cn=0時表示ALU運(yùn)算時最低位有進(jìn)位,Cn=1時表示無進(jìn)位。
(5)WE:微程序控制器輸出地RAM控制信號。當(dāng)/CE=0時,WE=0為存儲器讀;WE=1為存儲器寫。
(6)A9、A8——譯碼后產(chǎn)生CS0、CS1、CS2信號,分別作為SW_B、RAM、LED的選通信號。
(7)A字段(15、14、13)——譯碼后產(chǎn)生與總線相連接的各單元的輸入選通信號。
(8)B字段(12、11、10)——譯碼后產(chǎn)生與總線相連接的各單元的輸出選通信號。
(9)C字段(9、8、7)——譯碼后產(chǎn)生分支判斷測試信號P(1)~P(4)和LDPC信號。
系統(tǒng)涉及到的微程序流程見圖xx。當(dāng)執(zhí)行“取指令”微指令時,該微指令的判斷測試字段微P(1)測試。由于“取指令”微指令是所有微程序都使用的公共微指令,因此P(1)的測試結(jié)果出現(xiàn)多路分支。 用指令寄存器的高4位(IR7-IR4)作為測試條件,出現(xiàn)5路分支,占用5各固定地址單元。
控制臺操作為P(4)測試,它以控制臺信號SWB、SWA作為測試條件,出現(xiàn)了3路分支,占用3個固定位地址單元。當(dāng)分支位地址單元固定后,剩下的其他地方就可以一條微指令占用控制存儲器的一個微地址單元,隨意填寫。
簡而言之:
M:運(yùn)算模式選擇,0:算術(shù)運(yùn)算;1:邏輯運(yùn)算
Cn:進(jìn)位標(biāo)志位,0:最低位有進(jìn)位;1:無進(jìn)位
WE:RAM寫使能信號,0:RAM讀使能;1:RAM寫使能
A9 A8:
(00)b:IN→BUS;
(01)b:RAM→BUS;
(10)b:BUS→OUT;
A:
(001)b:BUS→Rx(匯編指令中I1 I0指明寄存器地址)
(010)b:BUS→DR1
(011)b:BUS→DR2
(100)b:BUS→IR(指令寄存器)
(101)b:BUS→PC
(110)b:BUS→AR(地址寄存器)
B:
(001)b:Rx→BUS(匯編指令中I3 I2指明寄存器地址)
(010)b:Rx→BUS(匯編指令中I1 I0指明寄存器地址)
(011)b:
(100)b:
(101)b:ALU→BUS
(110)b:PC→BUS
C:
(001)b:測試匯編指令,跳轉(zhuǎn)到相應(yīng)微程序首地址
(010)b:
(011)b:
(100)b:測試控制臺輸入狀態(tài),跳轉(zhuǎn)到控制用的微程序首地址
(101)b:
(110)b:PC+1→PC
當(dāng)全部微程序設(shè)計(jì)完畢后,應(yīng)將每條微指令代碼化:
| 微地址 | 微指令 | S3 S2 S1 S0 M CN WE A9 A8
| A | B | C | uA5——uA0 | | 00 | 018110 | 0 0 0 0 0 0 0 1 1
| 000 | 000 | 100 | 010000 | | 01 | 01ED82 | 0 0 0 0 0 0 0 1 1
| 110 | 110 | 110 | 000010 | | 02 | 00C048 | 0 0 0 0 0 0 0 0 1
| 100 | 000 | 001 | 001000 | | 03 | 000000 |
|
|
|
|
| | 04 | 000000 |
|
|
|
|
| | 05 | 000000 |
|
|
|
|
| | 06 | 000000 |
|
|
|
|
| | 07 | 000000 |
|
|
|
|
| | 10 | 001001 | 0 0 0 0 0 0 0 0 0
| 001 | 000 | 000 | 000001 | | 11 | 01ED98 | 0 0 0 0 0 0 0 1 1
| 110 | 110 | 110 | 011000 | | 12 | 01ED9B | 0 0 0 0 0 0 0 1 1
| 110 | 110 | 110 | 011011 | | 13 | 01ED9F | 0 0 0 0 0 0 0 1 1
| 110 | 110 | 110 | 011111 | | 14 | 01EDA3 | 0 0 0 0 0 0 0 1 1
| 110 | 110 | 110 | 100011 | | 15 | 01EDA7 | 0 0 0 0 0 0 0 1 1
| 110 | 110 | 110 | 100111 | | 16 | 01EDAB | 0 0 0 0 0 0 0 1 1
| 110 | 110 | 110 | 101011 | | 17 | 01EDAD | 0 0 0 0 0 0 0 1 1
| 110 | 110 | 110 | 101101 | | 20 | 01EDAF | 0 0 0 0 0 0 0 1 1
| 110 | 110 | 110 | 101111 | | 21 | 000000 |
|
|
|
|
| | 22 | 000000 |
|
|
|
|
| | 23 | 018001 | 0 0 0 0 0 0 0 1 1
| 000 | 000 | 000 | 000001 | | 24 | 000000 |
|
|
|
|
| | 25 | 000000 |
|
|
|
|
| | 26 | 000000 |
|
|
|
|
| | 27 | 000000 |
|
|
|
|
| | 30 | 00E019 | 0 0 0 0 0 0 0 0 1
| 110 | 000 | 000 | 011001 | | 31 | 00A01A | 0 0 0 0 0 0 0 0 1
| 010 | 000 | 000 | 011010 | | 32 | 010A01 | 0 0 0 0 0 0 0 1 0
| 000 | 101 | 000 | 000001 | | 33 | 00E01C | 0 0 0 0 0 0 0 0 1
| 110 | 000 | 000 | 011100 | | 34 | 00B01D | 0 0 0 0 0 0 0 0 1
| 011 | 000 | 000 | 011101 | | 35 | 01A21E | 0 0 0 0 0 0 0 1 1
| 010 | 001 | 000 | 011110 | | 36 | 619A01 | 0 1 1 0 0 0 0 1 1
| 011 | 101 | 000 | 000001 | | 37 | 00E020 | 0 0 0 0 0 0 0 0 1
| 110 | 000 | 000 | 100000 | | 40 | 00B021 | 0 0 0 0 0 0 0 0 1
| 011 | 000 | 000 | 100001 | | 41 | 01A222 | 0 0 0 0 0 0 0 1 1
| 010 | 001 | 000 | 100010 | | 42 | B99A01 | 1 0 1 1 1 0 0 1 1
| 001 | 101 | 000 | 000001 | | 43 | 00E024 | 0 0 0 0 0 0 0 0 1
| 110 | 000 | 000 | 100100 | | 44 | 00B025 | 0 0 0 0 0 0 0 0 1
| 011 | 000 | 000 | 100101 | | 45 | 01A226 | 0 0 0 0 0 0 0 1 1
| 010 | 001 | 000 | 100110 | | 46 | E99A01 | 1 1 1 0 1 0 0 1 1
| 001 | 101 | 000 | 000001 | | 47 | 00E028 | 0 0 0 0 0 0 0 0 1
| 110 | 000 | 000 | 101000 | | 50 | 00B029 | 0 0 0 0 0 0 0 0 1
| 011 | 000 | 000 | 101001 | | 51 | 01A22A | 0 0 0 0 0 0 0 1 1
| 010 | 001 | 000 | 101010 | | 52 | 699A01 | 0 1 1 0 1 0 0 1 1
| 001 | 101 | 000 | 000001 | | 53 | 009001 | 0 0 0 0 0 0 0 0 1
| 001 | 000 | 000 | 000001 | | 54 | 000000 |
|
|
|
|
| | 55 | 00E02E | 0 0 0 0 0 0 0 0 1
| 110 | 000 | 000 | 101110 | | 56 | 009001 | 0 0 0 0 0 0 0 0 1
| 001 | 000 | 000 | 000001 | | 57 | 009001 | 0 0 0 0 0 0 0 0 1
| 001 | 000 | 000 | 000001 | 指令寄存器(IR):指令寄存器用來保存當(dāng)前正在執(zhí)行的一條指令。當(dāng)執(zhí)行一條指令時,先把它從內(nèi)存取到緩沖寄存器中,然后再傳送至指令寄存器。指令劃分為操作碼和地址碼段,由二進(jìn)制數(shù)構(gòu)成,為了執(zhí)行任何給定的指令,必須對操作碼進(jìn)行測試“P(1)”,通過節(jié)拍脈沖T4的控制,以便識別所要求的操作。
指令譯碼器:根據(jù)指令中的操作碼強(qiáng)置微控制器單元的微地址,使下一條微指令指向相應(yīng)的微程序首地址。
實(shí)驗(yàn)中LCD顯示屏可以用來顯示模型機(jī)CPU中各組成單元的內(nèi)容。將FPGA 配置文件下載到實(shí)驗(yàn)臺后,按系統(tǒng)復(fù)位鍵,LCD液晶顯示屏即顯示CPU中各組成單元的內(nèi)容。其功能說明如下:
| 指令名稱 | 作用 | 指令名稱 | 作用 | | IN | 輸入單元INPUT | DR1 | 暫存器DR1 | | OUT | 輸出單元OUPUT | DR2 | 暫存器DR2 | | ALU | 算術(shù)邏輯單元 | PC | 程序計(jì)數(shù)器 | | BUS | 內(nèi)部數(shù)據(jù)總線 | AR | 地址寄存器 | | R0 | 寄存器R0 | RAM | 程序/數(shù)據(jù)存儲器 | | R1 | 寄存器R1 | IR | 指令寄存器 | | R2 | 寄存器R2 | MC | 微程序控制器 |
測試微程序的機(jī)器指令如下:
| 地址(16進(jìn)制) | 內(nèi)容(16進(jìn)制) | 助記符 | 說明 | | 00 | 00 | IN | “INPUT”中的數(shù)據(jù)66H → R0 | | 01 | 10 | OUT 60H | [60H] → OUT 間接尋址,其中60H中數(shù)據(jù)為44H | | 02 | 60 | | 03 | 20 | SUB 61H | R0 - [61H] → R0 其中61H中數(shù)據(jù)為55H | | 04 | 61 | | 05 | 30 | AND 62H | R0 & [62H] → R0 其中62H中數(shù)據(jù)為01H | | 06 | 62 | | 07 | 40 | OR 63H | R0 | [63H] → R0 其中63H中數(shù)據(jù)為F0H | | 08 | 63 | | 09 | 50 | XOR 64H | R0 ^ [64H] → R0 其中64H中數(shù)據(jù)為00H | | 0A | 64 | | 0B | 60 | MOV #33H | 33H → R0 立即數(shù)尋址方式,將33H送到R0 | | 0C | 33 | | 0D | 70 | LDR 65H | [65H] → R0 間接尋址方式,其中65H中數(shù)據(jù)為77H | | 0E | 65 |
三.實(shí)驗(yàn)步驟
1.微程序的輸入
根據(jù)二進(jìn)制微指令表,編輯LPM_ROM配置文件,與實(shí)驗(yàn)電路一同編譯后,得到FPGA的配置文件,將該文件下載到實(shí)驗(yàn)系統(tǒng)。實(shí)驗(yàn)板上的時鐘clock0選擇輸入頻率為1.5MHz。
2.輸入模型機(jī)的程序,這里采用自動寫入
(1)在QuartusII環(huán)境下,選擇LPM_RAM_DQ的存儲器初始文件(mif文件)為MyRam.mif文件
(2)將工程文件重新編譯后,下載到FPGA中,即完成LPM_RAM的配置。
(3)根據(jù)以上方法,復(fù)位信號RST(鍵8)=1;將控制開關(guān)SWB、SWA(鍵4、鍵3)設(shè)置為0、0,按鍵7,每兩個
2次單步運(yùn)行(產(chǎn)生2個正脈沖)。
3.執(zhí)行程序
(1)按1次系統(tǒng)復(fù)位鍵8,并置鍵8為高電平,使CPU允許正常工作;
(2)控制開關(guān)(鍵4、鍵3)設(shè)置為SWB、SWA=1,1,處于程序執(zhí)行方式,觀察圖6-1控制臺:PR(11);
(3)通過鍵2、鍵1輸入運(yùn)算數(shù)據(jù)66H,按4次單步鍵7,產(chǎn)生2個脈沖,執(zhí)行2條微指令,進(jìn)入到圖6-1控制臺的RP(11),此時的微指令地址是“23”,微指令碼MC=008001;IN=66H
(4)再用鍵7產(chǎn)生1個脈沖,執(zhí)行1條微指令,微程序流程進(jìn)入圖6-2左的“運(yùn)行微程序”的最上塊:此時PC=00,送地址寄存器AR=00,PC自動加1,PC=01,MC=00ED82,IN=66。
(5)鍵7產(chǎn)生1個脈沖,執(zhí)行微指令MC=00C048(圖6-2),RAM中的第一條指令碼00進(jìn)入BUS,再由BUS進(jìn)入指令寄存器IR=00。鍵7再進(jìn)1個脈沖,進(jìn)入MC=001001,執(zhí)行指令I(lǐng)N,送數(shù)IN→R0=66;
(6)鍵7產(chǎn)生1個脈沖,執(zhí)行完IN指令后,返回到初始端,執(zhí)行微指令MC=00ED82;
(7)仿照步驟4~6的操作方法,依次按按鍵7,觀察液晶顯示屏上檢測的CPU內(nèi)部寄存器和總線上的數(shù)據(jù)變化。
四.實(shí)驗(yàn)結(jié)果
針對設(shè)計(jì)的共8條指令,編寫測試機(jī)器碼來測試指令執(zhí)行的正確性。將測試的機(jī)器碼連同模型機(jī)的電路下載到FPGA中,按照三中所敘述的步驟,觀察到液晶顯示屏上的主要數(shù)據(jù)變化如下
執(zhí)行第一條指令I(lǐng)N后,R0=66H
執(zhí)行第二條指令OUT 60H后,OUT=44H
執(zhí)行第三條指令SUB 61H后,R0=11H
執(zhí)行第四條指令A(yù)ND 62H后,R0=01H
執(zhí)行第五條指令OR 63H后,R0=F1H
執(zhí)行第六條指令XOR 64H后,R0=F1H
執(zhí)行第七條指令MOV #33H后,R0=33H
執(zhí)行第八條指令LDR 65H后,R0=65H
從以上測試代碼執(zhí)行的情況來看,微程序的設(shè)計(jì)沒有問題。
五.實(shí)驗(yàn)中遇到的主要問題和分析解決問題的思路
實(shí)驗(yàn)中首先遇到的一個問題是軟件的問題,在使用QuartusII將康芯的示意配置文件修改后下載到FPGA中,F(xiàn)PGA中的微程序運(yùn)行一直不變,剛開始以為是自己的微程序問題,后來在檢查的時候發(fā)現(xiàn)FPGA的配置文件的生成時間跟電腦的時間不吻合,初步確定是配置文件沒有更新,后來在檢查編譯報告時發(fā)現(xiàn)提示該版本的Quartus不能生成編程文件。后來在裝有License的機(jī)器上將文件重新編譯一次,生成了真正的編程文件后,下載到FPGA中,執(zhí)行微指令,正常。中間經(jīng)常遇到的問題是試驗(yàn)箱上的按鍵7按得太快的話,微程序的執(zhí)行順序會變得不正常,這個問題還沒有解決。目前按鍵按得慢點(diǎn)的話不會出現(xiàn)這種問題。還有個問題,當(dāng)指令條數(shù)超過8條后,微控制器給出的微程序入口地址就不是按照原先的規(guī)律遞增了,通過請教老師得知微控制器譯碼的指令不能超過8條,所以本設(shè)計(jì)連同原先的IN和OUT兩條指令,剩下只設(shè)計(jì)6條。
六.學(xué)習(xí)經(jīng)驗(yàn)和切身體會
通過本次課程設(shè)計(jì),初步了解了CPU內(nèi)部的各部分,能夠使用微程序的方式來完成簡單的CPU內(nèi)部控制序列的設(shè)計(jì),對微指令的理解更進(jìn)了一步。提高了自己分析問題解決問題的能力,在遇到的QuartusII軟件License導(dǎo)致無法生成編程配置文件這個問題上通過一步步的分析,把原因定位到軟件的問題上,從而解決了問題。對教學(xué)實(shí)驗(yàn)的有一個建議,就是每臺電腦上裝上殺毒軟件后再裝上還原卡。實(shí)驗(yàn)中遇到不少問題都是機(jī)器的問題,例如軟件的License問題,用U盤把編輯好的工程文件拷貝到別的裝有License的機(jī)子上打開后發(fā)現(xiàn)文件夾被病毒莫名地隱藏了等等。
|
|