EX1.ASM程序跟踪结果
每个程序的一开始的第一条微指令一定是取指令,此微指令的值为0CBFFFFH,对应到各个控制位就是EMRD、PCOE、及IREN为低,此三位有效,其它所有位都处于无效状态。在程序第一次运行时或复位后,uPC和PC的值都为0,PCOE有效,将PC值送到ABUS,做为程序存储器EM的地址,EMRD信号有效就是从程序存储器EM中读出程序指令,IREN将读出的指令送到IR寄存器和uPC,此微指令的作用就是:从程序存储器EM的0地址读出程序指令机器码7CH,并存入uPC中作为微程序存储器uM的地址,从微程序存储器uM的7CH单元中读出微控制码0C7FFF7H,同时PC加1为读下一条指令或数据做准备。
MOV A,#12: 本指令为两个状态周期。在T1状态时,上次读出的指令机器码为7CH,存入uPC中作为微程序存储器uM的地址,读出微指令的值为0C7FFF7H,对应到各个控制位就是EMRDPCOE、EMEN及AEN为低,处于有效状态,其它控制位为无效状态。由于上条微指令(取指操作)已将PC加1,此时PCOE是将加1后的PC输出到ABUS作为程序存储器EM的地址,EMRD就是从程序存储EM中读出数据,本指令中读出的数据应为12H,EMEN将读出的数据送到DBUS总线上,AEN 是将DBUS总线上的值存入累加器A中。同时uPC加1为执行下条微指令做准备,PC加1为读取下一条指令做准备。每条指令的最后一条微指令一定是取指令操作,本指令的T0状态周期即为取指令,执行上一条微指令时uPC已经加1,按照此uPC为地址从微程序存储器uM读出的微指令的值为0CBFFFFH,参照第1步的说明,此微指令从程序存储器EM中读取指令。
MOV A,R0: 本指令为两个状态周期。在T1状态时,由上条取指操作取出的指令机器码为70H,存入uPC后作为微程序地址访问微程序存储器uM的70H单元,读出微指令的值为0FFF7F7,各控制位的状态为RRD、AEN为低电平为有效状态,RRD有效表示从寄存器组R0-R3中读数送到DBUS上,在上条取指令操作时,IREN将取出的指令机器码70H送入IR寄存器,而IR寄存器的最低两位是用来选择寄存器R?的,此时IR寄存器最低两位为00,被读出的寄存器为R0。AEN有效表示将DBUS的数据写到累加器A中。同时uPC
35
加1,为执行下条微指令做准备。 本指令的T0状态也是取指令,完成的功能是取出下一条要执行的指令机器码,并存入uPC和IR寄存器中。
MOV A,@R0: 本指令为三个状态周期。在T2状态时,由上个取指操作读出的指令机器码为74H,打入uPC后,从微程序存储器74H单元读出的微指令的值为0FF77FFH,有效的控制位为MAREN和RRD,RRD有效表示从寄存器组R0-R3中读出数据送到DBUS,MAREN有效表示将数据从DBUS总线上打入地址寄存器MAR。uPC加1取出下条微指令执行。在T1状态时,由uPC做为微程序存储器址,从uM的75H单元中读出微指令的值为0D7BFF7H,其中有效的控制位为EMRD、EMEN、MAROE和AEN。MAROE表示程序存储器EM的地址由地址寄存器MAR输出,EMRD表示从程序存储器EM中读出数据,EMEN表示读出的数据送到地址总线DBUS上,AEN有效表示将数据总线DBUS上的值存入累加器A中。此状态下uPC要加1,为取下条微指令做准备。本指令的T0状态执行的是取指操作。取指操作详细描述见程序开始部分的取指令的说明。
MOV A,01: 本指令为三个状态周期。在T2状态时,由上条取指操作取出的指令机器码为78H,存入uPC和IR寄存器后做为微程序存储器uM的地址,读出微指令的值为0C77FFFH,相应的有效控制位为EMRD、PCOE、EMEN和MAREN,PCOE有效表示将PC值做为程序存储器EM的地址,EMRD表示从程序存储器中读出数据,在本指令中此数据值为01H,EMEN表示将读出的数据送到DBUS总线,MAREN表示将DBUS总线上的数据打入地址寄存器MAR。uPC同时加1,取出下条微指令准备执行。在T1状态时,由uPC做为微程序存储器地址,从uM的79H单元中读出微指令的值为0D7BFF7H,可以参见上条指令的T1状态,此微指令的所完成的功能是,以MAR的值做为程序存储器的地址,读出数据并送到数据总线DBUS,同时将此数据存入累加器A中。uPC加1取出下条微指令准备执行。在T0状态,微指令执行取指令操作。
IN: 本指令分两个状态周期。在T1状态时,由上次取指操作取出的指令机器码为0C0H,以此做为微地址从uM中取出的微指令值为0FFFF17H,有效控制位为AEN、X2X1X0=000,因为X2、X1、X0为低,被选中的寄存器为输入端口IN,也就是说,输入端口IN上的数据被允许送到数据总线DBUS上,AEN有效表示将此数据打入累加器A中。同时uPC加1取出下条微指令准备执行。在T0状态,微指令执行的是取指令操作,取出下条指令准备执行。
OUT: 本指令分两个状态周期。 在T1状态,由上次取出的指令机器码为0C4H,以此为微地址从微程序存储器uM中读出的微指令为0FFDF9FH,有效控制位为OUTEN、X2X1X0=100(二进制),S2S1S0=111(二进制),S2S1S0=111表示运算器做“ALU直通”运算,也就是累加器不做任何运算,直接输出结果,而X2X1X0=100表示运算器的结果不移位直接输出到数据总线DBUS,OUTEN有效表示将数据总线上的数据打入输出端口寄存器OUT内。uPC加1,取出下条微指令准备执行。在T0状态,微指令执行的是取指操作,取出下条将要执行的指令。
实验2:数据运算实验(加/减/与/或)
1.在CPTH 软件中的源程序窗口输入下列程序
36
2.将程序另存为EX2.ASM,将程序汇编成机器码,调试窗口会显示出程序地址、机器码、反汇编指令。
3.按快捷图标的F7,执行“单微指令运行”功能,观察执行每条微指令时,寄存器的
输入/输出状态,各控制信号的状态,PC及uPC如何工作。(见“EX2.ASM程序跟踪结果”详细介绍)
4.在了解数据运算的原理,可以加上一些数据传输指令给累加器A或寄存器R?赋值,再运算,并观察运算结果。 EX2.ASM程序跟踪结果
程序的开始执行一条取指的微指令,读入程序第一条指令。
ADDC A,R1:本指令为三个状态周期。在T2状态,由上次取指操作取出的指令码为21H,由IREN存入指令寄存器IR,最低两位为01(二进制),选择寄存器R1,指令码由于IREN打入uPC时,忽略掉指令的最低两位,而将uPC的最低两位置成00,uPC的值为20H,访问微程序存储器的20H单元,读出微指令值为0FFF7EFH,有效位为RRD及WEN,就是将R1内容送到工作寄存器W,uPC加1取出下条微指令在T1状态,读出的微指令值为0FFFE94H,有效位为FEN和AEN,FEN完成的操作是将标志位存入标志寄存器F(ALU内
37
部),X2X1X0选择“ALU直通”到数据总线DBUS,S2S1S0选择的运算操作为“带进位的加法运算”,AEN将DBUS上的数据存入累加器A。在T0状态,取出下条将要执行的指令。
SUB A,@R1:本指令有四个状态周期。在T3状态,上次取出的指令码为35H,最低两位用于寻址R1寄存器,uPC的最低两位置0,来访问uM的34H单元的微指令,读出值为0FF77FFH,将R1的值存入MAR。在T2状态,微指令为0D7BFEFH,表示用MAR做为地址从EM中读出数据送到DBUS再存到W中。在T1状态微指令为0FFFE91H,表示ALU做“减运算”,其结果直通到DBUS,再存入中,同时保存标志位。T0状态为取指操作。
AND A,#55: 本指令为三个状态周期。在T2状态,微指令值为0C7FFEFH,表示以PC做为地址,从EM中读出数据送到DBUS,再将DBUS数据存W中。在T1状态,微指令为0FFFE93H,表示A和W做“逻辑与”运算,结果直通到DBUS,再存入A中,并保存标志位。
OR A,02:本指令有四个状态周期。在T3状态,微指令为0C77FFFH,表示以PC做为地址,从EM中读出数据送到DBUS,并存MAR中。在T2状态,微指令为0D7BFEFH,表示以MAR做为地址,从EM中读出数据送到DBUS,并存入W中。在T1状态微指令为0FFFE92H,表示A和W做“逻辑或”运算,结果“直通”到DBUS并存入A中。T0状态为取指操作。
实验3:指令流水实验
指令流水操作,就是在微指令执行的过程中,在T1 状态,如果ABUS 和IBUS 空闲,则可以利用这个空闲来进行预取指令,让ABUS、IBUS和DBUS并行工作,实现指令的流水工作。我们已经建立了一套可流水操作的指令/微指令系统。用户可调入这个指令/微指令系统进行实验。为了方便比较,我们仍用实验1 的程序EX1.ASM,其它指令用户可以自己做实验来比较、验证。
1.在CPTH软件中,用菜单的[文件|调入指令系统/微程序]功能,打开CPTH下的“INSFILE2.MIC”,这就是流水操作的指令/微指令系统。
2.在CPTH软件中,用菜单的[文件|打开文件]功能,打开CPTH下的“EX1.ASM”源程序。编译后产生的机器码与实验1 相同。
3.按快捷图标的F7,执行“单微指令运行”功能,观察执行每条微指令时,寄存器的输入/输出状态,各控制信号的状态,PC及uPC如何工作。特别是在每条指令的T0状态周期,取指操作是否和其它指令并行执行。(见“EX1.ASM 程序流水操作跟踪结果”详细介绍)
EX1.ASM 程序流水操作跟踪结果
38
每个程序的一开始的第一条微指令一定是取指令,取出下条将要执行的指令。 MOV A,#12: 本指令为两个状态周期。在T1状态时,从程序存储器EM中读出数据送到累加器A,ABUS被占用,所以取指操作不能与数据总线DBUS上的操作并行执行。本指令的T0状态为正常的取指令操作。
MOV A,R0: 由于取指操作与数据总线可并行工作,本指令只有1个状态周期。由上条取指操作取出的指令机器码为70H,存入uPC后做为微程序地址访问微程序存储器uM的70H单元,读出微指令的值为0CBF7F7H,有效控制位为EMRD、PCOE、IREN、RRD、AEN,由于IR1、IR0的值为00,与RRD信号组合表示从R0中读出数据到DBUS总线,AEN将DBUS上的值存入累加器A,EMRDPCOE和IREN有效表示以PC做为地址从EM中读出下条指令,并存入IR和uPC中,PC加1。
MOV A,@R0: 本指令为三个状态周期。在T2状态时,将R0的值存入地址寄存器MAR。在T1状态时,以MAR为地址读出数据并送到累加器A中。在T0状态,取出下条将要执行指令。由于ABUS不空闲,所以取指操作不能并行工作。
MOV A,01: 本指令为三个状态周期。在T2状态时,以PC为地址从EM中读出数据存到MAR中,在T1状态,以MAR为地址从EM中读出数据存入累加器A。T0为取指操作。由于ABUS不空闲,取指操作不能并行执行。
IN: 本指令为1个状态周期。取指操作和输出操作可并行执行。由上次取指操作取出的指令机器码为0C0H,以此做为微地址从uM中取出的微指令值为0CBFF17H,有效控制位为EMRD、PCOE、IREN和AEN、X2X1X0=000(二进制)表示从输入寄存器IN读数据送到DBUS,AEN表示将此数据存入A,EMRD、PCOE和IREN有效表示以PC为地址从EM中读出指令存入IR和uPC中,PC加1。
OUT: 本指令有1个状态周期。取指操作和输出操作并行完成。 由上次取出微指令值为为0CBDF9FH,有效控制位为EMRD、PCOE、IREN、OUTEN、X2X1X0=100(二进制),S2S1S0=111(二进制),S2S1S0=111表示运算器做“ALU直通”运算,也就是累加器不做任
39