《计算机组成原理》
课程设计
一、目的和要求
深入了解计算机各种指令的执行过程,以及控制器的组成,指令系统微程序设计的具体知识,进一步理解和掌握动态微程序设计的概念;完成微程序控制的特定功能计算机的指令系统设计和调试。
二、实验环境
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
- 把用绝对地址表示的内存单元ADDR2中的内容与内存单元ADDR1中的内容相减,结果存于内存单元ADDR1中。
指令格式: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中。
- 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 |
0100 |
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 |
0000 |
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 |
0000 |
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 |
0000 |
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 |
0000 |
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 |
0000 |
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 |
0000 |
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 |
0100 |
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 |
0000 |
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 |
0000 |
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 |
0000 |
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 |
0000 |
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 |
0000 |
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 |
0000 |
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 |
0100 |
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 |
0000 |
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博客