《计算机组成原理》课程设计报告——TEC-2实验系统——微程序设计
課程設計任務書:《計算機組成原理》課程設計任務書——TEC-2實驗系統——微程序設計
一、目的和要求
深入了解計算機各種指令的執行過程,以及控制器的組成,指令系統微程序設計的具體知識,進一步理解和掌握動態微程序設計的概念;完成微程序控制的特定功能計算機的指令系統設計和調試。
二、實驗環境
1.??? TEC-2機一臺
2.??? 電腦一臺
3.??? TEC-2模擬軟件一套
三、具體內容
1、分析TEC-2機的功能部件組成,分析TEC-2機支持的指令格式等。
1.TEC-2機的控制器部件的組成
TEC2機控制器部件的關鍵內容包括:
(1)由7片S6116隨機讀寫存儲器芯片組成的56位字長的徽程序控制存儲器,用于存放TEC-2機的微程序。其內容在剛加電時不定,加電后將首先從2片ROM(LS2716芯片)中讀出固化的、用于實現53條機器指令的做程序,經組織后寫入這一控制存器,這一過程稱為裝入微碼。裝入完成后,將從監控程序的零地扯執行指令,完成TEC-2機的啟動過程。這之后,還可以用LDMC指令按規定的辦法向控制存俙器寫入新的微程序,以實現新的機器指令。從簡化邏輯框圖上可以看到,控制存儲器的地址為μRA9~O,讀出的信息送微指令流水線寄存器PLR。
(2)做指令寄存器PLR由7片8位的寄存器芯片(6片LS374和1片LS273)組成,用于存放當前做指令的內容,更具體的說明將在后面給出。
(3)微程序定序器AM2910芯片(其內部結構、引腳信號和運行原理等稍候詳細說明),是做程序控制器中非常關鍵、也是稍微難懂一點的部分。在學習中要正確理解。它的核心功能是依據機器的運行狀態與當前微指令的有關內容等,正確地形成下一條微指令的地址,以保證微程序按要求的微指令序列關系自動地逐條銜接執行。
(4)程序計數器PC和當前指令地址寄存器IP,是用運算器通用寄存器組中的兩個選定的寄存器R5和R6實現的,這在圖上見不到。
(5)指令寄存器IR,用于存放當前正在執行的指令內容。
(6)為AM2910提供輸入地址信號的配套線路,包括
①由兩片S2716ROM芯片組成的MAPROM,它變指令寄存器中的操作碼轉換成一段微程序的入口地;
②由片S125和1片S244組成的接收內部總線的IB9~O信號的選擇門電路,它把由水平板上的開關提供的微指令地址送AM2910的地址輸入端;
③由1片LS125和微指令寄存器的PLR55~48組成的一組地址輸入,把當前微指令中的后續地址B55~46送入AM2910的地址輸入端:請注意,1片LS125(共4位獨立的輸入和輸出端)分成兩組(每組兩位)分別用于②和③兩項用途。
這三組信號均為10位寬,且為互斥關系,分別由AM2910芯片提供的3個互斥控制信號/MAP、/VECT和/PL加以選通。
(7)由AM2910芯片的10位地址輸出信號驅動的配套電路,包括
①由一片LSI75和一片LS374寄存器組構成的記億電路,用于保存當前微指令的地址,其輸出僅送往顯示燈部分,以顯示當前微指令的地址
②由3片LS257(四位的二選一電路)芯片構成的微控存的地址選擇形成電路,它實現在AM2910的10位輸出地址與存儲器地址寄存器的低10位地址之間的選擇,結果送往微控存的地址輸入端,用于完成微控存單元的讀寫操作;選擇信號是Smux。
③與此有關的還有3片計數器芯片1s161組成的地址計數器電路,其輸出(共10位)通過兩片LS244與剛提到的3片LS257的10位輸出形成“線或"關系,用計數器的一個輸出端Y11實現二者之間的選擇,Y11為0時,pRA9pRAO是計數器的輸出信號,提供完成裝入微碼過程的微控存的地址,Y11為1時,表明裝入微碼的過程已結束,微控存的地址uRA9uRA0為3片LS257的輸出信號,以完成機器指令運行過程中的微控存的讀、寫(寫僅用于LDMC指令)操作。
(8)由2片LS2716ROM芯片組成的、固化的微碼保存電路及讀寫控制電路。這是為機器加電后完成裝入微碼所配備的專用線路,除2片LにS2716外,還有前邊提到的3片LS161芯片(計數器),1片LS61芯片,2片LS244、1片Gal20v8、1片LS74、1片LS23和1片LS00.其連接關系在邏輯線路圖(二)的右下部分。
2、TEC-2機支持的指令格式
TEC-2機指令系統,采用6位操作碼,故最多支持64條基本指令,其中53條指令已由設計者實現,微程序固化在ROM芯片中,其余11條留給實驗人員執行實現。
TEC-2機的基本指令格式比較固定。從指令長度區分,有單字指令和雙字指令,用戶也可以實現三字指令;從操作數的個數區分,有無操作數指令、單操作數指令和雙操作數指令;從支持的基本尋址方式區分,有寄存器尋址、寄存器間接尋址、立即數尋址、變址尋址、相對尋址、絕對尋址和堆棧尋址等方式;從指令功能上看,最常用的指令類型和運算是比較齊全的。
為了方便理解和記憶,把TEC-2機的指令格式歸納為如下形式:
單字指令僅用一個指令字。
雙字指令用兩個指令字,此時第二個指令字的內容可能是立即數、一個絕對地址或一個變址位移量。
第一個指令字分為三個主要部分。
最高6位是操作碼。從這個意義上講,TEC-2機的基本指令是固定長度的操作碼結構。最多支持64條基本指令。
中間的兩位,即9、8兩位是條件碼,只能把他用作條件轉移指令的判斷條件。這兩位的值為00、01、10和11時,分別選擇以處理機狀態字中的C、Z、V和S的值作為判斷條件。從這個意義上講,我們也可以認為這兩位是指令的擴展操作碼。由于除了條件轉移指令之外,其余的指令均不使用這兩位,故我們可以用這兩位擴展新的指令,而不會影響原來的指令功能。
最低的8位有多種用法:
(1)這8位用于給出入/出指令的入/出端口地址。例如,已規定第一個串行口地址為80h和81h,第二個串行口地址為82h和83h。并行口、DMA口等都可以被分配幾個合理的地址,以實現入/出接口的各種實驗。
(2)這8位用于給出相對尋址的位移量,其范圍是從-128到+127之間,因此相對地址應在當前指令地址向前向后總共256個字的范圍之內。實現相對地址計算時,這個位移量的最高位用符號位,補碼形式,與16位的當前指令地址(放在IP寄存器中,即增量前的PC值)相加時,這一符號位要擴展到15~8這高8位上去。
(3)這8位被分為兩個4位的字段,用于給出的所用的通用寄存器編號。對雙操作數指令,這里可是給出目的與源兩個操作數所在的寄存器編號。對單操作數指令,只用源或目的中的一個操作數,此時,可能用到某一個4位字段,另一個4位字段不用。需要強調的一點是,寄存器用于給出操作數、操作數地址,或用作變址寄存器。
2、使用TEC-2仿真軟件進行微指令級的設計和調試,完成微程序控制的特定功能計算機的指令設計。
(1)把用絕對地址表示的內存單元ADDR1中的內容與內存單元ADDR2中的內容相加,結果存于內存單元ADDR1中。
指令格式:D8××,ADDR1,ADDR2,?? 三字指令(控存入口110H)
功能:??? [ADDR1]=[ADDR1] + [ADDR2]
畫出微指令流程圖
微指令詳細設計
設計分析:
根據指令的功能和指令格式,先讀取地址ADDR1單元內容暫時放置于Q寄存器中,然后把PC指向的地址給AR,然后再讀取地址ADDR2單元內容,同時與Q寄存器內容相加,結果也暫存放在Q寄存器中,此時進行PC-1→AR操作,將PC指向地址的上一個地址給AR,此時由于地址寄存器AR中存放的是地址ADDR2,因此只要將Q寄存器內容寫入存儲器就可以完成指令功能。此外,微程序中必須實現兩次PC+1→PC操作,才能確保PC的正確走向。
微程序:
PC→AR,PC+1→PC:?? 0000?? 0E00?? A0B5?? 5402
MEM→AR:??????????? 0000?? 0E00?? 10F0?? 0002
MEM→Q:???????????? 0000??? 0E00?? 00F0?? 0000
PC→AR:? ????????????0000??? 0E00?? 90B0?? 5002
MEM→AR:?????????? ?0000??? 0E00?? 10F0?? 0002
MEM+Q→Q:???????? ??0000??? 0E01?? 00E0?? 0000
PC-1→AR:?????????? ??0000?? 0E00?? 91B0?? 5402
PC+1→PC:????? ???????0000?? 0E00?? B0B0?? 5400
MEM→AR:??????????? 0000?? 0E00?? 10F0?? 0002
Q→MEM,CC#=0: ?????????????? 0029?? 0300?? 1020?? 0010
指令分析:
PC→AR,PC+1→PC: 0000 0E00 A0B5 5402? 程序計數器加1,開辟1個內存單元
??? 0???? 0???? ?0???? E????? 0???? ?0???? A??? ?0?? ???B???? 5?? ???5???? ?4?? ??0??? ?2
| 0000 | 0000 | 0000 | 1110 | 0000 | 0000 | 1010 | 0000 | 1011 | 0101 | 0101 | 0100 | 0000 | 0010 |
(B2-B0)DC2:2/GAR地址寄存器接收,故DC2為010
(B6-B4)DC1:未向IB總線發送控制,故DC1為000
(B7)SA=0,作Am2901,即0000
(B3)SB=0,作Am2901,即0000
(B9 B8)SSH:未移位,即00
(B11 B10)SCI:自加1
(B15-B12)B口:使用了寄存器R5,即程序計數器PC,即0101
(B19-B16)A口:使用了寄存器R5,即程序計數器PC,即0101
(B22-B20)MI2-0:此時ALU的R端輸入為0,S端輸入為B
(B26-B24)MI5-3:運算功能選擇為“R+S”,即執行+1功能
(B30-B28)BI8-6:有返回值,且返回值返回至B,而Y的輸出選擇為A
(B31 B27 B23)MI0#,REQ,WE#:三位用于控制內外數據總線的讀和寫,此處不操作,故取10X
(B34-B32)SST:狀態位不需進行判斷,即為000
(B35)備用位為0
(B36)SC?? ?????CC#始終低電平有效,即SC=000,CC=0
(B39-B37)SCC???
(B43-B40)CI3-CI0:Am2901命令第14#命令,即為順序執行
(B55-B44)下地址:由于順序執行,并未使用下地址,故下地址為0
?
MEM→AR:??????? 0000 0E00 10F0 0002? 將指令地址送AR(ADDR1)
? 0????? 0???? 0????? E???? 0????? 0????? 1???? 0 ?????F ????0????? 0????? 0??? ?0??? ??2
| 0000 | 0000 | 0000 | 1110 | 0000 | 0000 | 0001 | 0000 | 1111 | 0000 | 0000 | 0000 | 0000 | 0010 |
(B2-B0)DC2:地址寄存器接收,故DC2為010
(B6-B4)DC1:未向IB總線發送控制,故DC1為000
(B7)SA=0,作Am2901,即0000
(B3)SB= 0,作Am2901,即0000
(B9 B8)SSH:未移位,即00
(B11 B10)SCI:未進位.,即00
(B15-B12)B口:未使用寄存器,故為0000
(B19-B16)A口:未使用寄存器,故為0000
(B22-B20)MI2-0:此時ALU的R端輸入為D(外部數據),S端輸入為0
(B26-B24)MI5-3:運算功能選擇為“R+S”,即執行D+0
(B30-B28)BI8-6:沒有返回值, Y的輸出選擇為F
(B31 B27 B23)MI0#,REQ,WE#:三位用于控制內外數據總線的讀和寫,此處為存儲器讀,故取001
(B34-B32)SST:狀態位不需進行控制,故為000
(B35)備用位為0
(B36)SC? ??????CC#始終低電平有效,即SC=000,CC=0
(B39-B37)SCC???
(B43-B40)CI3-CI0:Am2901命令第14#命令,即為順序執行
(B55-B44)下地址:由于順序執行,并未使用下地址,故下地址為0
[MEM]→Q: 0000 0E00 00F0 0000? 將內存單元中的數據送入Q寄存器
? 0????? 0????? 0?? ??E?? ??0????? 0 ?????0???? 0 ?????F??? ??0? ???0? ????0??? ??0? ???0
| 0000 | 0000 | 0000 | 1110 | 0000 | 0000 | 0000 | 0000 | 1111 | 0000 | 0000 | 0000 | 0000 | 0000 |
(B2-B0)DC2:寄存器未接收,故DC2為000
(B6-B4)DC1:未向IB總線發送控制,故DC1為000
(B7)SA=0,作Am2901,即0000
(B3)SB=0,作Am2901,即0000
(B9 B8)SSH:未移位,為00
(B11 B10)SCI:未進位,為00
(B15-B12)B口:未使用寄存器,故為0000
(B19-B16)A口:未使用寄存器,故為0000
(B22-B20)MI2-0:此時ALU的R端輸入為D(外部數據),S端輸入為0
(B26-B24)MI5-3:運算功能選擇為“R+S”,即執行D+0
(B30-B28)BI8-6:有返回值,且返回值返回至Q,而Y的輸出選擇為F???? ,故此處為000
(B31 B27 B23)MI0#,REQ,WE#:存儲器讀即取001
(B34-B32)SST:狀態位不需進行控制,故為000
(B35)備用位為0
(B36)SC?? ?????CC#始終低電平有效,即為0000
(B39-B37)SCC???
(B43-B40)CI3-CI0:Am2901命令第14#命令,即為順序執行,
(B55-B44)下地址:由于順序執行,并未使用下地址,故下地址為0
PC→AR:? ????????????0000??? 0E00?? 90B0 ?5002??? 開辟1個內存單元
? 0????? 0???? 0????? E???? 0????? 0????? 9???? 0 ?????B ????0????? 5????? 0??? ?0??? ??2
| 0000 | 0000 | 0000 | 1110 | 0000 | 0000 | 1001 | 0000 | 1011 | 0000 | 0101 | 0000 | 0000 | 0010 |
(B2-B0)DC2:2/GAR地址寄存器接收,故DC2為010
(B6-B4)DC1:未向IB總線發送控制,故DC1為000
(B7)SA=0,作Am2901,即0000
(B3)SB=0,作Am2901,即0000
(B9 B8)SSH:未移位,即00
(B11 B10)SCI:未移位,即00
(B15-B12)B口:使用了寄存器R5,即程序計數器PC,即0101
(B19-B16)A口:未使用寄存器,故為0000
(B22-B20)MI2-0:此時ALU的R端輸入為0,S端輸入為B
(B26-B24)MI5-3:運算功能選擇為“R+S”,即執行0+B
(B30-B28)BI8-6:沒有返回值, Y的輸出選擇為F
(B31 B27 B23)MI0#,REQ,WE#:三位用于控制內外數據總線的讀和寫,此處不操作,故取10X
(B34-B32)SST:狀態位不需進行判斷,即為000
(B35)備用位為0
(B36)SC?? ?????CC#始終低電平有效,即SC=000,CC=0
(B39-B37)SCC???
(B43-B40)CI3-CI0:Am2901命令第14#命令,即為順序執行
(B55-B44)下地址:由于順序執行,并未使用下地址,故下地址為0
MEM→AR:?????????? ?0000? ?0E00? 10F0? 0002 將指令地址送AR(ADDR2)
? 0????? 0???? 0????? E???? 0????? 0????? 1???? 0 ?????F ????0????? 0????? 0??? ?0??? ??2
| 0000 | 0000 | 0000 | 1110 | 0000 | 0000 | 0001 | 0000 | 1111 | 0000 | 0000 | 0000 | 0000 | 0010 |
略
MEM+Q→Q:???? ??0000 0E01 00E0 0000 完成加法([ADDR1] + [ADDR2]→Q)
? 0????? 0???? 0????? E???? 0????? 1????? 0???? 0 ?????E ????0????? 0????? 0??? ?0??? ??0
| 0000 | 0000 | 0000 | 1110 | 0000 | 0001 | 0000 | 0000 | 1110 | 0000 | 0000 | 0000 | 0000 | 0000 |
(B2-B0)DC2:寄存器未接收,故DC2為000
(B6-B4)DC1:未向IB總線發送控制,故DC1為000
(B7)SA=0,作Am2901,即0000
(B3)SB=0,作Am2901,即0000
(B9 B8)SSH:未移位,為00
(B11 B10)SCI:未進位,為00
(B15-B12)B口:未使用寄存器,故為0000
(B19-B16)A口:未使用寄存器,故為0000
(B22-B20)MI2-0:此時ALU的R端輸入為D(外部數據),S端輸入為Q
(B26-B24)MI5-3:運算功能選擇為“R+S”,即執行D+Q
(B30-B28)BI8-6:有返回值,且返回值返回至Q,而Y的輸出選擇為F???? ,故此處為000
(B31 B27 B23)MI0#,REQ,WE#:存儲器讀即取001
(B34-B32)SST:狀態位控制,接受ALU的標志位輸出值故為001
(B35)備用位為0
(B36)SC?? ?????CC#始終低電平有效,即為0000
(B39-B37)SCC???
(B43-B40)CI3-CI0:Am2901命令第14#命令,即為順序執行,
(B55-B44)下地址:由于順序執行,并未使用下地址,故下地址為0
PC-1→AR:?????? 0000? 0E00? 91B0 ?5402 將PC指向地址的上一個地址給AR
? 0????? 0???? 0????? E???? 0????? 0??? ??9???? 1 ?????B ????0????? 5????? 4??? ?0??? ??2
| 0000 | 0000 | 0000 | 1110 | 0000 | 0000 | 1001 | 0001 | 1011 | 0000 | 0101 | 0100 | 0000 | 0010 |
(B2-B0)DC2:2/GAR地址寄存器接收,故DC2為010
(B6-B4)DC1:未向IB總線發送控制,故DC1為000
(B7)SA=0,作Am2901
(B3)SB=0,作Am2901
(B9 B8)SSH:未移位,即00
(B11 B10)SCI:自加1
(B15-B12)B口:使用了寄存器R5,即程序計數器PC,即0101
(B19-B16)A口:未使用寄存器,故為0000
(B22-B20)MI2-0:此時ALU的R端輸入為0,S端輸入為B
(B26-B24)MI5-3:運算功能選擇為“S-R”,即執行-1功能
(B30-B28)BI8-6:沒有返回值, Y的輸出選擇為F
(B31 B27 B23)MI0#,REQ,WE#:三位用于控制內外數據總線的讀和寫,此處不操作,故取10X
(B34-B32)SST:狀態位不需進行判斷,即為000
(B35)備用位為0
(B36)SC?? ?????CC#始終低電平有效,即SC=000,CC=0
(B39-B37)SCC???
(B43-B40)CI3-CI0:Am2901命令第14#命令,即為順序執行
(B55-B44)下地址:由于順序執行,并未使用下地址,故下地址為0
PC+1→PC:?????????? ??0000?? 0E00?? B0B0?? 5400 程序計數器加1
? 0????? 0???? 0????? E???? 0????? 0????? B???? 0 ?????B ????0????? 5????? 4??? ?0?? ???0
| 0000 | 0000 | 0000 | 1110 | 0000 | 0000 | 1011 | 0000 | 1011 | 0000 | 0101 | 0100 | 0000 | 0000 |
(B2-B0)DC2:寄存器未接收,故DC2為000
(B6-B4)DC1:未向IB總線發送控制,故DC1為000
(B7)SA=0,作Am2901
(B3)SB=0,作Am2901
(B9 B8)SSH:未移位,即00
(B11 B10)SCI:自加1
(B15-B12)B口:使用了寄存器R5,即程序計數器PC,即0101
(B19-B16)A口:未使用寄存器,故為0000
(B22-B20)MI2-0:此時ALU的R端輸入為0,S端輸入為B
(B26-B24)MI5-3:運算功能選擇為“R+S”,即執行+1功能
(B30-B28)BI8-6:有返回值,且返回值返回至B,而Y的輸出選擇為F
(B31 B27 B23)MI0#,REQ,WE#:三位用于控制內外數據總線的讀和寫,此處不操作,故取10X
(B34-B32)SST:狀態位不需進行判斷,即為000
(B35)備用位為0
(B36)SC?? ?????CC#始終低電平有效,即SC=000,CC=0
(B39-B37)SCC???
(B43-B40)CI3-CI0:Am2901命令第14#命令,即為順序執行
(B55-B44)下地址:由于順序執行,并未使用下地址,故下地址為0
MEM→AR:?????? ??0000?? 0E00?? 10F0?? 0002 將指令地址送AR(ADDR1)
? 0????? 0???? 0????? E???? 0????? 0????? 1???? 0 ?????F ????0????? 0????? 0??? ?0??? ??2
| 0000 | 0000 | 0000 | 1110 | 0000 | 0000 | 0001 | 0000 | 1111 | 0000 | 0000 | 0000 | 0000 | 0010 |
略
Q→MEM,CC#=0:0029 ?0300? 1020 ?0010 將結果送入ADDR3,低電平有效
? 2????? 9????? 0????? 3???? 0????? 0??? ?1??? ??0????? 2?? ??0????? 0????? 0? ???1?? ??0
| 0010 | 1001 | 0000 | 0011 | 0000 | 0000 | 0001 | 0000 | 0010 | 0000 | 0000 | 0000 | 0001 | 0000 |
(B2-B0)DC2:寄存器未接收,故DC2為000
(B6-B4)DC1:向IB總線發送運算器的指令,故DC1為001
(B7)SA=0,作Am2901
(B3)SB=0,作Am2901
(B9 B8)SSH:未移位,即00
(B11 B10)SCI:未進位,即00
(B15-B12)B口:未使用寄存器,故為0000
(B19-B16)A口:未使用寄存器,故為0000
(B22-B20)MI2-0:此時ALU的R端輸入為0,S端輸入為Q
(B26-B24)MI5-3:運算功能選擇為“R+S”,即執行0+Q
(B30-B28)BI8-6:沒有返回值,Y的輸出選擇為F
(B31 B27 B23)MI0#,REQ,WE#:三位用于控制內外數據總線的讀和寫,此處為將Q寄存器中值寫入內存單元,故取000
(B34-B32)SST:未用狀態,故為000
(B35)備用位為0
(B36)SC??????? 此處低電平有效,故取SCC為000,SC為0
(B39-B37)SCC???
(B43-B40)CI3-CI0:Am2901命令第3#命令,即為條件轉移,低電平有效,有效時,轉入下地址
(B55-B44)下地址:此命令為最后一條命令,若指令跳轉,將轉入A4H,即下地址為29
?
?
(2)將一通用寄存器內容減去某內存單元內容,結果放在另一寄存器中。
指令格式:E0 DR SR,ADDR (SR,DR源、目的寄存器各4位)雙字指令(控存入口130H)
功能:??? DR=SR-[ADDR]
畫出微指令流程圖
微指令詳細設計
設計分析:
根據指令的功能和指令格式,先讀取地址ADDR單元內容暫時放置于Q寄存器中,然后再讀取內存單元中的DATA,同時與Q寄存器內容相減,結果存放在DR寄存器中。
微程序:
PC→AR,PC+1→PC: ???? ?????? 0000? 0E00? A0B5 ?5402?
當前程序計數器內容送地址寄存器,為讀取操作數地址做準備;程序計數器指向下一單元地址
MEM→AR:????????????? ???? 0000? 0E00? 10F0?? 0002?
從主存讀取第一個操作數地址送AR,為讀取操作數做準備
SR - MEM →DR:?? ??????? 0029? 0301? 31D0? ?? 0088?
寄存器SR存放的操作數減去ADDR單元內容,并存入DR
指令分析:
PC→AR,PC+1→PC: 0000? 0E00? A0B5? 5402? 程序計數器加1
? 0????? 0????? 0????? E?? ??0????? 0????? A? ???0??? ?B ????5????? 5????? 4? ???0???? ?2
| 0000 | 0000 | 0000 | 1110 | 0000 | 0000 | 1010 | 0000 | 1011 | 0101 | 0101 | 0100 | 0000 | 0010 |
(B2-B0)DC2:在本條微碼中,地址寄存器接收,故DC2為010
(B6-B4)DC1:未向IB總線發送控制,故DC1為000
(B7)SA:為0,作Am2901
(B3)SB:為0,作Am2901
(B9 B8)SSH:未移位
(B11 B10)SCI:未進位
(B15-B12)B口:使用了寄存器R5,即程序計數器PC
(B19-B16)A口:使用了寄存器R5,即程序計數器PC
(B22-B20)MI2-0:此時ALU的R端輸入為0,S端輸入為B
(B26-B24)MI5-3:運算功能選擇為“R+S”,即執行+1功能
(B30-B28)BI8-6:有返回值,且返回值返回至B,而Y的輸出選擇為A
(B31 B27 B23)MI0#,REQ,WE#:三位用于控制內外數據總線的讀和寫,此處不操作,故取10X
(B34-B32)SST:未用狀態,故為000
(B35)備用位為0
(B36)SC??????? 未用條件碼,故為0
(B39-B37)SCC???
(B43-B40)CI3-CI0:Am2901命令第14#命令,即為順序執行
(B55-B44)下地址:由于順序執行,并未使用下地址,故下地址為0
②MEM→AR:?????????????????? 0000? 0E00? 10F0?? 0002? 將指令地址送AR
? 0????? 0????? 0????? E? ???0????? 0?? ??1????? 0???? F?? ???0? ???0?? ???0? ???0???? ?2
| 0000 | 0000 | 0000 | 1110 | 0000 | 0000 | 0001 | 0000 | 1111 | 0000 | 0000 | 0000 | 0000 | 0010 |
(B2-B0)DC2:在本條微碼中,地址寄存器接收,故DC2為010
(B6-B4)DC1:未向IB總線發送控制,故DC1為000
(B7)SA:為0,作Am2901
(B3)SB:為0,作Am2901
(B9 B8)SSH:未移位,即00
(B11 B10)SCI:未進位,即00
(B15-B12)B口:未使用寄存器,故為0
(B19-B16)A口:未使用寄存器,故為0
(B22-B20)MI2-0:此時ALU的R端輸入為D(外部數據),S端輸入為0
(B26-B24)MI5-3:運算功能選擇為“+S”,即執行D+0
(B30-B28)BI8-6:沒有返回值, Y的輸出選擇為F
(B31 B27 B23)MI0#,REQ,WE#:三位用于控制內外數據總線的讀和寫,此處為存儲器讀,故取001
(B34-B32)SST:未用狀態,故為000
(B35)備用位為0
(B36)SC??????? 未用條件碼,故為0
(B39-B37)SCC???
(B43-B40)CI3-CI0:Am2901命令第14#命令,即為順序執行
(B55-B44)下地址:由于順序執行,并未使用下地址,故下地址為0
③SR - MEM →DR:?? 0029? 0301? 31D0? 0088? 完成減法,最后結果送寄存器
? 2????? 9????? 0????? 3??? ??0? ???1? ???3????? 0???? D ?????0? ???0????? 0???? 8? ????8
| 0010 | 1001 | 0000 | 0011 | 0000 | 0001 | 0011 | 0000 | 1101 | 0000 | 0000 | 0000 | 1000 | 1000 |
(B2-B0)DC2:在本條微碼中,,寄存器未接收,故DC2為000
(B6-B4)DC1:未向IB總線發送控制,故DC1為000
(B7)SA:用指令給ALU的R端賦值,故為1
(B3)SB:用指令給ALU的S端賦值,故為1
(B9 B8)SSH:未移位
(B11 B10)SCI:未進位
(B15-B12)B口:未使用寄存器,故為0000
(B19-B16)A口:未使用寄存器,故為0000
(B22-B20)MI2-0:此時ALU的R端輸入為D(外部數據),S端輸入為A,即為101
(B26-B24)MI5-3:運算功能選擇為“S-R”
(B30-B28)BI8-6:有返回值,且返回值返回至B,而Y的輸出選擇為F
(B31 B27 B23)MI0#,REQ,WE#:三位用于控制內外數據總線的讀和寫,此處是讀取內存單元內容,并被SR減,故取001
(B34-B32)SST:由運算帶來的狀態保存,故為001
(B35)備用位為0
(B36)SC???????? 此處低電平有效,故取SCC為000,SC為0
(B39-B37)SCC???
(B43-B40)CI3-CI0:Am2901命令第3#命令,即為條件轉移,低電平有效,有效時,轉入下地址
(B55-B44)下地址:此命令為最后一條命令,若指令跳轉,將轉入A4H,即下地址為29
?
(3)轉移指令。判斷兩個通用寄存器內容是否相等,若不相等則轉移到指定絕對地址,否則順序執行。
指令格式:E9 DR SR,ADDR? 雙字指令(控存入口150H)
功能:??? if? DR!=SR goto? ADDR? else 順序執行。
畫出微指令流程圖
微指令詳細設計
設計設計:
利用指令的CND字段,即IR10~8,令IR10~8=101,即CC=\Z
則當DR==SR時Z=1,微程序不跳轉,接著執行MEM→PC(即ADDR→PC)
而當DR!=SR時Z=0,微程序跳轉至A4。
微程序設計:
DR-SR???????????????? ???????? ?????? 0000 0E01 9190 0088
PC→AR,PC+1→PC,CC#=CND??? ?? 0029 03E0 A0B5 5402
MEM→PC,CC#=0??????????? ??????? 0029 0300 20F0 5000
指令分析:
DR - SR→DR ????????0000? 0E01? 9190? 0088?
SR內容減DR內容,若相等,則標志符Z=1,否則Z=0
??? 0????? 0????? 0???? E??? ?0??? ?1??? ??B???? 1??? ??9????? 0??? ?0?? ???0?? ??8??? ??8
| 0000 | 0000 | 0000 | 1110 | 0000 | 0001 | 1011 | 0001 | 1001 | 0000 | 0000 | 0000 | 1000 | 1000 |
(B2-B0)DC2:在本條微碼中,,寄存器未接收,故DC2為000
(B6-B4)DC1:未向IB總線發送控制,故DC1為000
(B7)SA:用指令給ALU的R端賦值,故為1
(B3)SB:用指令給ALU的S端賦值,故為1
(B9 B8)SSH:未移位
(B11 B10)SCI:未進位
(B15-B12)B口:未使用寄存器,故為0000
(B19-B16)A口:未使用寄存器,故為0000
(B22-B20)MI2-0:此時ALU的R端輸入為A,S端輸入為B,即為001
(B26-B24)MI5-3:運算功能選擇為“S-R”
(B30-B28)BI8-6:有返回值,且返回值返回至B,而Y的輸出選擇為F
(B31 B27 B23)MI0#,REQ,WE#:三位用于控制內外數據總線的讀和寫,此處不操作,故取10X
(B34-B32)SST:由運算帶來的狀態保存,故為001
(B35)備用位為0
(B36)SC???????? 此處低電平有效,故取SCC為000,SC為0
(B39-B37)SCC???
(B43-B40)CI3-CI0:由于順序執行,并未使用下地址,故下地址為0
PC→AR,PC+1→PC,CC#=CND??? ?0029? 03E0? A0B5? 5402
當前程序計數器內容送地址寄存器,條件轉移信號CC#=CND,即判斷Z是否為1,若為0則中斷條件成立;程序計數器指向下一單元地址
?? ?2???? 9???? 0????? 3??? ??E???? ?0???? A???? 0???? ?B???? 5???? 5????? 4????? 0???? 2
| 0010 | 1001 | 0000 | 0011 | 1110 | 0000 | 1010 | 0000 | 1011 | 0101 | 0101 | 0100 | 0000 | 0010 |
((B2-B0)DC2:2/GAR地址寄存器接收,故DC2為010
(B6-B4)DC1:未向IB總線發送控制,故DC1為000
(B7)SA=0,作Am2901
(B3)SB=0,作Am2901
(B9 B8)SSH:未移位
(B11 B10)SCI:自加1
(B15-B12)B口:使用了寄存器R5,即程序計數器PC,即0101
(B19-B16)A口:使用了寄存器R5,即程序計數器PC,即0101
(B22-B20)MI2-0:此時ALU的R端輸入為0,S端輸入為B
(B26-B24)MI5-3:運算功能選擇為“R+S”,即執行+1功能
(B30-B28)BI8-6:有返回值,且返回值返回至B,而Y的輸出選擇為A
(B31 B27 B23)MI0#,REQ,WE#:三位用于控制內外數據總線的讀和寫,此處不操作,故取10X
(B34-B32)SST:狀態位不需進行判斷,即為000
(B35)備用位為0
(B36)SC???? 用到IR10-8則SC置0??
(B39-B37)SCC? 題中需要用到IR10-8所以SCC選擇7則為111?
(B43-B40)CI3-CI0:Am2901命令第3#命令,即為條件轉移
?? (B55-B44)下地址:由于條件轉移,若判斷相等,則順序執行,若不相等,則指令跳轉,將轉入A4H,即下地址為29
MEM→PC,CC#=0 ????????0029? 0300? 30F0? 5000
取內存單元ADDR中的地址送PC
?? 2? ????9???? ?0???? 3??? ??0????? 0???? 2???? ?0????? F???? 0???? 5????? 0??? ??0???? 0
| 0010 | 1001 | 0000 | 0011 | 0000 | 0000 | 0010 | 0000 | 1111 | 0000 | 0101 | 0000 | 0000 | 0000 |
(B2-B0)DC2:在本條微碼中,,寄存器未接收,故DC2為000
(B6-B4)DC1:未向IB總線發送控制,故DC1為000
(B7)SA=0,作Am2901
(B3)SB=0,作Am2901
(B9 B8)SSH:未移位
(B11 B10)SCI:未進位
(B15-B12)B口:使用了寄存器R5,即程序計數器PC,即0101
(B19-B16)A口:未使用寄存器,故為0000
(B22-B20)MI2-0:R端數據來自主存(外部),S端為0,即為111
(B26-B24)MI5-3:運算功能選擇為“S+R”
(B30-B28)BI8-6:有返回值,且返回值返回至B,而Y的輸出選擇為A
(B31 B27 B23)MI0#,REQ,WE#:三位用于控制內外數據總線的讀和寫,此處不操作,故取10X
(B34-B32)SST:由運算帶來的狀態保存,故為001
(B35)備用位為0
(B36)SC???????? 此處低電平有效,故取SCC為000,SC為0
(B39-B37)SCC???
(B43-B40)CI3-CI0:Am2901命令第3#命令,即為條件轉移
(B55-B44)下地址: 此命令為最后一條命令,若指令跳轉,將轉入A4H,即下地址為29
?
3、測試程序設計及調試。
(1)
(一)用E命令輸入微碼:(將微碼輸入到由900H開始的內存單元中)
0000?0E00?A0B5?5402?0000?
0E00?10F0?0002?0000?0E00?
00F0?0000?0000?0E00?90B0?
5002?0000?0E00?10F0?0002?
0000?0E01?00E0?0000?0000?
0E00?91B0?5402?0000?0E00?
B0B0?5400?0000?0E00?10F0?
0002?0029?0300?1020?0010
(二)用D命令查看輸入的微碼:
(三)用A命令輸入加載微碼的程序:(將微碼加載到微控存中)
>A800?????????? ;TEC-2機主存儲器中RAM地址分配為0800H-0FFFH
0800: MOV R1,900 ;微碼在內存中的首地址
0802: MOV R2,10? ;共10條微指令
0804: MOV R3,100;微碼在微控存中的首地址,題目規定為100H
0806: LDMC???? ;加載微碼指令
0807: RET?????? ;返回
0808:
(四)用G命令運行加載微碼的程序:
>G800
(五)用A命令輸入程序:
>A820
0820: MOV R0,0023 ;將立即數23賦給寄存器R0
0822: MOV R1,0020 ;將立即數20賦給寄存器R1
0824: MOV [A00],R0;將寄存器R0中數據賦值給內存單元0A00
0826: MOV [A01],R1;將寄存器R0中數據賦值給內存單元0A01
0828: NOP??????? ;NOP起等待作用,因為指令占四個字節,所以用4個NOP
0829: NOP
082A: NOP
082B: ?RET?????? ;返回\
(六)用E命令輸入新指令:
>E828;因為第一個空操作的地址是0A00所以此處輸入0A01
0828??? 0000:D400? 0000:0A00? 0000:0A01?
(七)用U命令查看輸入的程序:(反編譯觀察操作過程)
>U820?????????????????????????????????????? ;查看
(八)用“G”命令運行程序:
>G820?????????????????????????????????????? ;運行
(九)用“D”命令查看運行結果:
? 在命令行提示符狀態下輸入:
?? DA00 (回車)
R
(2)
(一)用E命令輸入微碼:(將微碼輸入到由900H開始的內存單元中)
>E900
0900??? 0000:0000? 0000:0E00? 0000:A0B5? 0000:5402? 0000:0000
0905??? 0000:0E00? 0000:10F0? 0000:0002? 0000:0029? 0000:0301
090A??? 0000:31D0? 0000:0088
;將微程序的16進制代碼輸入到從900H開始的內存單元中
(二)用D命令查看輸入的微碼:
>D900 ??;查看單元內容是否正確
(三)用A命令輸入加載微碼的程序:(將微碼加載到微控存中)
>A800
0800: MOV R1,900?????????????????????????? ;微碼在內存中的首地址為900H
0802: MOV R2,3??????????????????????? ;微程序一共有9條微指令
0804: MOV R3,130?????????????????????????? ;微碼加載到微控存中的首地址
0806: LDMC????????????????????????????? ;加載微碼指令
0807: RET???????????????????????????????? ;返回
0808:
(四)用G命令運行加載微碼的程序:
>G800?????????????????????????????????????? ;執行加載微碼程序
(五)用A命令輸入程序:
>A820
0820: MOV R0,0023?????????????????? 將減數放到通用寄存器R0
0822: MOV R3,0027?????????????????? 將被減數放到通用寄存器R3
0824: MOV [A00],R0???????????????? 將R0中減數放到0A00單元
0826: NOP
0827: NOP
0828: RET
0829:
(六)用E命令輸入新指令:
>E826??????????????????????????????????????
;編輯0826開始到0827單元,將新指令輸入,其中SR為R3, DR為R2
0826??? 0000:E023? 0000:0A00
(七)用U命令查看輸入的程序:(反編譯觀察操作過程)
>U820?????????????????????????????????????? ;查看
(八)用“G”命令運行程序:
>G820?????????????????????????????????????? ;運行
(九)用“D”命令查看運行結果:
? 在命令行提示符狀態下輸入:
DA00 (回車)
R
(3)
(一)用E命令輸入微碼:(將微碼輸入到由900H開始的內存單元中)
>E900
0900??? 0000:0000? 0000:0E01? 0000:9190? 0000:0088? 0000:0029
0905??? 0000:03E0? 0000:A0B5? 0000:5402? 0000:0029? 0000:0300
090A??? 0000:20F0? 0000:5000
(二)用D命令查看輸入的微碼:
(三)用A命令輸入加載微碼的程序:(將微碼加載到微控存中)
>A800
0800: MOV R1,900
0802: MOV R2,3
0804: MOV R3,140
0806: LDMC
0807: RET
0808:
(四)用G命令運行加載微碼的程序:
>G800?????????????????????????????????????? ;執行加載微碼程序
(五)用A命令輸入程序:
兩數相等時;
>A820
0820: MOV R1,0026
0822: MOV R2,0026
0824: NOP
0825: NOP
0826: MOV R1,0023
0828: RET
0829:
(六)用E命令輸入新指令:
>E824
0824??? 0000:E512? 0000:0828
(七)用U命令查看輸入的程序:(反編譯觀察操作過程)
>U820
(八)用“G”命令運行程序:
>G820
(九)用“D”命令查看運行結果:
? 在命令行提示符狀態下輸入:
R
(五)*用A命令輸入程序:
兩數不相等時:
>A820
0820: MOV R1,0025
0822: MOV R2,0024
0824: NOP
0825: NOP
0826: MOV R1,0023
0828: RET
0829:
(六)*用E命令輸入新指令:
>E824
0824??? 0000:E512? 0000:0828
(七)*用U命令查看輸入的程序:(反編譯觀察操作過程)
>U820
(八)用“G”命令運行程序:
>G820
(九)用“D”命令查看運行結果:
? 在命令行提示符狀態下輸入:
R
4、寫出自己在小組中承擔的任務及發揮的作用。
一人獨立完成
?
四、實驗心得
這個課程設計是對整個學期對計算機組成原理學習的回顧,由于書中內容較多,剛開始時,有點云里霧里的感覺。并且由于對微程序控制器的組成和工作原理不了解,導致覺得實驗非常的難,不知從何下手,后來雖然仔細的看了一遍書,又認真聽老師把原理說了一遍,但還是不太知道怎么做,只是大致了解了微程序控制器是如何工作的,后來通過一個微程序設計實例的講解,才基本上知道了該如何設計指令。因為設計微碼要求對運算器、控制器都要有很深的了解,不僅僅是照著書本上的步驟去做,而是要真真正正去設計一些計算機能運行的最底層的指令,因此,做這個課程設計要在短時間內突擊是很困難的,需要平時注意聽老師講的細節上的問題。比如,AM2901外部數據只能從A口進入,結果回存只能通過B口等老師常常強調的,如果沒有注意,實驗起來就會很麻煩。設計過程中與同學有不少的交流,遇到難于理解的地方時就會相互交流各自的想法。
在之前做微程序控制實驗的時候,其實還有一些地方很模糊,比如為什么測試新指令的時候要輸入一定數量的NOP空操作,新指令和程序在運行時是怎么聯系在一起的,下地址字段的意義,等等。但是通過課程設計,更推動了我對這些問題加深了解,對計算機的運行原理比之前要更加透徹了。從這一次實驗中印證一個道理只有通過實踐才能真正的掌握一門知識。
參考文章
https://blog.csdn.net/qq_43594913/article/details/106735166
http://blog.sina.com.cn/s/blog_6392df880100j7ro.html
https://wenku.baidu.com/view/952dc0f648649b6648d7c1c708a1284ac850059f.html
https://blog.csdn.net/denglaiyou4326/article/details/102433098/
總結
以上是生活随笔為你收集整理的《计算机组成原理》课程设计报告——TEC-2实验系统——微程序设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《计算机网络》实验报告——使用SNORT
- 下一篇: 基于计算机网络的可持续发展信息共享情况调