【題目】
某計算機字長爲16位,採用16位定長指令字結構,部分數據桐廬結構如下圖所示。圖中所有控制信號爲1時表示有效,爲0則無效。如控制信號MDRinE爲1表示允許數據從DB打入MDR,MDRin爲1表示允許數據從總線打入MDR。假設MAR的輸出一直處於使能狀態。加法指令“ADD(R1),R0”的功能爲(R0)+((R1))->(R1),即將R0中的數據與R1的內容所指主存單元的數據相加,並將結構送入R1的內容所指向主存單元中保存。
下表給出了上述指令取指和譯碼階段每個節拍(時鐘週期)的功能和有效控制信號,請按表中描述方式用表格列出指令執行階段每個節拍的功能和有效控制信號。
時鐘 |
功能 |
有效控制信號 |
C1 |
MAR<-(PC) |
PCout,MARin |
C2 |
MDR<-M(MAR) PC<-(PC)+1 |
MemR,MDRinE,PC+1 |
C3 |
IR<-(MDR) |
MDRout,IRin |
C4 |
指令譯碼 |
無 |
【解析】取指令的功能是根據PC的內容所指的主存地址,取出指令代碼,經過MDR,最終送到IR。這部分和後面的指令執行階段的取操作數、存運算結果的方法是相通的。(無論是取還是輸出都是要先搞到MDR)
C1:(PC)->MAR
在讀寫存儲器前,必須先將地址(這裏爲(PC))送至MAR.
C2:M(MAR)->MDR,(PC)+1->PC
讀寫的數據必須經過MDR,指令取出後PC自增1.
C3:(MDR)->IR
然後將要讀到的MDR中的指令代碼送至IR進行後續操作.
指令“ADD(R1),R0”的操作數一個在主存中, 一個在寄存器中,運算結果在主存中。根據指令功能,要讀出R1的內容所指出的主存單元,必須先將R1的內容送至MAR,即(R1)->MAR.而讀出的數據必須經過MDR,即M(MAR)->MDR.
因此,將R1的內容所指的主存單元的數據讀出到MDR的節拍安排如下:
C5:(R1)->MAR
C6:M(MAR)->MDR
ALU一端是寄存器A,MDR或R0中必須有一個先寫入A中,如MDR.
C7:(MDR)->A
然後執行加法操作,並將結果送入寄存器AC.
C8:(A)+(R0)->AC
之後將加法結果寫回到R1的內容所指的主存單元,注意MAR中的內容沒有改變(裝了(R1),所以能定位一開始內存中一個操作數的位置)。
C9:(AC)->MDR
C10:(MDR)->M(MAR)
有效控制信號的安排只需看數據是流入還是流出,如流入寄存器X就是Xin,流出寄存器X就是Xout。還需注意其他特殊控制信號,如PC+1,Add等。
時鐘 |
功能 |
有效控制信號 |
C5 |
MAR<-(R1) |
R1out,MARin |
C6 |
MDR<-M(MAR) |
MemR,MDRinE |
C7 |
A<-(MDR) |
MDRout,Ain |
C8 |
AC<-(A)+(R0) |
R0out,Add,ACin |
C9 |
MDR<-(AC) |
ACout,MDRin |
C10 |
M(MAR)<-(MDR) |
MDRoutE,MemW |
若在C6執行M(MAR)->MDR的同時,完成(R0)->A(即選擇將(R0)寫入A),並不會發生總線衝突,這種方案可以節省1個節拍:
時鐘 |
功能 |
有效控制信號 |
C5 |
MAR<-(R1) |
R1out,MARin |
C6 |
MDR<-M(MAR) A<-(R0) |
MemR,MDRinE, R0out,Ain |
C7 |
AC<-(A)+(MDR) |
MDRout,Add,ACin |
C8 |
MDR<-(AC) |
ACout,MDRin |
C9 |
M(MAR)<-(MDR) |
MDRoutE,MemW |
PS:有些題如M(MAR)->MDR->IR,控制信號不用寫內存MemR,直接MDRout,IRin,看題目具體情況。