一、目的与要求
实验目的
深入了解计算机各种指令的执行过程,以及控制器的组成,指令系统微程序设计的具体知识,进一步理解和掌握动态微程序设计的概念;完成微程序控制的特定功能计算机的指令系统设计和调试。
实验说明
要进行这项课程设计,必须清楚地懂得:
(1)TEC-2机的功能部件及其连接关系;
(2)TEC-2机每个功能部件的功能与具体组成;
(3)TEC-2机支持的指令格式;
(4)TEC-2机的微指令格式,AM2910芯片的用法;
(5)已实现的典型指令的执行实例,即相应的微指令与其执行次序的安排与衔接;
(6)要实现的新指令的格式与功能。
二、实验环境
TEC-2实验计算机系统(TEC-2模拟机)
PC电脑
三、具体内容
理论分析
微程序控制器的基本组成
微程序控制器主要是由三部分组成
最核心的部分是控制存储器,用于存放教学机的微程序,由56位组成,用7片74LS6116随机读写的8位×2048字的内存芯片实现。由于TEC-2要支持动态微程序设计,即允许实验人员把自己设计的微程序写进控存,故要求存储器可读写。因此与用ROM实现控存相加,增加了一个TEC-2启动时将微程序装入控存的步骤。
第二个组成部分是微指令寄存器PLR。读出的微指令将通过CP脉冲,打入其中。一条微指令的内容通常由下地址和控制信号(微命令)两部分组成。下地址可能又被分成几个小字段,它们被用于控制、形成、或直接提供下一条微指令的地址,是供给控制器部件本身使用的。微命令也由若干个小字段组成,提供对计算机其它功能部件,如运算器、主存、输入/输出设备的控制信号。
第三个组成成分,是微程序定序器Am2910器件及其配套电路。
微程序定序器AM2910芯片的组成与功能
在TEC-2的微程序控制器中,用于形成下一条微指令地址的核心硬件,是一片AM2910器件,其内部结构如下:
AM2910包括一个四输入的多路地址选择器,用来从寄存器/计数器(R),直接输入(D),微程序计数器(μPC)或微堆栈(F)四个输入中,选择其一作为下一条微指令的地址。
寄存器/计数器由12个D型触发器组成。当它用作寄存器时,主要用于保存一个微地址,用以实现微程序转移;当它用作计数器时,具有减一功能,主要用于控制微程序的循环次数。
微程序计数器由12位的增量器和12位的寄存器μPC组成。当增量器的进位输入C1为高电平时,多路器的输出Y加1后装入μPC(即 μPC←Y+1),用于实现微程序的顺序执行;而当C1为低电平时,多路器的输出Y直接装入μPC(即 μPC ←Y),用于实现同一条微指令的多次执行。
微堆栈是由5字×12位的寄存器堆栈和微堆栈指针SP组成,主要用于保存微子程序调用时的返回地址和微程序循环的首地址。微堆栈指针SP总是指向最后一次压入的数据,因此,执行微程序循环时,允许不执行弹出操作而直接访问微堆栈的栈顶。当微堆栈中的数据达到5个时,就发出微堆栈已满信号(/FULL=0),这时,任何压入操作都将覆盖掉栈顶的原有数据。
AM2910输出3个使能信号:/PL、/MAP
和/VECT
,用以决定直接输入D的来源。当/PL有效时(即/PL=0),D来源于微指令的下地址字段,用于实现微程序转移;当/MAP有效时(即/MAP=0),D来源于MAPROM,用于实现从机器指令的操作码找到相应的微程序段首地址的转移;当/VECT有效时,(即/VECT=0),原意来源于中断向量,现用于接收手拨微地址。
命令译码器接收外部送来的命令码I3~I0,条件输入/CC和条件允许/CCEN信号,并对其译码,产生芯片内工作需要的控制信号,和外部要用的三个控制选择信号/PL、/MAP和/VECT。
TEC-2微指令格式
设每条微指令可以表示为B55-B0
(高八位B63-B56
无用),则B55-B46
这8位表示下址。
B43-B40
这4位表示CI3-CI0,用于选择AM2910的控制功能,具体规定如下:
B39-B37
表示SCC,B36表示SC,这4位构成AM2910的条件码,形成条件输入位/CC,具体规定如下:
B34-B32
这3位表示SST,用于设置标志位,具体规定如下:
B31、B27、B23
这3位分别表示/MIO
、REQ
、/WE
,用于控制存储器的读写模式,具体规定如下:
B30-B28
、B26-B24
、B22-B20
这3组4微码分别表示MI8-6
、MI5-3
、MI2-0
,用于控制运算器AM2901的功能,具体规定如下:
B19-B16
、B15-B12
这两组4位微码分别表示ALU的A口和B口地址。
B11-B10
表示SCI
,用于设置运算器AM2901最低位的进位,具体规定如下:
B9-B8
表示SSH
,用于控制运算器AM2901移位器的功能,具体规定如下:
B7
的SA
、B3
的SB
两位用于控制运算器AM2901 A口和B口地址的来源,具体规定如下:
B6-4
和 B2-0
的DC1
和DC2
用于控制送往内部总线IB的数据来源和接收来自内部总线IB数据的寄存器,具体规定如下:
新指令的设计方法
首先选择指令的操作码,TEC-2中剩余11条指令未实现,他们的操作码分别是D4
、D8
、DC
、E0
、E4
、E8
、EC
、F0
、F4
、F8
和FC
,其对应的微程序入口地址已经写死在MAP中,因此只需选择其中一个操作码作为新指令的操作码,再根据指令功能编写微程序,然后将其装入从操作码对应的入口地址开始的一块控存空间即可。
选定操作码后,需要确定指令的格式(单操作数、双操作数等)和功能,然后设计该指令的执行过程,即分成几步完成,每一步要实现的详细操作细节,各步之间的衔接次序等。将每一步中的操作,用一条微指令实现,即具体设计每条微指令各字段的具体编码值,既包括控制码的各字段,也包括下地址字段,形成下地址用到的条件码等等。
MEM
的内容是当前地址寄存器AR
所存的地址单元的内容。
寄存器Q
的内容可以是立即数,也可以是地址。
11条未定义的机器指令的6位操作码已定,最低两位可用于选择C、Z、V、S
四个标志位作为判别条件。
11条未定义的机器指令具有对应的微程序段的入口地址,如D400对应的是100H,D800对应的是110H,E010对应的是130H。
装入新指令的微码有两种方法,一是通过水平板上的开关与按键直接拨入,二是在程序中用LDMC指令实现自动装入。
新指令在每次TEC-2机重新加电后,至少得重新装入一次对应的微码;仅在装入相应微码后,新指令才能执行。
指令一的设计和测试
指令格式
D5××,ADDR1,ADDR2
, 三字指令(控存入口100H)
指令功能
[ADDR1]=[ADDR1] -[ADDR2]
把用绝对地址表示的内存单元ADDR1中的内容与内存单元ADDR2中的内容相减,结果存于内存单元ADDR1中
微程序设计与实现
微程序流程和分析
执行顺序 | 微指令 | 说明 |
---|---|---|
1 | PC->AR PC+1->PC | 指令译码前已经执行PC+1->PC,所以初始时PC指向指令中第一个操作数ADDR1。先执行PC->AR,将ADDR1的地址送入到AR,再执行PC+1->PC,此时PC指向指令中的第二个操作数ADDR2。 |
2 | MEM->IP MEM->AR | 先执行MEN->IP,由于此前AR中存储的是ADDR1的地址,所以该操作将ADDR1送入IP。然后执行MEM->AR,将ADDR1送入AR。 |
3 | MEM->Q | 执行MEM->Q,将地址为ADDR1的内存单元的内容送入Q。 |
4 | PC->AR PC+1->PC | 先执行PC->AR,将ADDR2的地址送入AR,再执行PC+1->PC,此时PC指向下一条指令的操作码。 |
5 | MEM->AR | 执行MEM->AR,由于此前AR中存储了ADDR2的地址,因此该操作将ADDR2送入AR。 |
6 | Q-MEM->IP IP->AR | 先执行Q-MEM->IP,由于此前Q的值为(ADDR1),因此该操作计算(ADDR1)-(ADDR2),并将结果送入IP。然后执行IP->AR,该操作将IP的旧值ADDR1送入AR。 |
7 | IP->MEM CC#=0 | 先执行IP->MEM,将(ADDR1)-(ADDR2)送入地址为ADDR1的内存单元,并将CC置0,强制跳转到A4H,进行中断处理并结束微程序。 |
微码编写
-
PC->AR, PC+1->PC
下址:0x0 因为该条微指令顺序执行,因此下地址字段不使用,将其置0即可
Am2910控制功能:0xe 设置AM2910功能为顺序执行
SCC:0x0 微指令顺序执行时/CC无效,将SCC置0,从而使/CC为0即可
SC:0x0 SCC为0时SC无效,将其置0即可
SST:0x0 本条微指令不使用标志位,将SST置0使标志位保持不变即可
读写模式:0x5 本条微指令无需读写主存储器,因此将读写模式设置为5,即不操作
要实现PC->AR, PC+1->PC,可让ALU计算0+PC+1,将结果送入PC,并使AM2901输出PC的旧值,送入AR,因此可设置如下微码:
I8-6:0x2 将ALU输出送入B口地址指向的寄存器,并使AM2901输出A口地址指向的寄存器内容
I5-3:0x0 ALU功能为R+S
I2-0:0x3 ALU R口数据来源于0,S口来源于B
A口地址:0x5 A口地址指向R5,即PC
B口地址:0x5 B口地址指向R5,即PC
SCI:0x1 设置ALU输入进位为1
SSH:0x0 本条微指令无需对ALU运算结果进行移位,因此将SST置0
SA:0x0 将微指令中指定的A口地址作为AM2901的A口地址
DC1:0x0 该条微指令不使用内部总线,将DC1置0即可
SB:0x0 将微指令中指定的B口地址作为AM2901的B口地址
DC2:0x2 将AM2901的输出送入AR
该条微指令的微码为0000 0E00 A0B5 5402
。
-
MEM->IP,MEM->AR
下址:0x0 因为该条微指令顺序执行,因此下地址字段不使用,将其置0即可
Am2910控制功能:0xe 设置AM2910功能为顺序执行
SCC:0x0 微指令顺序执行时/CC无效,将SCC置0,从而使/CC为0即可
SC:0x0 SCC为0时SC无效,将其置0即可
SST:0x0 本条微指令不使用标志位,将SST置0使标志位保持不变即可
读写模式:0x1 本条微指令需要读内存,因此将读写模式设置为1,即存储器读
要实现MEM->IP,MEM->AR,可让ALU计算MEM+0,并将结果送入IP,然后让AM2901输出ALU的运算结果MEM,送入AR,因此可设置如下微码:
I8-6:0x3 将ALU输出送入B口地址指向的寄存器,并使AM2901输出ALU的运算结果F
I5-3:0x0 设置ALU的功能为R+S
I2-0:0x7 设置ALU的R口接收数据总线的数据MEM,S口接收0
A口地址:0x0 AM2901 A口不使用,将其置0即可
B口地址:0x6 设置AM2901的B口地址为6
SCI:0x0 设置ALU输入进位为0
SSH:0x0 本条微指令无需对ALU运算结果进行移位,因此将SST置0
SA:0x0 将微指令中指定的A口地址作为AM2901的A口地址
DC1:0x0 该条微指令需要读内存,应禁止DC1译码,故将其置0即可
SB:0x0 将微指令中指定的B口地址作为AM2901的B口地址
DC2:0x2 将AM2901的输出送入AR
该条微指令的微码为0000 0E00 30F0 6002
。
-
MEM->Q
下址:0x0 因为该条微指令顺序执行,因此下地址字段不使用,将其置0即可
Am2910控制功能:0xe 设置AM2910功能为顺序执行
SCC:0x0 微指令顺序执行时/CC无效,将SCC置0,从而使/CC为0即可
SC:0x0 SCC为0时SC无效,将其置0即可
SST:0x0 本条微指令不使用标志位,将SST置0使标志位保持不变即可
读写模式:0x1 本条微指令需要读内存,因此将读写模式设置为1,即存储器读
要实现MEM->Q,可让ALU计算MEM+0,并将结果F送入Q,因此可以设置如下微码:
I8-6:0x0 将ALU的运算结果F送入Q,并使AM2901输出ALU的运算结果F
I5-3:0x0 设置ALU的功能为R+S
I2-0:0x7 设置ALU的R口接收数据总线的数据MEM,S口接收0
A口地址:0x0 AM2901的A口不使用,置0即可
B口地址:0x0 AM2901的B口不使用,置0即可
SCI:0x0 设置ALU输入进位为0
SSH:0x0 本条微指令无需对ALU运算结果进行移位,因此将SST置0
SA:0x0 将微指令中指定的A口地址作为AM2901的A口地址
DC1:0x0 该条微指令不使用内部总线,将其置0即可
SB:0x0 将微指令中指定的B口地址作为AM2901的B口地址
DC2:0x0 该条微指令不使用内部总线,将其置0即可
该条微指令的微码为0000 0E00 00F0 0000
-
PC->AR,PC+1->PC
该条微指令与第一条微指令完全相同,此处不再赘述。
-
MEM->AR
下址:0x0 因为该条微指令顺序执行,因此下地址字段不使用,将其置0即可
Am2910控制功能:0xe 设置AM2910功能为顺序执行
SCC:0x0 微指令顺序执行时/CC无效,将SCC置0,从而使/CC为0即可
SC:0x0 SCC为0时SC无效,将其置0即可
SST:0x0 本条微指令不使用标志位,将SST置0使标志位保持不变即可
读写模式:0x1 本条微指令需要读内存,因此将读写模式设置为1,即存储器读
要实现MEM->AR,可让ALU计算MEM+0,并使AM2901输出ALU的运算结果F,送入AR,因此可设置如下微码:
I8-6:0x1 设置ALU的输出F不写入任何单元,且AM2901输出ALU的运算结果F
I5-3:0x0 设置ALU的功能为R+S
I2-0:0x7 设置ALU的R口接收数据总线的数据MEM,S口接收0
A口地址:0x0 本条微指令不使用AM2901的A口,将其置0即可
B口地址:0x0 本条微指令不使用AM2901的B口,将其置0即可
SCI:0x0 设置ALU输入进位为0
SSH:0x0 本条微指令无需对ALU运算结果进行移位,因此将SST置0
SA:0x0 将微指令中指定的A口地址作为AM2901的A口地址
DC1:0x0 该条微指令需要读内存,应禁止DC1译码,将其置0即可
SB:0x0 将微指令中指定的B口地址作为AM2901的B口地址
DC2:0x2 将AM2901的输出送入AR
该条微指令的微码为0000 0E00 10F0 0002
。
-
IP->AR,Q-MEM->IP
下址:0x0 因为该条微指令顺序执行,因此下地址字段不使用,将其置0即可
Am2910控制功能:0xe 设置AM2910功能为顺序执行
SCC:0x0 微指令顺序执行时/CC无效,将SCC置0,从而使/CC为0即可
SC:0x0 SCC为0时SC无效,将其置0即可
SST:0x0 本条微指令不使用标志位,将SST置0使标志位保持不变即可
读写模式:0x1 本条微指令需要读内存,因此将读写模式设置为1,即存储器读
要实现IP->AR,Q-MEM->IP,可让ALU计算Q-MEM,将结果F送入IP,然后使ALU输出IP的旧值,送入AR,因此可设置如下微码:
I8-6:0x2 将ALU的运算结果F送入B口指向的寄存器,并使AM2901输出A口指向的寄存器的内容
I5-3:0x1 设置ALU的功能为S-R
I2-0:0x6 设置ALU的R口接收数据总线的数据MEM,S口接收Q的值
A口地址:0x6 设置AM2901的A口指向IP
B口地址:0x6 设置AM2901的B口指向IP
SCI:0x0 设置ALU输入进位为0
SSH:0x0 本条微指令无需对ALU运算结果进行移位,因此将SST置0
SA:0x0 将微指令中指定的A口地址作为AM2901的A口地址
DC1:0x0 该条微指令需要读内存,应禁止DC1译码,将其置0即可
SB:0x0 将微指令中指定的B口地址作为AM2901的B口地址
DC2:0x2 将AM2901的输出送入AR
该条微指令的微码为0000 0E00 21E6 6002
。
-
IP->MEM*,CC#=0,3# A4H
为了实现IP->MEM,可以让ALU计算0+IP,并让AM2901输出ALU的运算结果F,先通过内部总线送入外部总线,再通过外部总线写入内存。为了实现CC#=0,3# A4H,可以使用AM2910的条件转移功能,将/CC强制置0,并将下址设置为A4H,从而让AM2910强制跳转到A4H,因此可编写如下微码:
下址:0xa4 本条微指令需要跳转到A4H响应可能的中断,因此将下地址设置为A4H
Am2910控制功能:0x3 设置AM2910功能为条件转移
SCC:0x0 为强制AM2910跳转,应置/CC为0,因此设置SCC为0
SC:0x0 SCC为0时SC无效,将其置0即可
SST:0x0 本条微指令不使用标志位,将SST置0使标志位保持不变即可
读写模式:0x0 本条微指令需要写内存,因此将读写模式设置为0,即存储器写
I8-6:0x1 设置ALU的运算结果送入B口指向的寄存器,并使AM2901输出ALU的运算结果F
I5-3:0x0 设置ALU的功能为R+S
I2-0:0x4 设置ALU的R口接收0,S口接收A的值
A口地址:0x6 设置AM2901的A口地址指向IP
B口地址:0x0 AM2901的B口不使用,将其置0即可
SCI:0x0 设置ALU输入进位为0
SSH:0x0 本条微指令无需对ALU运算结果进行移位,因此将SST置0
SA:0x0 将微指令中指定的A口地址作为AM2901的A口地址
DC1:0x1 将AM2901的输出送入内部总线
SB:0x0 将微指令中指定的B口地址作为AM2901的B口地址
DC2:0x0 寄存器不接收来自内部总线的数据
该条微指令的微码为0029 0300 1046 0010
。
功能测试
首先用E900命令从内存中地址为0900H的单元开始写入新指令微程序对应的微码,然后用MOV R1,900;MOV R2,7 MOV R3,100;LDMC;RET
五条指令将内存中地址从0900H开始的7条微指令装入控存中地址从0100H开始的单元。
由于新添加的指令没有助记符,所以用E800命令手动将指令D500 0A00 0A01 AC00写入地址从0800H开始的内存单元,D5为新指令的操作码,0A00为第一个操作数的地址,0A01为第二个操作数的地址,AC00为RET指令的操作码,再用E0A00命令将地址为0A00H、0A01H的内存单元内容分别修改为2000H和1000H。写入完成后,用G800命令运行刚刚写入的指令,然后用D0A00查看地址从0A00H开始的内存单元内容,发现[0A00]=1000H,也就是2000H-1000H的运算结果,可见指令功能正常,微程序编写正确。
指令二的设计和测试
指令格式
D8××,ADDR,DATA
,三字指令(控存入口110H)
指令功能
[ADDR]←DATA
把立即数DATA传送至地址为ADDR的内存单元中保存。
微程序设计和实现
微程序流程和分析
执行顺序 | 微指令 | 说明 |
---|---|---|
1 | PC->AR PC+1->PC | 指令译码前已经执行PC+1->PC,所以初始时PC指向指令中第一个操作数ADDR。先执行PC->AR,将ADDR的地址送入到AR,再执行PC+1->PC,此时PC指向指令中的第二个操作数DATA。 |
2 | MEM->Q | 之前PC指向了DATA,此时执行MEM->Q,将直接数送入Q寄存器当中。 |
3 | Q->MEM CC#=0 | 先执行Q->MEM,由于之前Q中已经存入立即数DATA,且此时AR的值为ADDR,所以该操作将立即数DATA写入地址为ADDR的内存单元,然后将/CC置0,通过AM2910的3号功能跳转到A4H,响应可能发生的中断并结束微程序。 |
微码编写
-
PC->AR,PC+1->PC
该条微指令与指令一第一条微指令完全相同,此处不再赘述。
-
MEM->Q
该条微指令与指令一第三条微指令完全相同,此处不再赘述。
-
Q->MEM, CC#=0
为了实现Q->MEM,可以让ALU计算0+Q,并让AM2901输出ALU的运算结果F,先通过内部总线送入外部总线,再通过外部总线写入内存。为了实现CC#=0,3# A4H,可以使用AM2910的条件转移功能,将/CC强制置0,并将下址设置为A4H,从而让AM2910强制跳转到A4H,因此可编写如下微码:
下址:0xa4 本条微指令需要跳转到A4H响应可能的中断,因此将下地址设置为A4H
Am2910控制功能:0x3 设置AM2910功能为条件转移
SCC:0x0 为强制AM2910跳转,应置/CC为0,因此设置SCC为0
SC:0x0 SCC为0时SC无效,将其置0即可
SST:0x0 本条微指令不使用标志位,将SST置0使标志位保持不变即可
读写模式:0x0 本条微指令需要写内存,因此将读写模式设置为0,即存储器写
I8-6:0x1 设置不将ALU的计算结果F写入任何寄存器,且AM2901输出ALU的运算结果F
I5-3:0x0 设置ALU的功能为R+S
I2-0:0x2 设置ALU的A口接收0,B口接收Q
A口地址:0x0 该条微指令不使用AM2901的A口,将其置0即可
B口地址:0x0 该条微指令不使用AM2901的B口,将其置0即可
SCI:0x0 设置ALU输入进位为0
SSH:0x0 本条微指令无需对ALU运算结果进行移位,因此将SST置0
SA:0x0 将微指令中指定的A口地址作为AM2901的A口地址
DC1:0x1 将AM2901的输出送入内部总线
SB:0x0 将微指令中指定的B口地址作为AM2901的B口地址
DC2:0x0 寄存器不接收来自内部总线的数据
该条微指令的微码为0029 0300 1020 0010
。
功能测试
首先用E900命令从内存中地址为0900H的单元开始写入新指令微程序对应的微码,然后用MOV R1,900;MOV R2,3;``MOV R3,110;LDMC;RET
五条指令将内存中地址从0900H开始的3条微指令装入控存中地址从0110H开始的单元。
由于新添加的指令没有助记符,所以用E824命令手动将指令D800 0A00写入地址从0824H开始的内存单元,D8为新指令的操作码,0A00H为要写入内存单元的地址。写入完成后,用G820命令运行刚刚写入的指令,然后用DA00查看地址。从0A00H开始的内存单元内容,发现[0A00H]=0023H,也就是指令中的立即数,可见指令功能正常,微程序编写正确。
指令三的设计和测试
指令格式
E0 DR SR,ADDR
双字指令(控存入口130H,ADDR为绝对转移地址)
指令功能
if DR!=SR
goto ADDR
else 顺序执行
转移指令。判断两个通用寄存器内容是否相等,若不相等则转移到指定目的地址,否则顺序执行。
微程序设计和实现
微程序流程和分析
执行顺序 | 微指令 | 说明 |
---|---|---|
1 | PC->AR PC+1->PC | 在指令译码前已经执行PC+1->PC,因此初始时PC指向ADDR。随后,先执行PC->AR,将ADDR的地址送入AR,然后执行PC+1->PC,此时PC指向下一条指令的操作码。 |
2 | SR xor DR CC#=/Z | 先执行SR xor DR,该操作会设置标志位Z,若Z=1,表示SR=DR,此时CC=/Z=0,不发生跳转,只需用AM2910的3号功能转移到A4H结束微程序,然后顺序执行下一条指令;若Z=0,此时CC=/Z=1,AM2910不跳转,顺序执行下一条微指令。 |
3 | MEM->PC CC#=0 | 执行到这条微指令表示SR!=DR,需要跳转到ADDR,由于此时AR中存储的是ADDR的地址,所以先执行MEM->PC,将ADDR送入PC,完成转移,然后将条件码CC置0,强制跳转到A4H响应可能的中断并结束微程序。 |
微码编写
-
PC->AR, PC+1->PC
该条微指令与指令一的第1条微指令完全相同,此处不再赘述。
-
SR xor DR, CC#=/Z
为了实现SR和DR的比较,并在不相等时跳转到ADDR,考虑到指令寄存器IR中0-3位存储SR的地址,4-7位存储DR的地址,因此可以设置SA=SB=1,让AM2901的A口和B口地址分别指向IR3-0,IR7-4,也就是SR和DR,并设置AM2910的功能为条件转移,下址为A4H,条件码为/Z,从而利用ALU的R XOR S功能比较SR和DR,若结果为0,则SR=DR,此时CC=/Z=0,AM2910跳转到A4H,结束微程序,否则顺序执行下一条微指令,将ADDR装入PC,从而跳转到ADDR,因此可编写如下微码:
下址:0xa4 本条微指令可能需要跳转到A4H,从而结束微程序,因此将下址设置为A4H
Am2910控制功能:0x3 设置AM2910功能为条件转移
将SCC设置为3,SC设置为1,从而使AM2910的条件码CC为/Z。
SCC:0x3
SC:0x1
SST:0x1 本条微指令使用了标志位Z,因此将SST设置为1,使状态位输入接收ALU的标志位输出值
读写模式:0x4 该微指令无需读写内存,因此将读写模式设置为4,即不操作
I8-6:0x1 设置不将ALU的运算结果写入任何寄存器,AM2901输出ALU的运算结果F
I5-3:0x6 设置ALU的功能为R XOR S
I2-0:0x1 设置ALU的R口接收A口地址指向的寄存器内容,S口接收B口地址指向的寄存器内容
A口地址:0x0 该条微指令直接从IR取得A口地址和B口地址,因此微指令中的A口和B口地址不使用,置0即可
B口地址:0x0 该条微指令直接从IR取得A口地址和B口地址,因此微指令中的A口和B口地址不使用,置0即可
SCI:0x0 设置ALU输入进位为0
SSH:0x0 本条微指令无需对ALU运算结果进行移位,因此将SST置0
SA:0x1 设置AM2901的A口地址取自IR3-0,也就是SR
DC1:0x5 该条微指令的不使用内部总线,将DR1置0即可
SB:0x1 设置AM2901的A口地址取自IR7-4,也就是DR
DC2:0x0 该条微指令的不使用内部总线,将DR2置0即可
该条微指令的微码为0029 0371 9610 0088
-
MEM->PC, CC#=0
下址:0xa4 本条微指令需要跳转到A4H响应可能的中断,因此将下地址设置为A4H
Am2910控制功能:0x3 设置AM2910功能为条件转移
SCC:0x0 为强制AM2910跳转,应置/CC为0,因此设置SCC为0
SC:0x0 SCC为0时SC无效,将其置0即可
SST:0x0 本条微指令不使用标志位,将SST置0使标志位保持不变即可
控存读写模式:0x1 本条微指令需要读内存,因此将读写模式设置为1,即存储器读
为实现MEM->PC,可让ALU计算MEM+0,然后将运算结果F送入PC即可,因此可以设置如下微码:
I8-6:0x3 设置将ALU的运算结果F送入B口指向的寄存器,并使AM2901输出ALU的运算结果F(本条微指令不使用AM2901的输出,随便设置即可)
I5-3:0x0 设置ALU的功能为R+S
I2-0:0x7 设置ALU的R口接收数据总线上的数据MEM,S口接收0
A口地址:0x0 本条微指令无需使用AM2901的A口,将其置0即可
B口地址:0x5 设置AM2901的B口地址为5,即PC
SCI:0x0 设置ALU输入进位为0
SSH:0x0 本条微指令无需对ALU运算结果进行移位,因此将SST置0
SA:0x0 将微指令中指定的A口地址作为AM2901的A口地址
DC1:0x0 本条微指令不使用内部总线,置0即可
SB:0x0 将微指令中指定的B口地址作为AM2901的B口地址
DC2:0x0 本条微指令不使用内部总线,置0即可
该条微指令的微码为0029 0300 30F0 5000
功能测试
首先测试R1和R2不相等,即发生跳转的情况。首先用E900命令从内存中地址为0900H的单元开始写入新指令微程序对应的微码,然后用MOV R1,900;MOV R2,3;MOV R3,130;LDMC;RET
五条指令将内存中地址从0900H开始的3条微指令装入控存中地址从0130H开始的单元,并用MOV R1,2000;MOV R2,1000
两条指令将R1、R2的值分别修改为2000H和1000H。然后用E800命令将新指令E012 1234 AC00手动写入地址从0800H开始的内存单元,其中E0为新指令的操作码,1、2分别表示寄存器R1和R2,1234表示当R1!=R2时需要跳转到的内存地址,AC00为RET指令的操作码。写入完成后,先输入G800命令将PC的值修改为0800H。然后用T命令从0800H开始单步调试,也就是运行刚刚写入的新指令,运行完成后,用R命令查看各寄存器,发现PC的值变为1234H,成功从实现了当R1!=R2时跳转到1234H的功能。
再测试R1和R2相等,即不发生跳转的情况。只需用MOV R1,2000;MOV R2,2000
两条指令将寄存器R1、R2的值都修改为2000H,再用G800命令将PC的值修改为0800H,然后用T命令运行新指令。运行完成后,用R命令查看各寄存器状态,发现PC的值为0802H,成功实现了当R1=R2时顺序执行的功能。
综上所述,当R1!=R2时,指令实现了跳转,当R1=R2时,指令顺序执行,可见指令功能正常,微程序编写正确。
四、实验心得
本次实验,我学习了如何实现TEC-2的动态微程序设计。我了解到,TEC-2的控制器采用微程序的设计方案,其中包含一块控存芯片,用于存储TEC-2每条指令对应的微程序。每执行一条指令,先根据程序计数器PC中存储的指令首地址将其装入指令寄存器IR,完成取指操作,再将PC+1,使其指向指令的第一个操作数,并用MAPROM对指令的操作码进行译码,得到其在控存中的入口地址。然后顺序执行控存中的每一条微指令,根据微指令的各个控制字段,产生相应的控制信号,控制TEC-2的运行。
在实验中,我遇到了不少困难。
首先是我对于AM2901芯片的实现原理不是很理解,所以导致了一些问题的出现,后来发现如果在一条微指令中读取某个通用寄存器的值参与ALU运算或作为AM2901的输出,那么读取到的是这个通用寄存器的旧值,因为通用寄存器的写入落后于AB锁存器数据的打入。
其次是微程序的化简。对于第一条指令,我们的第一版微程序通过PC的回滚实现将数据写入[ADDR1],这样共需10条微指令。但在老师的启发下,我们发现可以用寄存器IP缓存ADDR1的值,而无需将PC回滚,从而将微指令的条数减少到7条。第二条指令,我们第一版微程序共需要6条微指令,也是在老师的指导下,发现不需要再由读取地址的操作,从而将微指令的条数减少到了3条,简化了微程序的设计。
最后,通过本次实验,我深入了解了微程序控制器的实现原理和工作方式、总线的工作原理、计算机各种指令的执行过程,以及控制器的组成的具体知识,进一步理解和掌握了动态微程序设计的概念。通过在不断发现问题解决问题的过程当中,锻炼了我的独立思考能力和解决问题的能力,收获很大。
五、附加材料
三条指令的完整微程序和微码
指令一
PC->AR, PC+1->PC , 0000 0E00 A0B5 5402
MEM->IP MEM->AR , 0000 0E00 30F0 6002
MEM->Q , 0000 0E00 00F0 0000
PC->AR, PC+1->PC , 0000 0E00 A0B5 5402
MEM->AR , 0000 0E00 10F0 0002
IP->AR, Q-MEM->IP , 0000 0E00 21E6 6002
IP->MEM, CC#=0 , A4H 0029 0300 1046 0010
指令二
PC->AR,PC+1->PC , 0000 0E00 A0B5 5402
MEM->Q , 0000 0E00 00F0 0000
Q->MEM,CC#=0 , 0029 0300 1020 0010
指令三
PC->AR,PC+1->PC , 0000 0E00 A0B5 5402
SR xor DR,CC#=/Z , 0029 0371 9610 0088
MEM->PC,CC#=0 , 0029 0300 30F0 5000
汇编语言Debug命令
以汇编语言方式解释,但底层原理相通的
R命令的使用
作用:显示出当前所有寄存器和标志位的状态
接下来再输入命令rax。在提示符“:”后输入100。该命令的作用是将寄存器ax的值设置为100(注意:DEBUG使用的是十六进制,这里的100相当于十进制的256。)最后再执行r命令,观看修改后的寄存器值。
D命令的使用
D命令作用:显示内存区域的内容。
带参数时DEBUG能够显示指定地址范围的内容。
d [起始位置]
。DEBUG从起始位置开始显示128个字节的内容。在提示符“-”下执行命令d 1000:100。观看命令执行结果。
E命令的使用
E命令作用:改变内存单位的内容。 E命令的使用方式为:E [起始位置]。 在提示符“-”下输入以下命令:e 1000:100。
DEBUG首先显示[1000:100]的内容01.,这时可以修改该字节的值。如果还要修改后续的内容,可以按空格键继续。当要跳过某个字节时,可以按连续的两个空格跳到后一个字节去。
A命令的使用
A命令作用:写入汇编源程序。
格式:A 或 A 主存地址
打入A命令直接回车,通常TEC-2机回给出一个约定的主存地址;打入A命令并跟用户打出的一个主存地址,系统将用这一地址取代原约定的地址值。接下来,实验者可以逐条打入所要的汇编语句。这种用法与PC机上的DEBUG很类似,系统会逐语句的进行汇编, 并将产生的执行码(TEC-2机指令代码)从给定地址逐条连续存放。若发现汇编语句有错,则会指出错误位置,并要求重新打入正确的语句。这个过程一直继续到在应该输入语句的位置不再输入而直接打回车键结束。
A800 地址从16进制的800开始 800:MOV R1,100 802:MOV R2,R1 803:ADD R2,R1 804:RET 805:
这建立了从主存800h地址开始的小程序,默认约定所有数字都是16进制的,不用在后跟上字符h;每个监控程序的最后一定是RET汇编语句,使得用户程序结束之后,能正确放回到监控程序的下一指令,保证了监控程序能够继续控制TEC-2机的运行过程。
G命令的使用
G命令作用:执行汇编指令。
G命令的使用方法是:G [=起始地址] [断点地址],意思是从起始地址开始执行到断点地址。如果不设置断点,则程序一直运行到中止指令才停止。在设置完上例的的内存数据并且输入完程序后运行这些汇编代码。在DEBUG中执行命令G=100,观看运行结果。(这里只做原理性结束,不展示完整代码)
为了使程序执行后能够返回监控程序,要求每个程序的最后一条指令应为RET指令。
在TEC-2机中g和起始地址之间没有
-
T和P命令的使用
格式:T addr
功能:从指定地址(或PC中的当前地址)开始单条执行程序指令。通常情况下,每按一次T将执行一条指令。T总是执行单条指令,但执行P命令时,则是把每一个CALL语句连同被调用的子程序一次执行完成。每次执行后均显示所有通用寄存器及状态寄存器的内容,并反汇编出下一条要执行的指令。由于P和T命令是通过设置断点来实现的,而在ROM区不能够设置断点,故不能用它们来执行固化在ROM区中的监控程序。