JUC-3基本模块的设计
JUC-3基本模块的模型机结构
基本模块的数据通路如图 1,系统总线包括16位的数据总线DB、16位的地址总线AB和控制总线CB。CPU内部总线IB与系统总线之间通过DR、AR相联。CPU内部各个部件通过16位内部总线IB相连。采用微程序控制方式。
前面运算器部分提到了通用寄存器组的地址来自于指令中的寄存器号,但是没有详细说明,这里结合数据通路进一步说明。
JUC-3的通用寄存器组GRS有8个寄存器R0~R7,通用寄存器组的地址(也就是寄存器号)由指令寄存器IR中的Rs或Rd字段给出。根据指令格式(见指令格式),源寄存器号由IR8-6给出,目的寄存器号由IR2-0给出,在寄存器组内部有一个多路器选择寄存器号是来自Rs还是Rd,如图 2。多路器的选择信号是SRC,它是控制器产生的一个信号,为1时选择Rs作为寄存器地址,为0时选择Rd作为寄存器地址。
取指令阶段的微程序设计
微程序设计方法
微程序设计一般分为三个步骤。
(1)画出微流程
取指令的目标是将存储器中的指令取到指令寄存器IR中。首先PC的内容送给AR;然后AR的内容送到地址总线,给出读信号,将读出的指令送给DR,同时PC加1;最后DR的内容即指令送给IR,完成取指令。取指阶段微流程如图 3。
(2)将微流程翻译成微命令编码
参照微指令编码表,根据上面取指令微流程填写微指令F0~F7字段,无操作字段填‘0’,见表 1。
微地址(H) |
微指令(H) |
微指令字段(H) |
微命令 |
|||||||||
F0 |
F1 |
F2 |
F3 |
F4 |
F5 |
F6 |
F7 |
F8 |
F9 |
|||
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
PCoe, ARce |
||||
0 |
0 |
0 |
0 |
0 |
2 |
1 |
1 |
RD, DRces, PCinc |
||||
6 |
3 |
0 |
0 |
0 |
0 |
0 |
0 |
DRoe, IRce |
||||
(3)分配微地址
表 1中每条微指令的地址尚未确定,接下来就要根据微流程及控存的使用情况填写微指令的F8、F9字段。
根据微程序控制器的设计,在CPU复位时µAR=000H,所以第一条微指令地址是000H。因此接下来的几条微指令地址可以依次为001H、002H、003H,采用固定转移BM=0即F8=0,转向下一地址,下地址001H、002H、003H由F9字段指定。
指令取到IR以后,根据指令包含操作数的个数要进行三分支转移。003H控存单元应设置一条微程序分支指令。
取指令阶段的微程序
将分配的微地址填入微指令,得到完整的取指令微程序如表 2。
微地址(H) |
微指令(H) |
微指令字段(H) |
微命令 |
|||||||||
F0 |
F1 |
F2 |
F3 |
F4 |
F5 |
F6 |
F7 |
F8 |
F9 |
|||
000 |
20010001 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
001 |
PCoe, ARce |
001 |
00029002 |
0 |
0 |
0 |
0 |
0 |
2 |
1 |
1 |
0 |
002 |
RD, DRces, PCinc |
002 |
48000003 |
2 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
003 |
DRoe, IRce |
003 |
00000404 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
2 |
004 |
BM2 |
表中的第一列对应每条微指令在控存中的微地址;第二列为每条微指令的10个字段按对应的位数展开为二进制拼接后形成的编码,并转换为16进制表示;微指令字段所包含的10列为每条微指令10个字段的微命令编码,0代表空操作;最后一列对应每条微指令中有效的微命令。
取指令阶段的多分支微转移(BM2)
取指令结束时,将产生三个分支:如果是双操作数指令,转入取源操作数的微程序;如果是单操作数指令,转入取目的操作数的微程序;如果是无操作数指令,转入执行指令的微程序。根据指令格式设计,模型机指令系统采用操作码扩展技术,指令的最高4位IR15-12不全为零,表示双操作数指令;如果IR15-12全为零,但IR11-6不全为零,表示单操作数指令; IR15-6全为零表示无操作数指令。所以可以用如下逻辑方程表示操作数的类型。
根据这个逻辑方程,可以得出OT1、OT0编码与操作数类型的对应关系,见表 3。
| 操作数类型 | 指令码特征 | OT1 | OT0 |
|---|---|---|---|
双操作数 |
IR15-12不全为零 |
0 |
0 |
0 |
1 |
||
单操作数 |
IR15-12全为零,且IR11-6不全为零 |
1 |
0 |
无操作数 |
IR15-6全为零 |
1 |
1 |
微地址形成采用下址字段与断定测试相结合的方法,如图 4,微地址寄存器µAR的高7位µAR8~µAR2由NA的高7位决定,而µAR1和µAR0由微地址形成逻辑依据IR产生。
表 2中取指令阶段最后一条微指令的NA=004H,如果是双操作数指令,则µAR1=0,而µAR0可以为任意值,因此取源操作数微程序的入口地址为004H或005H;如果是单操作数指令,则µAR1=1、µAR0=0,因此取目的操作数微程序的入口地址为006H;如果是无操作数指令,则µAR1=1、µAR0=1,因此指令执行阶段微程序的入口地址是007H。
实战:熟悉微程序的调试方法
远程实验平台和本地实验系统的具体操作除了一些细节上的不同,基本方法是一样的。主要调试步骤如下。
(1)选择/打开虚拟面板
(2)连接远程/本地实验板
远程实验平台也可在步骤4、5之后再连接实验板,加载FPGA后自动将已输入的微程序和机器指令程序传送到CPU内;本地实验板必须先连接实验板,在加载FPGA之后再输入微程序和机器指令程序。
(3)加载FPGA电路文件
将JUC-3 CPU的电路文件加载到FPGA。
(4)输入微程序
将取指令的微程序写入控存。有两种输入方法,一种是直接输入微指令的十六进制编码,需要手工计算微指令编码;另一种是借助于实验系统的微指令编码器自动计算微指令编码。
(5)输入机器指令程序
目前还只是调试取指令的微程序,未涉及机器指令,这一步暂不需要操作。
(6)运行与调试
以微指令单步方式运行并观察、分析运行结果是否正确。
(7)保存微程序
将调试成功的微程序保存下来,在后面的设计中将在此基础上不断扩充微程序,最终实现整个指令系统。
NOP和HALT指令的设计实现
NOP和HALT都是无操作数指令,从前面的分析可知,在取指令结束后转向007H进入执行阶段的微程序。
指令执行阶段微程序入口地址的形成(BM4)
不同指令的执行阶段,对应着不同的微程序段。在进入指令执行阶段时,应根据机器指令的操作码产生微程序的入口地址。
和BM2的微地址形成方法类似,微地址的高位来自µIR的NA,而低位可以直接复制指令的操作码。以无操作数指令为例,指令操作码是指令编码的5~0位,最多容纳64条指令,可以根据实际的指令数量,用有效的操作码编码参与微地址生成,例如将IR4~IR0直接作为微地址的最低5位,微地址形成如图 7。
该微转移的微指令见表 4。表中“xx”的NA值可以根据自己的微程序空间分配来决定。
微地址(H) |
微指令(H) |
微指令字段(H) |
微命令 |
|||||||||
F0 |
F1 |
F2 |
F3 |
F4 |
F5 |
F6 |
F7 |
F8 |
F9 |
|||
007 |
000008xx |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
4 |
0xx |
根据指令操作码的宽转移 |
NOP指令的微程序设计
NOP指令是空操作指令,也就是不需要做任何操作。但是如果此时有中断请求,应处理中断请求。根据微转移方式编码表,BM=1用来控制硬件检测是否有中断请求以及是否允许中断并产生两分支的微地址,所以微指令的F8=1,F9=000。虽然JUC-3基本模块没有中断功能,BM=1和BM=0都处理成固定转移,但是微指令写成F8=1可以在以后扩充中断系统后不用再修改微程序。
微地址(H) |
微指令(H) |
微指令字段(H) |
微命令 |
|||||||||
F0 |
F1 |
F2 |
F3 |
F4 |
F5 |
F6 |
F7 |
F8 |
F9 |
|||
00000200 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
000 |
||
HALT指令的微程序设计
HALT是停机指令,主要用于调试时避免程序跑飞。该指令的微程序只需一条微指令,用转向自身的方法实现原地踏步,见表 6。注意,停机指令执行后,只有复位才能使CPU重新工作。
微地址(H) |
微指令(H) |
微指令字段(H) |
微命令 |
|||||||||
F0 |
F1 |
F2 |
F3 |
F4 |
F5 |
F6 |
F7 |
F8 |
F9 |
|||
0xx |
000000xx |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0xx |
|
实战:调试NOP和HALT指令
(1)确定NOP和HALT指令的微程序入口地址
根据微程序地址空间分配,无操作数指令的微程序入口地址范围是060H~06FH;根据图 5所示微程序入口地址形成方法,推算出表 4中007微指令的NA字段可以取060H~06FH之间的值。而且也可以取070H~07FH之间的任何一个值,因为无操作数指令只有6条,从指令编码表可知它们的IR4固定为0,即使NA取值07x,产生微地址也是06x。为了能够与后面的单操作数指令和双操作数指令统一,这里取值07FH。
(2)输入微程序
首先导入前面保存的取指令微程序,然后输入NOP和HALT指令的微程序。
(3)输入机器指令程序
根据指令编码表先后将NOP和HALT指令的机器指令输入实验调试系统。
(4)运行与调试
以微指令单步方式运行并观察、分析运行结果。
(5)保存调试成功的微程序
寻址方式的设计实现
依据寻址方式的微程序分支(BM5)
在取操作数阶段,需要根据不同的寻址方式执行不同的微程序。根据指令系统设计,寻址方式M占3位编码;源操作数寻址方式的编码占指令的11~9位,目的操作数寻址方式编码占指令的5~3位。
取操作数阶段微程序转移地址的形成利用了寻址方式的编码,也就是指令中寻址方式的部分。如图 6,微转移地址由两部分拼接而成,高6位来自μIR中NA的相应位,最低3位来自IR中的寻址方式编码Ms或Md;根据寻址方式的不同,产生8个不同的微地址。
相应的逻辑方程为:
µAR8-3 = NA8-3
µAR2-0 = M
假如取源操作数的微程序安排自010H开始,即NA=010H,则生成的微地址为010H~017H,分别对应着8种寻址方式。取目的操作数的微程序安排在028H开始,NA=028H,则生成的微地址为028H~02FH。
取操作数阶段微程序设计
如果是双操作数指令,取指令结束后进入取源操作数阶段。根据前面BM2微转移的设计,取源操作数的入口地址为004H或005H。在微地址为004H和005H的微指令中,根据不同的寻址方式M多路转移,该转移方式由BM5控制,如图 7。设置NA=010H,可求得源操作数为寄存器寻址、寄存器间接、寄存器自增间接、立即、直接、间接、变址和相对寻址的微程序入口地址分别为010H、011H、012H、013H、014H、015H、016H和017H。
取操作数的微程序转移比较频繁,不能像取指令的微程序那样完全按照微地址的顺序执行,为了能够比较容易地看清微转移,图 7采用流程图的形式来表达微程序。每条微指令用一个图块表示,如所示,图块的左上角是该微指令的微地址,右上角是微指令代码,中部是该微指令包含的微命令,右下角是下址字段的微地址,左下角是微转移方式字段的值及简要说明;图块中的数据均以十六进制表示。
虽然有8种寻址方式,但操作数的来源只有两类。除寄存器寻址来自寄存器外,其他寻址方式的操作数都来自主存。寄存器寻址只要一条微指令就可完成,其他寻址方式在图 7中只给出了最后一条微指令,其他微指令留待读者完成,微地址可安排在任何空闲的控存单元,建议安排在00FH~027H范围内。从给出的两条微指令可以看出,取到的源操作数放在RY暂存器中,取源操作数结束后转向取目的操作数的入口006H。
取目的操作数微流程与取源操作数微流程相似,主要区别是:
(1)微地址不同。建议安排在028H~03FH范围内。
(2)不产生SRC微命令;
(3)目的操作数的寻址方式不包含立即寻址;
(4)取出的目的操作数存放在RX中,而不是RY中;
(5)取目的操作数结束时转向执行阶段。
运算类指令的设计实现
执行阶段微程序入口地址的形成(BM4)
前面已经介绍了无操作数指令的微程序入口地址形成方法,现在需要增加带操作数指令。有几种不同的执行阶段入口地址形成的实现方法,这里介绍一种单一入口方法,即007一条微指令完成所有指令入口的微转移。如图 9所示,与无操作数指令入口地址的形成方法类似,单、双操作数指令也是用指令的操作码参与微地址的生成,只是操作码来自指令的不同位置。
若取NA=07FH,则双操作数指令的入口地址范围是071H~07FH;由于单操作数指令的IR11实际为0,所以产生的地址范围是041H~05FH。这就是微地址分配的依据。
单操作数运算指令的微程序设计
单操作数运算指令有5条:INC、DEC、NOT以及SAR、SHL。单操作数指令进入执行阶段时,目的操作数已经在RX暂存器中,执行阶段只要控制ALU执行相应的运算功能,并且将运算结果保存在RF寄存器中,同时将运算结果的特征标志保存到PSW中。
接下来要转到保存结果的微程序,将RF寄存器中的结果保存到目的操作数。虽然目的操作数的寻址方式有7种,但操作数的存放位置只有两种,要么在寄存器中、要么在主存中;所以要产生一个两分支的微转移。
保存运算结果时的两分支微转移地址形成(BM7)
运算指令的指令执行阶段最后还需要保存运算结果,此时,需要判断目的操作数是在寄存器中、还是在内存中,这就需要依据目的操作数寻址方式决定转移地址。根据寻址方式编码和指令格式,只有当IR5、IR4和IR3都为零时,结果存入寄存器,其他情况均存入存储器,所以可以对IR5、IR4和IR3进行或运算产生微地址的最低位,如下。
µAR0 = IR5 + IR4 + IR3
如果目的操作数是在寄存器中,则µAR0 = 0;如果目的操作数是在内存中,则µAR0 = 1。微地址的高位由下址字段NA直接给出,微地址的形成方法如图 10所示。
微地址的高位由下址字段NA直接给出,假设NA=00CH,可知产生的两分支微地址分别是00CH(目的操作数在寄存器中)和00DH(目的操作数在内存中)。
保存结果的微程序
由于运算指令都需要保存运算结果,可以将其设计为公用的微程序。假设分配给它的微地址范围是00CH~00EH,微程序见图 11。00CH微指令将结果保存在寄存器中,00DH和00EH微指令将结果保存在主存中,因为在取目的操作数阶段已经将地址保留在AR中,不需要重新根据目的寻址方式获得有效地址。
运算结果保存之后,该指令的执行就结束了,此时应配合硬件检测是否有中断请求,根据微转移方式编码表,BM=1用来控制硬件检测是否有中断请求以及是否允许中断并产生两分支的微地址,所以00CH和00EH微指令的BM=1,NA=000。
实战:单操作数运算指令的微程序设计与调试
完成INC指令的微程序设计与调试。
ORG 0030H
INC 0040H
HALT
其中ORG 0030H是一条伪指令,不产生实际的机器指令,只是指明下面一条指令的地址是0030H。
(1)将上述汇编语言程序翻译为机器指令程序
以 INC 0040H 为例,已知单操作数双字指令格式如下。
15 |
12 |
11 |
6 |
5 |
3 |
2 |
0 |
||
0000 |
OP |
Md |
Rd |
||||||
目的操作数寻址方式中包含的常数 |
|||||||||
查指令编码表,INC指令的操作码OP为010001;查寻址方式编码表,直接寻址的编码M为100;该指令不涉及寄存器,寄存器字段可取任意值,通常采用000。指令的第二个字为直接地址0040H。所以该指令的二进制编码如下。
15 |
12 |
11 |
6 |
5 |
3 |
2 |
0 |
||
0000 |
010001 |
100 |
000 |
||||||
0000000001000000 |
|||||||||
由于实验系统只接受十六进制格式,故需要将上面的二进制指令码转换为十六进制,用如下形式表示:
0030: 0460; INC 0040H
0031: 0040;
冒号前面的是内存单元的地址。由于CPU复位时PC=0030H,所以第一条指令的地址必须为0030H。
上面手工翻译的方法虽然枯燥繁琐,但也是需要掌握的。为了提高效率,实验系统提供了JUC汇编语言的自动翻译功能。在掌握手工翻译的方法之后,可以直接输入汇编指令,由实验系统翻译成机器指令。
(2)将上述程序中的主存单元地址0040H换成红色LED输出寄存器的地址FF02H,以“机器指令单步”方式运行程序,观察LED指示灯的变化。
(3)换其他指令如减1指令、取反指令,编写相关的微程序并调试通过。
双操作数指令的微程序设计
双操作数指令主要是算术运算和逻辑运算指令,进入执行阶段时,源操作数已经取到RY暂存器中,目的操作数也已经取到RX寄存器中。因此,需要将RY中的源操作数送到内部总线IB上,让 ALU做相应指令的运算,并且将运算结果保存在RF寄存器中,同时将运算结果的特征标志保存到PSW中,这些操作在一条微指令中完成。需要保存结果的指令接下来转移到图 11的微程序,将RF寄存器中的结果保存到目的操作数所在的寄存器或存储单元。注意CMP指令和TEST指令不需要保存结果,应使它们的BM=1结束指令的执行。
此外还有一条数据传送MOV指令。MOV指令将源操作数复制到目的操作数,原本可以不需要经过ALU,但为了共用图 11保存结果的微程序,需要将RY中的源操作数传送到移位寄存器中,所以利用了ALU的传送功能。微程序见图 12。
转移指令的设计实现
无条件转移指令
转移指令是单操作数指令,分为无条件转移和条件转移两种。无条件指令的功能是转向目的地址去执行,这个目的地址就是通过寻址方式得到的有效地址;转移指令只能使用内存寻址,不支持寄存器寻址。取操作数阶段结束以后,“目的操作数”存放在寄存器RX中,操作数的有效地址在AR中;实际上“目的操作数”不是操作数,而是转移目的地址所在单元的指令码,对转移指令而言RX中的“操作数”没有意义,转移指令只用AR中的内容作为转移地址。实现程序转移的方法是将转移地址放入PC,所以实现转移的微指令很简单,就是将AR的内容送给PC,见表 7。
微地址(H) |
微指令(H) |
微指令字段(H) |
微命令 |
|||||||||
F0 |
F1 |
F2 |
F3 |
F4 |
F5 |
F6 |
F7 |
F8 |
F9 |
|||
1 |
000 |
ARoe, PCce |
||||||||||
依据零标志位的微转移地址形成(BM3)
条件转移指令执行时根据转移条件是否满足两分支转移,JUC-3基本模块只支持JZ和JNZ指令,也就是仅以零标志作为转移条件。对于JZ指令,若ZF=1,则程序转移,若ZF=0,则顺序执行;而JNZ指令则相反,若ZF=0,则程序转移,若ZF=1,则顺序执行。因此,在条件转移指令的微程序也需要有两个分支:如果机器指令的转移条件满足,将转移地址放入PC;否则,不修改PC的值。图 13给出了微转移地址形成原理图。
如上所述,JZ指令和JNZ指令的条件是否满足正好是相反的。分析指令编码表,可以用IR6区分指令JZ和JNZ,因此用IR6控制异或门决定是否取反。若转移指令的条件满足,µAR0=1,否则µAR0=0。
JZ和JNZ指令的微程序
上面已经介绍BM=3时的微转移地址形成方法,是否满足转移条件的判断是由硬件完成的;所以JZ和JNZ指令的微程序是一样的,只是微程序入口地址不同,见图 14。
可见,除了入口的微指令,还需要2条微指令,它们的存放位置可自由分配,只要不占用其他指令的入口地址即可。分配好后填写JZ和JNZ的NA。
实战:转移指令的微程序设计与调试
(1)JZ指令和JMP指令的微程序调试
根据前面介绍的单操作数指令的微地址形成方法(BM4),算出条件转移指令的微程序入口地址。将微程序输入到控存,并用下面的程序验证。其中ADDR1是06行指令的地址;FF01H是输出寄存器1(绿色指示灯)的地址。
ORG 0030H
MOV #imm1, R1
CMP #imm2, R1
JZ ADDR1
MOV #0001H, FF01H
JMP 0030H
ADDR1: MOV #0080H, FF01H
JMP 0030H
上面程序中的立即数 #imm1和 #imm2用具体的数值代替,设计两组立即数使得转移和不转移两种情况均能出现,观察LED的变化和PC值的变化并分析原因。
CMP指令完成 imm1减imm2,相减的结果不保存,但是影响PSW中的标志位。 如果如果ZF=1(imm1 = imm2), 最高位的绿色指示灯点亮;ZF=0(imm1 ≠ imm2),最低位的绿色指示灯点亮。
(2)将上面程序中的JZ指令改为JNZ指令,并运行验证。
(3)将上面程序中条件转移指令的直接寻址方式改为相对寻址,并运行验证。