计算机组成原理——课程设计
《計算機組成原理》
課程設計
?
一、目的和要求
深入了解計算機各種指令的執行過程,以及控制器的組成,指令系統微程序設計的具體知識,進一步理解和掌握動態微程序設計的概念;完成微程序控制的特定功能計算機的指令系統設計和調試。
二、實驗環境
1.??? TEC-2機一臺
2.??? 電腦一臺
3.??? TEC-2模擬軟件一套
三、具體內容
1.分析TEC-2機的功能部件組成,分析TEC-2機支持的指令格式等。
(一)AM2901芯片的內部結構和芯片的引腳信號
AM2901是位片結構,每片內僅有4位線路,內部組成包括:
1.4位的ALU,可以實現8種運算功能,每一位上的2個輸入端數據分別用R和S表示,8種功能分別是R+S,S-R,R-S 3種算術運算,R∧S,R∨S,/R∧S,R⊕S,R⊙S 5種邏輯運算。這8種功能的選擇控制,用外部送入的3位編碼值I5~3實現的。ALU還有Cn+4、F、OVR、和F=0000 4位狀態信息,并能接收最低位的一個進位輸入信號Cn,ALU還給出了超前進位信號/G和/P。
2.16個4位的通用寄存器組,用R0-R15表示,和一個4位的Q寄存器。通用寄存器組為雙端口讀出和單端口控制寫入的運行方式,而且運算后的結果經一個移位器實現寫入。Q寄存器本身具有左、右移位功能且能接收ALU的運算結果。左右移位時,就有移出、移入信號RAM3、RAM0、Q3、Q0 4個信號。
3.該信片能接收外部送入的4位數據D3-0,并輸出4位的數據Y3-0。Y3-0可以是通用寄存器A端口上的輸出或ALU的運算結果F,并且輸出允許控制信號/OE的控制,盡在/OE為低時,Y3-0才有輸出。
4.ALU的兩個輸入端R和S分別可以接收D輸入、A端口或邏輯0數據,和A端口、B端口、Q寄存器或邏輯0數據。AM2901器件選用了12種組合的8種,即A_Q,A_B,O_Q,0_B,0_A,D_A,D_Q和D_0 8種組合,并用外部送來的3位控制碼I2-0選擇。
5.AM2901采用另外3位外部送來的控制信號I8-6,一是選擇向外部送出的數據的來源,二是選擇內部的通用寄存器組和Q寄存器是否接收和如何接收數據寫入。
6.在AM2901芯片內有16個通用寄存器R0-R15,R0-R3、R7-R15共13個寄存器作為通用寄存器供用戶使用,R4-R63個寄存器分別作為SP、PC、IP。正常情況下,不能把這3個寄存器當作通用寄存器使用。
?
?
(二)AM2901芯片引腳信號
1.D3-D0:外部送給AM2901的數據信號
2.Y3-Y0:AM2901向外送出的數據信號
3.A、B地址:選擇通用寄存器組種的源與目的寄存器,當A和B同值時,被選中的同一個寄存器中的內容將被同時送到A、B兩個數據輸出端口。
4.I8-I0:外部送來的3組3位控制信號,分別選擇AM2901對數據結果的處理方案、ALU執行的運算功能、ALU接收的操作數來源。
?
?
(三)TEC-2機的控制器組成
指令寄存器IR:用于存放當前正在執行的指令內容。
程序計數器PC:PC是用運算器通用寄存器組中的寄存器R5實現的,程序計數器PC用于存放內存單元地址,
指令指針寄存器IP:IP是用運算器通用寄存器組中的寄存器R6實現的,IP用于存放當前正在執行的機器指令其指令代碼所在的內存單元地址。
7片LS6116隨機讀寫的存儲器芯片組成的56位字長的微程序控制存儲器,用于存放TEC-2機的微程序。其內容在剛加電時不定,加電后將首先從2片ROM中讀出固化的、用于實現53條機器指令的微程序,稍加組織后寫入這一控制存儲器,這一過程稱為裝入微碼。裝入完成后,將從監控程序的零地址執行指令,完成TEC-2機的啟動過程。之后,可以用LDMC指令向控制存儲器寫入新的微程序,實現新的機器指令。
微指令寄存器PLR由7片8位的寄存器芯片(6片LS374和1片LS273)組成,用于存放當前微指令的內容。
?
(四)為AM2910提供輸入地址信號的配套線路
由兩片LS2716ROM芯片組成的MAPROM,它可以將指令寄存器中的操作碼變為一段微程序的入口地址。
由1片LS125和LS244組成的接受內部總線的IB9-0信號的選擇門電路,把由水平板上的開關提供的微指令地址送入AM2910的地址輸入端。
由1片LS125和微指令寄存器的PLR55-48組成的一組地址輸入,把當前微指令中的后續地址B55-46送入AM2910的地址輸入端。
這三組信號均為10位寬,且為互斥關系,分別由/MAP、/VECT和/PL加以選通。
?
(五)AM2910芯片
1.功能:正確形成下一條微指令的地址,以保證微程序正確、高效地執行。
2.組成:AM291包括一個四輸入的多路地址選擇器,用來選擇寄存器/計數器(R),直接輸入(D),微程序計數器(μPC)或微堆棧(F)中的一個作為下一條微指令的地址。
3.寄存器/計數器由12個D型觸發器組成。當它用作寄存器時,主要用于保存一個微地址,用以實現微程序分支;當它用作計數器時,具有減一功能,主要用于控制微程序的循環次數,若裝入的初值為N,則可執行N+1次。
4.微程序計數器由12位增量器和12位寄存器組成。 當增量器的進位輸入C1為高電平時,多路器的輸出Y加1后裝入μPC,用于實現微程序的順序執行;當C1為低電平時,多路器的輸出Y直接裝入μPC,用于實現同一條微指令的多次執行。
5.微堆棧是由5字×12位的寄存器堆和微堆棧指針μSP組成,主要用于保存微子程序調用的返回地址和微程序循環的首地址。微堆棧指針μSP總是指向最后一次壓入的數據。因此,執行微程序循環時,允許不執行彈出操作而直接訪問微堆棧的棧頂。當堆棧中的數據達到5個時,發出堆棧已滿信號(/FULL=0)。這時,任何壓入操作都將覆蓋掉棧頂的數據。
?
?
(六)微指令格式
每條微指令由56位組成,從高到低各位標記為B55-B0,分為13個字段。
?
B55-B46的10位微碼是下地址字段;
B55,B44備用;
B43-B40位CI3-1,用于給出AM2910芯片的16中命令碼的編號;
B39-37、36分別為3位的SCC和1位的SC,給出AM2910芯片的條件判斷信號/CC的選擇碼,用于保證微指令的條件轉移等;
B35位備用;
B34-32位SST,控制標志寄存器的寫入;
B31、B27、B23位為/MI0,REQ和/WE,用于控制內存的讀寫、外設接口的讀寫,以及微碼的裝入。
B30-B28位為MI8-6,用于選擇運算結果存入的寄存器,以及Y輸出的選擇;
B26-B24位為MI5-3,用于選擇進行何種算術或邏輯運算;
B22-B20位為MI2-0,用于選擇R和S端的數據輸入;
B19-B16位為A口地址;
B15-B12位為B口地址;
B11-B10位為SCi,控制最低位進位;
B9-B8位為SSH,形成移位信號;
B7位為A口地址選通信號;
B6-B4位為DC1,控制向IB總線的發送內容;
B3位為B口選通地址;
B2-B0位為DC2,選擇接收的寄存器。
?
?
(七)自行設計新指令的微程序段
MEM的內容是當前地址寄存器AR所存的地址單元的內容。
寄存器Q的內容可以是立即數,也可以是地址。
11條未定義的機器指令的6位操作碼已定,最低兩位可用于選擇C、Z、V、S四個標志位作為判別條件。
11條未定義的機器指令具有對應的微程序段的入口地址,如D4對應的是100H,D8對應的是110H。
裝入新指令的微碼有兩種方法,一是通過水平板上的開關與按鍵直接撥入,二是在程序中用LDMC指令實現自動裝入。
新指令在每次TEC-2機重新加電后,至少得重新裝入一次對應的微碼;僅在裝入相應微碼后,新指令才能執行。
?
2.使用TEC-2仿真軟件進行微指令級的設計和調試,完成微程序控制的特定功能計算機的指令設計。
?
選定指令格式、操作碼,設計如下指令:
?
基于上圖進行下列指令說明:
例:
?
2.1
指令格式:D8××,ADDR1,ADDR2,?? 三字指令(控存入口110H)
功能:??? [ADDR1]=[ADDR2] -[ADDR1]
?
畫出微指令流程圖
?
微指令詳細設計:
PC->AR,PC+1->PC:???? 0000 0E00 A0B5 5402?? 為讀取第1個操作數的地址做準備
MEM -> AR, MEM->R7:? 0000 0E00 30F0 7002?? 將指令地址送AR(ADDR1),R7寄存器
MEM->Q:????????????? 0000 0E00 00F0 0000?? 將內存單元中的數據送入Q寄存器
PC->AR,PC+1->PC:???? 0000 0E00 A0B5 5402?? 為讀取第2個操作數的地址做準備
MEM->AR:???????????? 0000 0E00 10F0 0002?? 將指令地址送AR(ADDR2)
MEM-Q->Q: ?????????? ?0000 0E01 02E0 0000?? ADDR2-ADDR1=ADDDR1
R7->AR:????????????? 0000 0E00 9047 0002?? 把ADDR1的地址R7送入AR中
Q→MEM,CC#=0,3#,A4H:? 0029 0300 1020 0010?? 將結果送入ADDR1中
?
?
pc指向addr2之后,如何把計算的結果值重新送回addr1。先把addr1的地址保存在R7寄存器中。要存入結果的時候,把R7中的內容送到AR中。
?
?
?
0?? 0??? 0??? E??? 0??? 0??? A???? 0??? B??? 5??? 5??? 4???? 0??? 2
| 0000 | 0000 | 0000 | 1110 | 000 0 | 0 000 | 1 010 | 0 000 | 1 011 | 0101 | 0101 | 01 00 | 0 000 | 0 010 |
下地址????? ???順序執行 SCC SC ?備用SST? F->B??? +S?? ??MI2-0 ?A口?? ?B口 ?SCI SSH ?SA DC1 SB DC2
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?不操作?
?
DC2 :在本條微碼中,地址寄存器接收,故 DC2 為 010
DC1 :未向 IB 總線發送控制,故 DC1 為 000
SA :作 Am2901
SB :作 Am2901
SSH :未移位
SCI :未進位
B 口:使用了寄存器 R5 ,即程序計數器 PC
A 口:使用了寄存器 R5 ,即程序計數器 PC
MI2-0 :此時 ALU 的 R 端輸入為 0 , S 端輸入為 B
MI5-3 :運算功能選擇為“ +S ”,即執行 +1 功能
BI8-6 :有返回值,且返回值返回至 B ,而 Y 的輸出選擇為 A
MI0# , REQ , WE# :三位用于控制內外數據總線的讀和寫,此處不操作,故取 10X
SST :未用狀態,故為 000
備用位為 0
SC? ????未用條件碼,故為 0
SCC
Am2901 命令: 14# 命令,即為順序執行
下地址:由于順序執行,并未使用下地址,故下地址為 0
?
(2) ?MEM -> AR, MEM->R7:0000 0E00 30F0 7002
?
0?? 0??? 0??? E??? 0??? 0??? 3???? 0??? F??? 0??? 7??? 0???? 0??? 2
| 0000 | 0000 | 0000 | 1110 | 000 0 | 0 000 | 0 011 | 0 000 | 1 111 | 0000 | 0111 | 00 00 | 0 000 | 0 010 |
下地址????? ???順序執行 SCC SC ?備用SST? F->B??? +S?? ??MI2-0 ?A口?? ?B口 ?SCI SSH ?SA DC1 SB DC2
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?存儲器讀
?
DC2 :在本條微碼中,地址寄存器接收,故 DC2 為 010
DC1 :未向 IB 總線發送控制,故 DC1 為 000
SA :作 Am2901
SB :作 Am2901
SSH :未移位
SCI :未進位
B 口:使用了寄存器 R7 ,即程序計數器 PC
A 口:未使用寄存器,故為 0
MI2-0 :此時 ALU 的 R 端輸入為 D (外部數據), S 端輸入為 0
MI5-3 :運算功能選擇為“ +S ”,即執行 D+0
BI8-6 :有返回值,且返回值返回至 B ,而 Y 的輸出選擇為 F
MI0# , REQ , WE# :三位用于控制內外數據總線的讀和寫,此處不操作,故取 10X
SST :未用狀態,故為 000
備用位為 0
SC? ????未用條件碼,故為 0
SCC
Am2901 命令: 14# 命令,即為順序執行
下地址:由于順序執行,并未使用下地址,故下地址為 0
?
?
(3) ?MEM→Q:0000?0E00 00F0 0000
?
0?? 0??? 0??? E??? 0??? 0??? 0???? 0??? F??? 0??? 0??? 0???? 0??? 0
| 0000 | 0000 | 0000 | 1110 | 000 0 | 0 000 | 0 000 | 0 000 | 1 111 | 0000 | 0000 | 00 00 | 0 000 | 0 000 |
下地址????? ???順序執行 SCC SC ?備用SST? F->B ???+S?? ??MI2-0 ?A口?? ?B口 ?SCI SSH ?SA DC1 SB DC2
? ???????????????????????????????????????? ??????????????????????存儲器讀
?
DC2 :在本條微碼中,寄存器未接收,故 DC2 為 000
DC1 :未向 IB 總線發送控制,故 DC1 為 000
SA :作 Am2901
SB :作 Am2901
SSH :未移位
SCI :未進位
B 口:未使用寄存器,故為 0
A 口:未使用寄存器,故為 0
MI2-0 :此時 ALU 的 R 端輸入為 D (外部數據), S 端輸入為 0
MI5-3 :運算功能選擇為“ +S ”,即執行 D+0
BI8-6 :有返回值 0 ,而 Y 的輸出選擇為 F?? ,故此處為 000
MI0# , REQ , WE# :三位用于控制內外數據總線的讀和寫,此處為讀出內存單元內容,并將其送入 Q 寄存器,故取 001
SST :未用狀態,故為 000
備用位為 0
SC???? 未用條件碼,故為 0
SCC
Am2901 命令: 14# 命令,即為順序執行
下地址:由于順序執行,并未使用下地址,故下地址為 0
?
(4) ?PC→AR,PC+1→PC:0000?0E00 A0B5 5402
?
與第一條指令相同
?
(5) ?MEM→AR:0000?0E00 10F0 0002
?
0?? 0??? 0??? E??? 0??? 0??? 1???? 0??? F??? 0??? 0??? 0???? 0??? 2
| 0000 | 0000 | 0000 | 1110 | 000 0 | 0 000 | 0 001 | 0 000 | 1 111 | 0000 | 0000 | 00 00 | 0 000 | 0 010 |
下地址????? ???順序執行 SCC SC ?備用SST? 無 ??????+S?? ??MI2-0 ?A口?? ?B口 ?SCI SSH ?SA DC1 SB DC2
? ???????????????????????????????????????? ??????????????????????存儲器讀
?
DC2 :在本條微碼中,地址寄存器接收,故 DC2 為 010
DC1 :未向 IB 總線發送控制,故 DC1 為 000
SA :作 Am2901
SB :作 Am2901
SSH :未移位
SCI :未進位
B 口:未使用寄存器,故為 0
A 口:未使用寄存器,故為 0
MI2-0 :此時 ALU 的 R 端輸入為 D (外部數據), S 端輸入為 0
MI5-3 :運算功能選擇為“ +S ”,即執行 D+0
BI8-6 :沒有返回值,? Y 的輸出選擇為 F
MI0# , REQ , WE# :三位用于控制內外數據總線的讀和寫,此處為存儲器讀,故取 001
SST :未用狀態,故為 000
備用位為 0
SC??? 未用條件碼,故為 0
SCC
Am2901 命令: 14# 命令,即為順序執行
下地址:由于順序執行,并未使用下地址,故下地址為 0
?
(6) ?MEM-Q->Q: ? 0000 0E01 02E0 0000
?
?
0?? 0??? 0??? E??? 0??? 1??? 0???? 2??? E??? 0??? 0??? 0???? 0??? 0
| 0000 | 0000 | 0000 | 1110 | 000 0 | 0 001 | 0 000 | 0 010 | 1 111 | 0000 | 0000 | 00 00 | 0 000 | 0 000 |
下地址????? ???順序執行 SCC SC ?備用SST? F->B ???S-R? ???MI2-0 ?A口?? ?B口 ?SCI SSH ?SA DC1 SB DC2
? ???????????????????????????????????????? ??????????????????????存儲器讀
?
DC2 :在本條微碼中,寄存器未接收,故 DC2 為 000
DC1 :未向 IB 總線發送控制,故 DC1 為 000
SA :作 Am2901
SB :作 Am2901
SSH :未移位
SCI :未進位
B 口:未使用寄存器,故為 0
A 口:未使用寄存器,故為 0
MI2-0 :此時 ALU 的 R 端輸入為 D (外部數據), S 端輸入為 Q
MI5-3 :運算功能選擇為“ S-R ”,即執行 Q-D
BI8-6 :有返回值 0 ,而 Y 的輸出選擇為 F?? ,故此處為 000
MI0# , REQ , WE# :三位用于控制內外數據總線的讀和寫,此處為讀出內存單元內容,將其與 Q 寄存器中內容相加,故取 001
SST :狀態保存,故為 001
備用位為 0
SC????? 未用條件碼,故為 0
SCC
Am2901 命令: 14# 命令,即為順序執行
下地址:由于順序執行,并未使用下地址,故下地址為 0
(7) ??R7->AR: 0000 0E00 9047 0002
?
0?? 0??? 0??? E??? 0??? 0??? 9???? 0??? 4??? 7??? 0??? 0???? 0??? 2
| 0000 | 0000 | 0000 | 1110 | 000 0 | 0 000 | 1 001 | 0 000 | 0 100 | 0111 | 0000 | 00 00 | 0 000 | 0 010 |
下地址????? ???順序執行 SCC SC ?備用SST? 無 ??????+S?? ??MI2-0 ?A口?? ?B口 ?SCI SSH ?SA DC1 SB DC2
? ???????????????????????????????????????? ??????????????????????存儲器讀
?
DC2 :在本條微碼中,地址寄存器接收,故 DC2 為 010
DC1 :未向 IB 總線發送控制,故 DC1 為 000
SA :作 Am2901
SB :作 Am2901
SSH :未移位
SCI :未進位
B 口:使用了寄存器 R7 ,即程序計數器 PC
A 口:未使用寄存器,故為 0
MI2-0 :此時 ALU 的 R 端輸入為 0 , S 端輸入為 A
MI5-3 :運算功能選擇為“ +S ”,即執行 +1 功能
BI8-6 :有返回值,且返回值返回至 B ,而 Y 的輸出選擇為 F
MI0# , REQ , WE# :三位用于控制內外數據總線的讀和寫,此處不操作,故取 10X
SST :未用狀態,故為 000
備用位為 0
SC????? 未用條件碼,故為 0
SCC
Am2901 命令: 14# 命令,即為順序執行
下地址:由于順序執行,并未使用下地址,故下地址為 0
?
?
(8) ?Q→MEM,CC#=0, 3#, A4H:0029?0300 1020 0010
?
2?? 9??? 0??? 3??? 0? ??0??? 1???? 0??? 2??? 0??? 0??? 0???? 1??? 0
| 0010 | 1001 | 0000 | 0011 | 000 0 | 0 000 | 0 001 | 0 000 | 0 010 | 0000 | 0000 | 00 00 | 0 001 | 0 000 |
下地址????? ???順序執行 SCC SC ?備用SST? 無 ??????+S?? ??MI2-0 ?A口?? ?B口 ?SCI SSH ?SA DC1 SB DC2
? ???????????????????????????????????????? ??????????????????????存儲器讀
?
DC2 :在本條微碼中,,寄存器未接收,故 DC2 為 000
DC1 :向 IB 總線發送運算器的指令,故 DC1 為 001
SA :作 Am2901
SB :作 Am2901
SSH :未移位
SCI :未進位
B 口:未使用寄存器,故為 0
A 口:未使用寄存器,故為 0
MI2-0 :此時 ALU 的 R 端輸入為 0 , S 端輸入為 Q
MI5-3 :運算功能選擇為“ +S ”,即執行 0+Q
BI8-6 :沒有返回值, Y 的輸出選擇為 F
MI0# , REQ , WE# :用于控制內外數據總線的讀和寫,此處為將 Q 寄存器中值寫入內存單元,故取 000
SST :未用狀態,故為 000
備用位為 0
SC? ??此處低電平有效,故取 SCC 為 000 , SC 為 0
SCC
Am2901 命令: 3# 命令,即為條件轉移,低電平有效,有效時,轉入下地址
下地址:此命令為最后一條命令,若指令跳轉,將轉入 A4H ,即下地址為 29
?
2.2
(2)把用絕對地址表示的內存單元ADDR2中的內容傳送至地址為ADDR1的內存單元中保存。
指令格式:E0××,ADDR1,ADDR2,三字指令(控存入口130H)
功能:??? [ADDR1]←[ADDR2]
?
?
畫出微指令流程圖
?
微指令詳細設計:
PC->AR,PC+1->PC:???? 0000 0E00 A0B5 5402?? 為讀取第1個操作數的地址做準備
MEM -> AR, MEM->R7:? 0000 0E00 30F0 7002?? 將指令地址送AR(ADDR1),R7寄存器
PC->AR,PC+1->PC:???? 0000 0E00 A0B5 5402?? 為讀取第2個操作數的地址做準備
MEM->AR:???????????? 0000 0E00 10F0 0002?? 將指令地址送AR(ADDR2)
MEM->Q: ???????????? ?0000 0E00 00F0 0000?? 將內存單元中的數據送入Q寄存器
R7->AR:????????????? 0000 0E00 9047 0002?? 把ADDR1的地址R7送入AR中
Q→MEM,CC#=0,3#,A4H:? 0029 0300 1020 0010?? 將結果送入ADDR1中
?
(1) ?PC→AR,PC+1→PC:0000? 0E00? A0B5 ?5402
?
0?? 0??? 0??? E??? 0??? 0??? A???? 0??? B??? 5??? 5??? 4???? 0??? 2
| 0000 | 0000 | 0000 | 1110 | 000 0 | 0 000 | 1 010 | 0 000 | 1 011 | 0101 | 0101 | 01 00 | 0 000 | 0 010 |
下地址????? ???順序執行 SCC SC ?備用SST? F->B??? +S?? ??MI2-0 ?A口?? ?B口 ?SCI SSH ?SA DC1 SB DC2
? ???????????????????????????????????????? ??????????????????????不操作?
?
DC2 :在本條微碼中,地址寄存器接收,故 DC2 為 010
DC1 :未向 IB 總線發送控制,故 DC1 為 000
SA :作 Am2901
SB :作 Am2901
SSH :未移位
SCI :未進位
B 口:使用了寄存器 R5 ,即程序計數器 PC
A 口:使用了寄存器 R5 ,即程序計數器 PC
MI2-0 :此時 ALU 的 R 端輸入為 0 , S 端輸入為 B
MI5-3 :運算功能選擇為“ +S ”,即執行 +1 功能
BI8-6 :有返回值,且返回值返回至 B ,而 Y 的輸出選擇為 A
MI0# , REQ , WE# :三位用于控制內外數據總線的讀和寫,此處不操作,故取 10X
SST :未用狀態,故為 000
備用位為 0
SC? ????未用條件碼,故為 0
SCC
Am2901 命令: 14# 命令,即為順序執行
下地址:由于順序執行,并未使用下地址,故下地址為 0
?
(2) ?MEM -> AR, MEM->R7:0000 0E00 30F0 7002
?
0?? 0??? 0??? E??? 0??? 0??? 3???? 0??? F??? 0??? 7??? 0???? 0??? 2
| 0000 | 0000 | 0000 | 1110 | 000 0 | 0 000 | 0 011 | 0 000 | 1 111 | 0000 | 0111 | 00 00 | 0 000 | 0 010 |
下地址????? ???順序執行 SCC SC ?備用SST? F->B??? +S?? ??MI2-0 ?A口?? ?B口 ?SCI SSH ?SA DC1 SB DC2
? ?????????????????????? ??????????????????????存儲器讀
?
DC2 :在本條微碼中,地址寄存器接收,故 DC2 為 010
DC1 :未向 IB 總線發送控制,故 DC1 為 000
SA :作 Am2901
SB :作 Am2901
SSH :未移位
SCI :未進位
B 口:使用了寄存器 R7 ,即程序計數器 PC
A 口:未使用寄存器,故為 0
MI2-0 :此時 ALU 的 R 端輸入為 D (外部數據), S 端輸入為 0
MI5-3 :運算功能選擇為“ +S ”,即執行 D+0
BI8-6 :有返回值,且返回值返回至 B ,而 Y 的輸出選擇為 F
MI0# , REQ , WE# :三位用于控制內外數據總線的讀和寫,此處不操作,故取 10X
SST :未用狀態,故為 000
備用位為 0
SC? ????未用條件碼,故為 0
SCC
Am2901 命令: 14# 命令,即為順序執行
下地址:由于順序執行,并未使用下地址,故下地址為 0
?
?
(3) ?PC→AR,PC+1→PC:0000?0E00 A0B5 5402
與第一條指令相同
(4) ?MEM→AR:0000?0E00 10F0 0002
?
0?? 0??? 0??? E??? 0??? 0??? 1???? 0??? F??? 0??? 0??? 0???? 0??? 2
| 0000 | 0000 | 0000 | 1110 | 000 0 | 0 000 | 0 001 | 0 000 | 1 111 | 0000 | 0000 | 00 00 | 0 000 | 0 010 |
下地址????? ???順序執行 SCC SC ?備用SST? 無 ??????+S?? ??MI2-0 ?A口?? ?B口 ?SCI SSH ?SA DC1 SB DC2
? ???????????????????????????????????????? ??????????????????????存儲器讀
?
DC2 :在本條微碼中,地址寄存器接收,故 DC2 為 010
DC1 :未向 IB 總線發送控制,故 DC1 為 000
SA :作 Am2901
SB :作 Am2901
SSH :未移位
SCI :未進位
B 口:未使用寄存器,故為 0
A 口:未使用寄存器,故為 0
MI2-0 :此時 ALU 的 R 端輸入為 D (外部數據), S 端輸入為 0
MI5-3 :運算功能選擇為“ +S ”,即執行 D+0
BI8-6 :沒有返回值,? Y 的輸出選擇為 F
MI0# , REQ , WE# :三位用于控制內外數據總線的讀和寫,此處為存儲器讀,故取 001
SST :未用狀態,故為 000
備用位為 0
SC??? 未用條件碼,故為 0
SCC
Am2901 命令: 14# 命令,即為順序執行
下地址:由于順序執行,并未使用下地址,故下地址為 0
?
(5) ?MEM→Q:0000?0E00 00F0 0000
?
0?? 0??? 0??? E??? 0??? 0??? 0???? 0??? F??? 0??? 0??? 0???? 0??? 0
| 0000 | 0000 | 0000 | 1110 | 000 0 | 0 000 | 0 000 | 0 000 | 1 111 | 0000 | 0000 | 00 00 | 0 000 | 0 000 |
下地址????? ???順序執行 SCC SC ?備用SST? F->B ???+S?? ??MI2-0 ?A口?? ?B口 ?SCI SSH ?SA DC1 SB DC2
? ???????????????????????????????????????? ??????????????????????存儲器讀
?
DC2 :在本條微碼中,寄存器未接收,故 DC2 為 000
DC1 :未向 IB 總線發送控制,故 DC1 為 000
SA :作 Am2901
SB :作 Am2901
SSH :未移位
SCI :未進位
B 口:未使用寄存器,故為 0
A 口:未使用寄存器,故為 0
MI2-0 :此時 ALU 的 R 端輸入為 D (外部數據), S 端輸入為 0
MI5-3 :運算功能選擇為“ +S ”,即執行 D+0
BI8-6 :有返回值 0 ,而 Y 的輸出選擇為 F?? ,故此處為 000
MI0# , REQ , WE# :三位用于控制內外數據總線的讀和寫,此處為讀出內存單元內容,并將其送入 Q 寄存器,故取 001
SST :未用狀態,故為 000
備用位為 0
SC???? 未用條件碼,故為 0
SCC
Am2901 命令: 14# 命令,即為順序執行
下地址:由于順序執行,并未使用下地址,故下地址為 0
?
(6) ??R7->AR: 0000 0E00 9047 0002
?
0?? 0??? 0??? E??? 0??? 0??? 9?? ??0??? 4??? 7??? 0??? 0???? 0??? 2
| 0000 | 0000 | 0000 | 1110 | 000 0 | 0 000 | 1 001 | 0 000 | 0 100 | 0111 | 0000 | 00 00 | 0 000 | 0 010 |
下地址????? ???順序執行 SCC SC ?備用SST? 無 ??????+S?? ??MI2-0 ?A口?? ?B口 ?SCI SSH ?SA DC1 SB DC2
? ???????????????????????????????????????? ??????????????????????存儲器讀
?
DC2 :在本條微碼中,地址寄存器接收,故 DC2 為 010
DC1 :未向 IB 總線發送控制,故 DC1 為 000
SA :作 Am2901
SB :作 Am2901
SSH :未移位
SCI :未進位
B 口:使用了寄存器 R7 ,即程序計數器 PC
A 口:未使用寄存器,故為 0
MI2-0 :此時 ALU 的 R 端輸入為 0 , S 端輸入為 A
MI5-3 :運算功能選擇為“ +S ”,即執行 +1 功能
BI8-6 :有返回值,且返回值返回至 B ,而 Y 的輸出選擇為 F
MI0# , REQ , WE# :三位用于控制內外數據總線的讀和寫,此處不操作,故取 10X
SST :未用狀態,故為 000
備用位為 0
SC????? 未用條件碼,故為 0
SCC
Am2901 命令: 14# 命令,即為順序執行
下地址:由于順序執行,并未使用下地址,故下地址為 0
?
?
(7) ?Q→MEM,CC#=0, 3#, A4H:0029?0300 1020 0010
?
2?? 9??? 0??? 3??? 0??? 0??? 1???? 0??? 2? ??0??? 0??? 0???? 1??? 0
| 0010 | 1001 | 0000 | 0011 | 000 0 | 0 000 | 0 001 | 0 000 | 0 010 | 0000 | 0000 | 00 00 | 0 001 | 0 000 |
下地址????? ???順序執行 SCC SC ?備用SST? 無 ??????+S?? ??MI2-0 ?A口?? ?B口 ?SCI SSH ?SA DC1 SB DC2
? ???????????????????????????????????????? ??????????????????????存儲器讀
?
DC2 :在本條微碼中,,寄存器未接收,故 DC2 為 000
DC1 :向 IB 總線發送運算器的指令,故 DC1 為 001
SA :作 Am2901
SB :作 Am2901
SSH :未移位
SCI :未進位
B 口:未使用寄存器,故為 0
A 口:未使用寄存器,故為 0
MI2-0 :此時 ALU 的 R 端輸入為 0 , S 端輸入為 Q
MI5-3 :運算功能選擇為“ +S ”,即執行 0+Q
BI8-6 :沒有返回值, Y 的輸出選擇為 F
MI0# , REQ , WE# :用于控制內外數據總線的讀和寫,此處為將 Q 寄存器中值寫入內存單元,故取 000
SST :未用狀態,故為 000
備用位為 0
SC??? 此處低電平有效,故取 SCC 為 000 , SC 為 0
SCC
Am2901 命令: 3# 命令,即為條件轉移,低電平有效,有效時,轉入下地址
下地址:此命令為最后一條命令,若指令跳轉,將轉入 A4H ,即下地址為 29
?
2.3
(3)轉移指令。判斷兩個通用寄存器內容是否相等,若相等則轉移到指定目的地址,否則順序執行。
指令格式:E5 DR SR,DISP 雙字指令(控存入口140H,? DISP為相對轉移地址偏移量)
功能:??? if? DR=SR goto? IP+DISP? else 順序執行。
?
畫出微指令流程圖
?
?
?
?
微指令詳細設計:
?
?
SR-DR: ???0000 0E01 9190 0088?? 兩者相減,若相等CC#=Z=1
PC→AR,PC+1→PC,CC#=CND:???? 0029 03E0 A0B5 5402? 判斷相等,相等跳轉IP+DISP,否則順序執行。
MEM+R6→PC:?? ?0029 03E0 20D6 5000? :把一個內存賦值
?
?
(1) ?SR-DR: ???0000 0E01 9190 0088
?
0?? 0??? 0??? E??? 0??? 1??? 9???? 1??? 9??? 0??? 0??? 0???? 8??? 8
| 0000 | 0000 | 0000 | 1110 | 000 0 | 0 001 | 1 001 | 0 001 | 1 001 | 0000 | 0000 | 00 00 | 1 000 | 1 000 |
下地址????? ???順序執行 SCC SC ?備用SST? 無 ??????S-R? ??MI2-0 ?A口?? ?B口 ?SCI SSH ?SA DC1 SB DC2
? ???????????????????????????????????????? ??????????????????????存儲器讀
?
DC2 :在本條微碼中,寄存器未接收,故 DC2 為 000
DC1 :未向 IB 總線發送控制,故 DC1 為 000
SA :用指令給 ALU 的 R 端賦值,故為 1
SB :用指令給 ALU 的 S 端賦值,故為 1
SSH :未移位
SCI :未進位
B 口:未使用寄存器,故為 0
A 口:未使用寄存器,故為 0
MI2-0 :此時 ALU 的 R 端輸入為 A , S 端輸入為 B
MI5-3 :運算功能選擇為“ S-R ”,即執行 SR-DR
BI8-6 :沒有返回值, Y 的輸出選擇為 F
MI0# , REQ , WE# :三位用于控制內外數據總線的讀和寫,此處不進行任何操作,故取 10X
SST :狀態保存,故為 001
備用位為 0
?SC? ??未用條件碼,故為 0
SCC
Am2901 命令: 14# 命令,即為順序執行
下地址:由于順序執行,并未使用下地址,故下地址為 0
?
(2) ?PC→AR,PC+1→PC,CC#=CND:???? 0029 03E0 A0B5 5402
?
2?? 9??? 0??? 3??? E??? 0??? A???? 0??? B??? 5??? 5??? 4???? 0??? 2
| 0010 | 1001 | 0000 | 0011 | 111 0 | 0 000 | 1 010 | 0 000 | 1 011 | 0101 | 0101 | 01 00 | 0 000 | 0 010 |
下地址????? ???順序執行 SCC SC ?備用SST? F->B ????+S ????MI2-0 ?A口?? ?B口 ?SCI SSH ?SA DC1 SB DC2
? ???????????????????????????????????????? ??????????????????????存儲器讀
?
DC2 :在本條微碼中,地址寄存器接收,故 DC2 為 010
DC1 :未向 IB 總線發送控制,故 DC1 為 000
SA :作 Am2901
SB :作 Am2901
SSH :未移位
SCI :未進位
B 口:使用了寄存器 R5 ,即程序計數器 PC
A 口:使用了寄存器 R5 ,即程序計數器 PC
MI2-0 :此時 ALU 的 R 端輸入為 0 , S 端輸入為 B
MI5-3 :運算功能選擇為“ +S ”,即執行 +1 功能
BI8-6 :有返回值,且返回值返回至 B ,而 Y 的輸出選擇為 A
MI0# , REQ , WE# :三位用于控制內外數據總線的讀和寫,此處不操作,故取 10X
SST :未用狀態,故為 000
備用位為 0
SC? ??此處根據 SR-DR 數值是否為 0 判斷 SR 與 DR 是否相等,條件是由指令給出的,所以這里 SCC
SCC? ?為 111 ,而 CC 低電平有效,故 SC 為 0,
Am2901 命令: 3# 命令,即為條件轉移,低電平有效,有效時,轉入下地址
下地址:此命令為最后一條命令,若指令跳轉,將轉入 A4H ,即下地址為 29
?
(3) ?MEM+R6→PC:??? 0029 03E0 20D6 5000
?
2?? 9??? 0??? 3??? E??? 0??? 2???? 0??? D??? 6??? 5??? 0???? 0??? 0
| 0010 | 1001 | 0000 | 0011 | 111 0 | 0 000 | 0 010 | 0 000 | 1 101 | 0110 | 0101 | 00 00 | 0 000 | 0 000 |
下地址????? ???順序執行 SCC SC ?備用SST? F->B ????+S ????MI2-0 ?A口?? ?B口 ?SCI SSH ?SA DC1 SB DC2
? ?????????????????????? ??????????????????????存儲器讀
?
DC2 :在本條微碼中,,寄存器未接收,故 DC2 為 000
DC1 :未向 IB 總線發送控制,故 DC1 為 000
SA :作 Am2901
SB :作 Am2901
SSH :未移位
SCI :未進位
B 口:使用了寄存器 R5 ,即程序計數器 PC ,故為 0101
A 口:使用了寄存器 R6 ,即程序計數器 PC
MI2-0 :此時 ALU 的 R 端輸入為 D( 外部數據 ) , S 端輸入為 Q
MI5-3 :運算功能選擇為“ +S ”,即執行 D+0
BI8-6 :有返回值,且返回值返回至 Q ,而 Y 的輸出選擇為 F
MI0# , REQ , WE# :三位用于控制內外數據總線的讀和寫,此處不操作,故取 10X
SST :未用狀態,故為 000
備用位為 0
SC? ??此處根據 SR-DR 數值是否為 0 判斷 SR 與 DR 是否相等,條件是由指令給出的,所以這里 SCC
SCC? ?為 111 ,而 CC 低電平有效,故 SC 為 0,
Am2901 命令: 3# 命令,即為條件轉移,低電平有效,有效時,轉入下地址
下地址:此命令為最后一條命令,若指令跳轉,將轉入 A4H ,即下地址為 29
?
3.測試程序設計及調試。
3.1
選定指令操作碼,指令格式,設計一條指令,其功能是把用絕對地址表示的內存單元B中的內容減去內存單元A中的內容相加,結果存放在A單元中。
?
把用絕對地址表示的內存單元ADDR2中的內容與內存單元ADDR1中的內容相減,結果存于內存單元ADDR1中。
指令格式:D8××,ADDR1,ADDR2,?? 三字指令(控存入口110H)
功能:??? [ADDR1]=[ADDR2] -[ADDR1]
?
(1)用“E”命令輸入微碼
在命令行提示符狀態下輸入:
E900
?
屏幕上將顯示:
0900:
?
之后繼續輸入:
0000 0E00 A0B5 5402
0000 0E00 30F0 7002
0000 0E00 00F0 0000
0000 0E00 A0B5 5402
0000 0E00 10F0 0002
0000 0E01 02E0 0000
0000 0E00 9047 0002
0029 0300 1020 0010
?
(2)用“A”命令輸入加載微碼的程序
在命令行提示符狀態下輸入:
A800
屏幕將顯示:
0800:
?
之后繼續輸入:
MOV R1,900?? ;微碼在內存中的首地址
MOV R2,8????? ;共8條指令
MOV R3,110?? ;微碼在微控存中的首地址
LDMC???????? ;加載微碼指令
RET
?
(3)用“G”命令運行加載微碼的程序
在命令行提示符狀態下輸入:
G800
?
(4)用“A”命令輸入程序
在命令行提示符狀態下輸入:
A820
?
屏幕將顯示:
0820
?
之后繼續輸入:
MOV R0,0015
MOV [A00],R0
MOV R0,0046
MOV [A01],R0
NOP
NOP
NOP
RET
?
(5)用“E”命令輸入新指令
在命令行提示符狀態下輸入:
E828
?
屏幕將顯示:
0828
?
之后繼續輸入:
D800 0A00 0A01
?
(6)用“G”命令運行程序
在命令行提示符狀態下輸入:
G820
?
(7)用“D”命令察看運行結果
在命令行提示符狀態下輸入:
DA00
?
以下為檢驗過后的截圖:
?
?
?
分析:將立即數0015存入內存單元0A00(ADDR1),將立即數0046存入內存單元0A01(ADDR2);0046-0015=0031即(ADDR2-ADDR1),利用R7所存內存單元地址0A00,使結果存入了0A00,即(ADDR2-ADDR1=ADDR1)。驗證所寫微程序正確。
?
?
3.2
選定指令操作碼,指令格式,設計一條指令,其功能是把用絕對地址表示的內存單元B中的內容存放在A單元中。
?
?
把用絕對地址表示的內存單元ADDR2中的內容傳送至地址為ADDR1的內存單元中保存。
指令格式:E0××,ADDR1,ADDR2,三字指令(控存入口130H)
功能:??? [ADDR1]←[ADDR2]
?
?
(1)用“E”命令輸入微碼
在命令行提示符狀態下輸入:
E900
屏幕上將顯示:
0900:
之后繼續輸入:
?
0000 0E00 A0B5 5402
0000 0E00 30F0 7002
0000 0E00 A0B5 5402
0000 0E00 10F0 0002
0000 0E00 00F0 0000
0000 0E00 9047 0002
0029 0300 1020 0010
?
(2)用“A”命令輸入加載微碼的程序
在命令行提示符狀態下輸入:
A800
?
屏幕將顯示:
0800:
?
之后繼續輸入:
MOV R1,900?? ;微碼在內存中的首地址
MOV R2,7????? ;共7條指令
MOV R3,130?? ;微碼在微控存中的首地址
LDMC???????? ;加載微碼指令
RET
?
(3)用“G”命令運行加載微碼的程序
在命令行提示符狀態下輸入:
G800
?
(4)用“A”命令輸入程序
在命令行提示符狀態下輸入:
A820
?
屏幕將顯示:
0820
?
之后繼續輸入:
MOV R0,0015
MOV [A00],R0
MOV R0,0046
MOV [A01],R0
NOP
NOP
NOP
RET
?
(5)用“E”命令輸入新指令
在命令行提示符狀態下輸入:
E828
?
屏幕將顯示:
0828
?
之后繼續輸入:
E010 0A00 0A01
?
(6)用“G”命令運行程序
在命令行提示符狀態下輸入:
G820
?
(7)用“D”命令察看運行結果
在命令行提示符狀態下輸入:
DA00
?
?
?
?
?
分析:與上題相似,將立即數0015存入內存單元0A00(ADDR1),將立即數0046存入內存單元0A01(ADDR2);利用R7所存內存單元地址0A00,將0A01的內容存入了0A00,即(ADDR2-)ADDR1)。驗證所寫微程序正確。
?
?
?
3.3
(3)轉移指令。判斷兩個通用寄存器內容是否相等,若相等則轉移到指定目的地址,否則順序執行。
指令格式:E5 DR SR,DISP 雙字指令(控存入口140H,? DISP為相對轉移地址偏移量)
功能:?? ?if? DR=SR goto? IP+DISP? else 順序執行。
?
DR!=SR不相等情況時:
用“E”命令輸入微碼
在命令行提示符狀態下輸入:
E900
?
屏幕上將顯示:
0900:
?
之后繼續輸入:
?
0000 0E01 9190 0088
0029 03E0 A0B5 5402
0029 03E0 20D6 5000
在命令行提示符狀態下輸入:
A800
?
屏幕將顯示:
0800:
?
之后繼續輸入:
MOV R1,900?? ;微碼在內存中的首地址
MOV R2,3????? ;共7條指令
MOV R3,140?? ;微碼在微控存中的首地址
LDMC???????? ;加載微碼指令
RET
?
?
(3)用“G”命令運行加載微碼的程序
在命令行提示符狀態下輸入:
G800
?
(4)用“A”命令輸入程序
在命令行提示符狀態下輸入:
A820
?
屏幕將顯示:
0820
?
之后繼續輸入:
MOV R1,0023
MOV R2,0026
NOP
NOP
MOV R1,0026
RET
?
(5)用“E”命令輸入新指令
在命令行提示符狀態下輸入:
E824
?
屏幕將顯示:
0824
?
之后繼續輸入:
E512 ?0828
?
(6)用“G”命令運行程序
在命令行提示符狀態下輸入:
G820
?
(7)用“R”命令察看運行結果
在命令行提示符狀態下輸入:
R
?
?
?
?
分析:DR=SR不相等時,順序執行。立即數R1=0023與R2=0026不相等,則順序執行R1=0026
?
DR=SR相等情況時:
?
用“E”命令輸入微碼
在命令行提示符狀態下輸入:
E900
?
屏幕上將顯示:
0900:
?
之后繼續輸入:
?
0000 0E01 9190 0088
0029 03E0 A0B5 5402
0029 03E0 20D6 5000
在命令行提示符狀態下輸入:
A800
?
屏幕將顯示:
0800:
?
之后繼續輸入:
MOV R1,900?? ;微碼在內存中的首地址
MOV R2,3????? ;共7條指令
MOV R3,140?? ;微碼在微控存中的首地址
LDMC???????? ;加載微碼指令
RET
?
?
(3)用“G”命令運行加載微碼的程序
在命令行提示符狀態下輸入:
G800
?
(4)用“A”命令輸入程序
在命令行提示符狀態下輸入:
A820
?
屏幕將顯示:
0820
?
之后繼續輸入:
MOV R1,0023
MOV R2,0023
NOP
NOP
MOV R1,0026
RET
?
(5)用“E”命令輸入新指令
在命令行提示符狀態下輸入:
E824
?
屏幕將顯示:
0824
?
之后繼續輸入:
E512 ?0828
?
(6)用“G”命令運行程序
在命令行提示符狀態下輸入:
G820
?
(7)用“R”命令察看運行結果
在命令行提示符狀態下輸入:
R
?
?
?
?
分析:當R1(SR)存儲0023H、R2(DR)存儲0023H時,即DR=SR時,程序跳轉至828H(ADDR),所以未運行MOV R1,0026,所以程序運行后R1仍為0023H。而PC=IP+DISP.
?
4.寫出自己在小組中承擔的任務及發揮的作用。
一人獨立完成
四.實驗心得
?? ?本次課程設計,前面雖然不清楚微程序編寫,但是根據實驗三微程序的加法以及網上資料和書中的知識,才了解怎樣設計指令。
?? ?此次課程設計,通過對TEC-2仿真模擬機進行測試,通過3個微指令編寫,更加深入了解了各種指令的執行過程。同時在編寫微指令時,也需要了解計算機的匯編語言,所以本次課設,與匯編語言和計算機組成原理相互聯系,進而進行更深層次的學習。
?? ?實驗相對麻煩,在設計過程中,同學之間進行交流,遇到困難相互解決,有各自的想法。所以本次課設不僅鞏固了微程序設計的方法與思想,同時也學習了同學之間的交流以及互相幫助。
?
參考資料:
百度文庫-信息提示
《計算機組成原理》課程設計---微程序設計_山海一念的博客-CSDN博客_計算機組成原理微程序設計
《計算機組成原理》課程設計報告——TEC-2實驗系統——微程序設計_無限迭代中......-CSDN博客
臭咸魚的缺氧瓶
[計算機組成] TEC-2 課程設計 微碼說明_ckxkexing的博客-CSDN博客
?
總結
以上是生活随笔為你收集整理的计算机组成原理——课程设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 欧拉函数模板
- 下一篇: 题目1362:左旋转字符串(Move!M