JUC-II CPU的微程序设计包括不同寻址方式的微指令编码(八种源操作数寻址方式、七种目的操作数寻址方式)、38种执行操作的微指令编码等。
所有的微指令编码均验证过了,对各种操作指令充分思考。最后还将各种指令汇总到一个程序里进行整体试验证,验证结果正确。
课程设计背景、目标等不过多阐述,主要记录微指令的编码以及自己画的一些流程图。
目录
(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)
(6)堆栈指令(包括PUSH、POP、CALL、RET指令)
(7)无操作数指令(包括HALT、NOP、RETI、EI、DI、中断隐指令)
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转移指令时:
8.执行HALT、NOP、RET、RETI、EI、DI指令时:
一、微指令编码
有些表格上传之后格式会乱,因此有的地方是用图片形式上传的,有些是表格直接复制上来的。
1.取指令阶段
微地址 | 微指令 | 微指令字段 | 代表微操作 | |||||||||
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 |
2.取源操作数阶段
(1)取源操作数入口
004 | 00000A08 | 5 | 008 | |||||||||
005 | 00000A08 | 5 | 008 |
(2)不同的寻址方式
①寄存器寻址
②寄存器间接寻址
③寄存器自增间接寻址
④立即寻址
⑤直接寻址
⑥间接寻址
⑦变址寻址
⑧相对寻址
3.取目的操作数阶段
(1) 取目的操作数入口
006 | 00000A28 | 5 | 028 |
(2)不同的寻址方式
①寄存器寻址
②寄存器间接寻址
③寄存器自增间接寻址
④直接寻址
⑤间接寻址
⑥变址寻址
⑦相对寻址
4.执行阶段
(1)执行阶段入口
007 | 00000800 | 4 | 000 |
(2)双操作数执行阶段微程序的设计(包括MOV、ADD、ADDC、SUB、SUBB、AND、OR、XOR、CMP、TEST)
①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 |
(3)移位指令的设计(包括SAR、SHL、SHR、ROL、ROR、RCL、RCR)
①SAR指令
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 |
(4)转移指令的设计(包括JC、JNC、JO、JNO、JZ、JNZ、JS、JNS、JMP)
①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 |
(5)单操作数指令(包括INC、DEC、NOT)
①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 |
(6)堆栈指令(包括PUSH、POP、CALL、RET指令)
①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 |
(7)无操作数指令(包括HALT、NOP、RETI、EI、DI、中断隐指令)
①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图的框架源于网络、自己加以了内容的填充,下面其他的所有图均为原创,加上做的时候时间比较紧,可能会有错误,希望读者加以检查、不要照搬。
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)双操作数指令的验证
①汇编指令的设计:
②结果分析
预期结果:
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
验证结果:
实际结果与预期结果一致。
(2)单操作数指令和移位汇编指令的验证
①汇编指令的设计:
②结果分析
预期结果:
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
验证结果:
验证结果与预期结果一致。
(3)转移类汇编指令的验证
①汇编指令的设计:
②结果分析
预期结果:
0030H:将立即数0010送至R0。
0032H:对源操作数和目的操作数使用寄存器寻址的方式,将R0的数据送至R1。
0033H:对R0和R1进行减操作,结果保存到R1中。
0034H:因为ZF=1,因此进行条件转移,转移至0040H。
0040H:对R1进行自增,R1变为0001H。
0041H:ZF=0,实现转移指令,转移到0044H。
0044H:停机指令HALT。
验证结果:
验证结果与预期结果一致。
(4)堆栈类指令的验证
①汇编指令设计:
②结果分析
预期结果:
0030H:将立即数0050H送至R0
0032H:将R0压入栈
0033H:出栈,结果保存至R1
0034H:子程序调用0039H
0039H:将立即数0039H送至R2
003BH:子程序返回
0036H:源操作数和目的操作数都是采用寄存器寻址的方式,执行MOV指令,将R2的值送给R3
验证结果:
由图可知,验证结果与预期结果一致。
(5)中断指令的验证
①汇编指令设计:
②结果分析:
预期结果:
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。
验证结果:
2.整体验证
将双操作数指令、单操作数指令、移位指令、转移指令、堆栈指令、中断指令都写入一个程序当中进行验证。(提交材料的文件名为:整体调试汇编指令.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 |
验证结果与预期一致,指令功能实现。