2009年408计组数据通路大题

【题目】

某计算机字长为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(此2步莫漏!不要直接用括号R1就和R0相加了)

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,看题目具体情况。

附一道-最少节拍题

注意下图勘误:C2的PC要改为R1

tips:

(1)MAR和MDR是唯二和主存有直接交互的2个寄存器,且MAR里的数据都是单向流向主存的(CPU要告诉主存老子要往哪个地址进行操作即读/写),而MDR和内总线之间是双向传输的(才能和外部I/O设备进行数据的交流)。

(2)ALU相加时候注意有没有对应的寄存器,如果有,要流到对应ALU“对口(邻居)”的寄存器

(3)(MDR)—>IR后指令开始译码,操作字开始控制CU。

(4)写出硬布线控制器完成STA X(X为主存地址)指令(含义:把隐含的ACC寄存器的内容写入主存单元X中)的微操作命令及节拍

T0  PC->MAR,1->R

T1  M(MAR)->MDR, (PC)+1->PC

T2  MDR->IR ,OP(IR)->ID【取操作码进行译码】

T3  Ad(IR)->MAR,1->W  【指令中的地址X要交给MAR】

T4  ACC->MDR  【隐含寻址,源操作数在ACC中】

T5  MDR->M(MAR)

若采用微操作,则在每条指令之间加入 Ad(CMDR)->CMAR,最后一条指令后加上 OP(IR)->微操作数形成部件->CMAR

遇到一些BT的题,要求写出取微指令操作:CM(CMAR)->CMDR,可以类比M(MAR)->MDR(就加上个C)而已。

(5)源操作数A和目的操作数B相加如果需要将结果写回目的操作数B的位置,则一开始要后取目的操作数,因为可以使MAR保存着目的操作数B的地址,方便写回:MDR->M(MAR) 

(6)如果是立即寻址,指令的地址码则是操作数,操作姿势:取指后,ad(IR)->R1,如果后面是ACC和(R1)相加则(ACC)+(R1)->R2,;如果是寄存器间接寻址,则寄存器里存放的是主存地址,别漏了送地址到MAR:(R1)->MAR,M(MAR)->MDR

小结

猜你喜欢

转载自blog.csdn.net/qq_35812205/article/details/106933503