JUC-II CPU的微程序设计包括不同寻址方式的微指令编码(八种源操作数寻址方式、七种目的操作数寻址方式)、38种执行操作的微指令编码等。
所有的微指令编码均验证过了,对各种操作指令充分思考。最后还将各种指令汇总到一个程序里进行整体试验证,验证结果正确。
课程设计背景、目标等不过多阐述,主要记录微指令的编码以及自己画的一些流程图。
目录
一、微指令编码
1.取指令阶段
2.取源操作数阶段
(1)取源操作数入口
(2)不同的寻址方式
3.取目的操作数阶段
(1) 取目的操作数入口
(2)不同的寻址方式
4.执行阶段
(1)执行阶段入口
(2)双操作数执行阶段微程序的设计(包括MOV、ADD、ADDC、SUB、SUBB、AND、OR、XOR、CMP、TEST)
(3)移位指令的设计(包括SAR、SHL、SHR、ROL、ROR、RCL、RCR)①SAR指令
(4)转移指令的设计(包括JC、JNC、JO、JNO、JZ、JNZ、JS、JNS、JMP)
(5)单操作数指令(包括INC、DEC、NOT)
(6)堆栈指令(包括PUSH、POP、CALL、RET指令)
(7)无操作数指令(包括HALT、NOP、RETI、EI、DI、中断隐指令)
二、微程序流程图
1.取源操作数的不同寻址方式:
2.取目的操作数时的不同寻址方式:
3.执行MOV、ADD、ADDC、SUB、SUBB、AND、OR、XOR、CMP、TEST时:
4.执行SAR、SHL、SHR、ROL、ROR、RCL、RCR这七条移位指令时:
5.执行JC、JNC、JO、JNO、JZ、JNZ、JS、JNS、JMP转移指令时:
6.执行INC、DEC、NOT时:
7.执行PUSH、POP、CALL堆栈指令时:
8.执行HALT、NOP、RET、RETI、EI、DI指令时:
三、微程序的设计与验证
1.分类设计
(1)双操作数指令的验证
(2)单操作数指令和移位汇编指令的验证
(3)转移类汇编指令的验证
(4)堆栈类指令的验证
(5)中断指令的验证
2.整体验证
有些表格上传之后格式会乱,因此有的地方是用图片形式上传的,有些是表格直接复制上来的。
微地址 |
微指令 |
微指令字段 |
代表微操作 |
|||||||||
F0 |
F1 |
F2 |
F3 |
F4 |
F5 |
F6 |
F7 |
NAC |
NA |
|||
3 |
3 |
4 |
2 |
2 |
2 |
1 |
3 |
3 |
9 |
|||
000 |
20080001 |
1 |
2 |
001 |
PCoe,ARce |
|||||||
001 |
00069002 |
1 |
2 |
1 |
1 |
002 |
ARoe’、RD、DRce'、PCinc |
|||||
002 |
CC000003 |
6 |
3 |
003 |
DRoe、IRce |
|||||||
003 |
00000404 |
2 |
004 |
BM2 |
004 |
00000A08 |
5 |
008 |
|||||||||
005 |
00000A08 |
5 |
008 |
①寄存器寻址
②寄存器间接寻址
③寄存器自增间接寻址
④立即寻址
⑤直接寻址
⑥间接寻址
⑦变址寻址
⑧相对寻址
006 |
00000A28 |
5 |
028 |
①寄存器寻址
②寄存器间接寻址
⑥变址寻址
⑦相对寻址
007 |
00000800 |
4 |
000 |
①MOV指令
041 |
94000040 |
4 |
5 |
040 |
TRoe、Ace |
|||||||
040 |
00300E50 |
3 |
050 |
SVce |
②ADD指令
042 |
98700E50 |
4 |
6 |
1 |
3 |
050 |
TRoe、ADD、SVce、PSWce |
③ADDC指令
043 |
98B00E50 |
4 |
6 |
2 |
3 |
050 |
TRoe、ADDC、SVce、PSWce |
④SUB指令
044 |
98F00E50 |
4 |
6 |
3 |
3 |
050 |
TRoe、SUB、SVce、PSWce |
⑤SUBB指令
045 |
99300E50 |
4 |
6 |
4 |
3 |
050 |
TRoe、SUBB、SVce、PSWce |
⑥AND指令
046 |
99700E50 |
4 |
6 |
5 |
3 |
050 |
TRoe、AND、SVce、PSWce |
⑦OR指令
047 |
99B00E50 |
4 |
6 |
6 |
3 |
050 |
TRoe、OR、SVce、PSWce |
⑧XOR指令
048 |
9A300E50 |
4 |
6 |
1 |
3 |
050 |
TRoe、XOR、SVce、PSWce |
⑨CMP指令
049 |
98F00200 |
4 |
6 |
1 |
7 |
000 |
TRoe、SUB、PSWce |
⑩TEST指令
04A |
99700200 |
4 |
6 |
5 |
3 |
000 |
TRoe、AND、PSWce |
结果保存:
050 |
68000200 |
3 |
2 |
1 |
000 |
Soe、GRSce |
||||||
051 |
60030052 |
3 |
3 |
052 |
Soe、DRce |
|||||||
052 |
00052200 |
1 |
1 |
2 |
1 |
000 |
ARoe’、DRce'、WR |
061 |
18100E50 |
6 |
1 |
7 |
050 |
PSWce、SRce |
②SHL指令
062 |
18200E50 |
6 |
2 |
7 |
050 |
PSWce、SLce |
③SHR指令
063 |
18100E50 |
6 |
1 |
7 |
050 |
PSWce、SRce |
④ROL指令
064 |
18200E50 |
6 |
2 |
7 |
050 |
PSWce、SLce |
⑤ROR指令
065 |
18100E50 |
6 |
1 |
7 |
050 |
PSWce、SRce |
⑥RCL指令
066 |
18200E50 |
6 |
2 |
7 |
050 |
PSWce、SLce |
⑦RCR指令
067 |
18100E50 |
6 |
1 |
7 |
050 |
PSWce、SRce |
①JC指令
068 |
00000622 |
3 |
022 |
NOP |
②JNC指令
069 |
00000622 |
3 |
022 |
NOP |
③JO指令
06A |
00000622 |
3 |
022 |
NOP |
④JNO指令
06B |
00000622 |
3 |
022 |
NOP |
⑤JZ指令
06C |
00000622 |
3 |
022 |
NOP |
⑥JNZ指令
06D |
00000622 |
3 |
022 |
NOP |
⑦JS指令
06E |
00000622 |
3 |
022 |
NOP |
⑧JNS指令
06F |
00000622 |
3 |
022 |
NOP |
⑨JMP指令
070 |
A4000200 |
5 |
1 |
1 |
ARoe、PCce |
⑩跳转地址
不满足条件:
022 |
00000200 |
1 |
满足条件:
023 |
A4000200 |
5 |
1 |
1 |
ARoe、PCce |
①INC指令
071 |
1A700E50 |
6 |
9 |
3 |
7 |
050 |
PSWce、SVce、INC |
②DEC指令
072 |
1AB00E50 |
6 |
9 |
PSWce、SVce、DEC |
③NOT指令
073 |
19F00E50 |
6 |
A |
3 |
PSWce、SVce、NOT |
①PUSH指令
078 |
003000B0 |
3 |
0B0 |
SVce |
||||||||
0B0 |
600300B1 |
3 |
3 |
0B1 |
Soe、DRce |
|||||||
0B1 |
F40000B2 |
7 |
5 |
0B2 |
SPoe、Ace |
|||||||
0B2 |
02B000B3 |
B |
3 |
0B3 |
DEC、SVce |
|||||||
0B3 |
7C080052 |
3 |
7 |
2 |
052 |
Soe、SPce、ARce |
②POP指令
079 |
B0000092 |
092 |
ARoe、TRce |
|||||||||
092 |
E0080093 |
7 |
2 |
093 |
SPoe、ARce |
|||||||
093 |
02C61094 |
B |
1 |
2 |
1 |
094 |
SPinc、ARoe’、DRce’、RD |
|||||
094 |
D4000095 |
B |
3 |
1 |
095 |
DRoe、Ace |
||||||
095 |
00300096 |
3 |
096 |
SVce |
||||||||
096 |
80080E50 |
4 |
2 |
050 |
TRoe、ARce |
③CALL指令
07A |
B3000097 |
5 |
4 |
6 |
097 |
ARoe、TRce、SPdec |
||||||
097 |
E0080098 |
7 |
2 |
098 |
SPoe、ARce |
|||||||
098 |
20030099 |
1 |
3 |
099 |
PCoe、DRce |
|||||||
099 |
84052200 |
4 |
1 |
1 |
1 |
2 |
1 |
000 |
TRoe、PCce、ARoe’、DRoe’、WR |
④RET指令
05A |
E00800A0 |
7 |
2 |
0A0 |
SPoe、ARce |
|||||||||
0A0 |
02C610A1 |
B |
1 |
2 |
1 |
0A1 |
SPinc、ARoe’、DRce’、RD |
|||||||
0A1 |
C4000000 |
6 |
1 |
DRoe、PCce |
①HALT指令
058 |
00000058 |
058 |
②NOP指令
059 |
00000200 |
1 |
000 |
③RETI指令
05B |
E00800A2 |
7 |
2 |
0A2 |
SPoe、ARce |
|||||||
0A2 |
02C610A3 |
B |
1 |
2 |
1 |
0A3 |
SPinc、ARoe’、DRce’、RD |
|||||
0A3 |
C00040A4 |
6 |
1 |
0A4 |
DRoe、PSWce’ |
|||||||
0A4 |
E00800A5 |
7 |
2 |
0A5 |
SPoe、ARce |
|||||||
0A5 |
02C610A6 |
B |
1 |
2 |
1 |
0A6 |
SPinc、ARoe’、DRce’、RD |
|||||
0A6 |
C4000000 |
6 |
1 |
000 |
DRoe、PCce |
④EI指令
05C |
00005200 |
5 |
1 |
000 |
STI |
⑤DI指令
05D |
00006200 |
6 |
1 |
000 |
CLI |
⑥中断隐指令
080 |
F40000C0 |
7 |
5 |
0C0 |
SPoe、Ace |
|||||||
0C0 |
22B300C1 |
1 |
A |
3 |
0 |
3 |
0C1 |
PCoe、DEC、SVce、DRce |
||||
0C1 |
740800C2 |
3 |
5 |
2 |
0C2 |
Soe、Ace、ARce |
||||||
0C2 |
000520C3 |
1 |
1 |
2 |
0C3 |
ARoe’、DRce'、WR |
||||||
0C3 |
02B330C4 |
A |
3 |
3 |
3 |
0C4 |
PSWoe、DEC、SVce、DRce |
|||||
0C4 |
7C0800C5 |
3 |
7 |
2 |
0C5 |
Soe、SPce、ARce |
||||||
0C5 |
000520C6 |
1 |
1 |
2 |
0C6 |
ARoe’、DRce'、WR |
||||||
0C6 |
000270C7 |
2 |
7 |
0C7 |
DRce’、INTA |
|||||||
0C7 |
C00800C8 |
6 |
2 |
0C8 |
DRoe、ARce |
|||||||
0C8 |
000610C9 |
1 |
2 |
1 |
0C9 |
ARoe’、RD、DRce' |
||||||
0C9 |
C4006000 |
3 |
1 |
6 |
000 |
DRoe、PCce、CLI |
图1源于书上,图2图的框架源于网络、自己加以了内容的填充,下面其他的所有图均为原创,加上做的时候时间比较紧,可能会有错误,希望读者加以检查、不要照搬。
①汇编指令的设计:
②结果分析
预期结果:
0030H:把0050H存入R0
0032H:源操作数是直接寻址,将0050H中的数0045H存入R1
0034H: R0与R1相加,结果0095H存入R1
0035H:源操作数是寄存器间接寻址,R0中的数据是0050H,主存0050H中的数据是0045H,所以把0045H存入R2中
0036H:R2和R1相减,结果存入R2
0037H:源操作数是间接寻址,0046H中的数据是0047H,0047H中的数据是0048H,所以把0048H存入R3
验证结果:
实际结果与预期结果一致。
①汇编指令的设计:
②结果分析
预期结果:
0030H:将立即数0050H送至R0
0032H:将立即数0045H送至R1
0034H:对R0里的数自增,变为0051H
0035H:对R1里的数自减,变为0044H
0036H:将立即数0046送至R2
0038H:将R2右移,即为0000 0000 0100 0110 → 0000 0000 0010 0011,R2变为0023H
0039H:将R0与R1进行相加,结果送至R1,即为0095H
验证结果:
验证结果与预期结果一致。
①汇编指令的设计:
②结果分析
预期结果:
0030H:将立即数0010送至R0。
0032H:对源操作数和目的操作数使用寄存器寻址的方式,将R0的数据送至R1。
0033H:对R0和R1进行减操作,结果保存到R1中。
0034H:因为ZF=1,因此进行条件转移,转移至0040H。
0040H:对R1进行自增,R1变为0001H。
0041H:ZF=0,实现转移指令,转移到0044H。
0044H:停机指令HALT。
验证结果:
验证结果与预期结果一致。
①汇编指令设计:
②结果分析
预期结果:
0030H:将立即数0050H送至R0
0032H:将R0压入栈
0033H:出栈,结果保存至R1
0034H:子程序调用0039H
0039H:将立即数0039H送至R2
003BH:子程序返回
0036H:源操作数和目的操作数都是采用寄存器寻址的方式,执行MOV指令,将R2的值送给R3
验证结果:
由图可知,验证结果与预期结果一致。
①汇编指令设计:
②结果分析:
预期结果:
0030H:源操作数立即寻址、目的操作数直接寻址,将0100H送入主存0000H中(这一步是因为KEY0中断服务程序入口地址在0100H,000单元是KEY0的中断向量)。
0033H:源操作数立即寻址,目的操作数直接寻址,将FFFEH送入主存FF00H中(这一步是设置屏蔽字)。
0036H:在程序刚开始的时候就按下了KEY0,产生了中断请求,这里执行EI指令,开中断
0100H:上一条指令执行完之后,响应中断请求,进行中断服务。源操作数和目的操作数都采用直接寻址方式。(这一步是读输入数据接口,送给红色LED,同时清除KEY0中断请求,如果不清除中断请求,会导致不停地进入该中断)
0103H:源操作数是立即寻址,目的操作数为直接寻址,将1H送到FF01H中。
0106H:执行中断返回指令。
0037H:回到断点,将立即数0001H送到R0。
0039H:将立即数0039H送到R2。
验证结果:
将双操作数指令、单操作数指令、移位指令、转移指令、堆栈指令、中断指令都写入一个程序当中进行验证。(提交材料的文件名为:整体调试汇编指令.ai、整体调试主存内容.mmc)
汇编指令的设计为:
预期结果为:
1. 0030H:源操作数立即寻址、目的操作数直接寻址,将0100H送入主存0000H中(这一步是因为KEY0中断服务程序入口地址在0100H,000单元是KEY0的中断向量)。
2. 0033H:源操作数立即寻址,目的操作数直接寻址,将FFFEH送入主存FF00H中(这一步是设置屏蔽字)。
3. 0036H:执行EI指令,开中断
4. 0037H:源操作数立即寻址,目的操作数寄存器寻址,将0050送入R0中。在此过程中按下KEY0,但当前指令依然执行下去了。
5. 0100H:上一条指令执行完之后,响应中断请求,进行中断服务。源操作数和目的操作数都采用直接寻址方式。(这一步是读输入数据接口,送给红色LED,同时清除KEY0中断请求,如果不清除中断请求,会导致不停地进入该中断)
6. 0103H:源操作数是立即寻址,目的操作数为直接寻址,将1H送到FF01H中。
7. 0106H:执行中断返回指令。
8. 0039H:回到断点,执行PUSH指令,将R0压入栈。
9. 003AH:取出栈顶数据,存入R1,即R1值为0050H。
10. 003BH:移位指令,将R1右移,即0000 0000 0101 0000 → 0000 0000 0010 1000,R1值为0028H。
11. 003CH:无条件转移到0040H。
12. 0040H:DEC指令,R1值减一,变为0027H。
13. 0041H:TEST指令,R0:0000 0000 0101 0000,R1:0000 0000 0010 0111,按位进行与运算,结果为0000,只保存PSW结果,不保存结果到寄存器中。
14. 0042H:MOV指令,源操作数为立即寻址,目的操作数为寄存器寻址,将0030H送到R2。
15. 0044H: 将R0进行右移,结果为0028,保存至R0中。
16. 0045H:HALT停机指令。
验证结果展示:
编号uAddr |
PC |
IR |
SP |
TR |
A |
PSW |
R0 |
R1 |
1 |
0000 |
0030 |
0000 |
0030 |
0000 |
0000 |
0000 |
0000 |
2 |
0033 |
0033 |
1620 |
0030 |
0100 |
0100 |
0000 |
0000 |
3 |
0036 |
0036 |
1620 |
0030 |
FFFE |
FFFE |
0000 |
0000 |
4 |
0100 |
0100 |
0004 |
002E |
FFFE |
002E |
0000 |
0000 |
5 |
0103 |
0103 |
1820 |
002E |
0000 |
0000 |
0000 |
0000 |
6 |
0106 |
0106 |
1620 |
002E |
0001 |
0001 |
0000 |
0000 |
7 |
0037 |
0037 |
0003 |
0030 |
0001 |
0001 |
0000 |
0000 |
8 |
0039 |
0039 |
1600 |
0030 |
0050 |
0050 |
0050 |
0000 |
9 |
003A |
003A |
0600 |
002F |
0050 |
002F |
0050 |
0000 |
10 |
003B |
003B |
0641 |
0030 |
003A |
0050 |
0050 |
0050 |
11 |
003C |
003C |
0041 |
0030 |
003A |
0028 |
0050 |
0028 |
12 |
0040 |
0040 |
0420 |
0030 |
003A |
0028 |
0050 |
0028 |
13 |
0041 |
0041 |
0481 |
0030 |
003A |
0027 |
0050 |
0027 |
14 |
0042 |
0042 |
A001 |
0030 |
0050 |
0000 |
0050 |
0027 |
15 |
0044 |
0044 |
1602 |
0030 |
0030 |
0030 |
0050 |
0027 |
验证结果与预期一致,指令功能实现。