第一天:熟悉微程序的设计和调试
一、设计目标
1、掌握微程序的设计方法
2、熟悉利用调试软件运行、调试微程序的方法
二、操作提示
1、连接实验设备
注意:请在断电状态下连接调试电缆。
2、下载FPGA配置数据
从课程网站下载CPU.sof 等文件,使用Quartus II Programmer 软件将CPU.sof 下载到
FPGA。
3、输入微程序
利用调试软件将微程序写入控存,微程序如下。
取指令微程序
取源操作数为立即数的微程序
取目的操作数为寄存器寻址的微程序
MOV指令的微程序(目的数寄存器寻址)
4、输入调机程序
今天的将调机程序就是一条指令:“ MOV #0001H, R1”。首先将指令翻译成机器码,根
据指令的编码规则,该指令的编码是:0761 0001。然后利用调试软件将指令码写入主存,
地址从主存的0030H开始。
5、调试微程序。
利用调试软件“Step”按钮控制微指令单步执行,执行结果如图 2.3所示
2.3 例2.1 MOV指令的单步运行跟踪数据
6、
微程序的执行结果:
首先分析微程序执行流程是否正确,根据前面指令微流程的设计,理论上该指令微程序
的执行顺序应该是001→002→003→004→00B→00F→016→006→018→007→031→02D→
02E→000,通过调试软件的执行结果图 2.3可以看出,该指令微程序的微指令次序是正确的。
三、设计中遇到的问
及解决方法。
取完指令后,进行操作的步骤中,执行入口的编写,以及取目的操作数与取原操作数之间的代码的编写遇到了问题,然后自己翻一翻书,大家交流了一下,最后得以解决。
第二天:取操作数微程序设计与调试
一、设计目标
完成取原操作数和取目的操作数微程序的设计。
二、指令微程序设计
取原操作数微流程
取目的操作数
20080001
1
0
0
0
2
0
0
0
0
001
PCoe, ARce
00069002
0
0
0
0
1
2
1
1
0
002
ARoe′, RD, DRce′, Pcinc
CC000003
6
3
0
0
0
0
0
0
0
003
DRoe, IRce
00000404
0
0
0
0
0
0
0
0
2
004
NOP
00000A08
0
0
0
0
0
0
0
0
5
008
NOP
取源操作数入口
00000A18
0
0
0
0
0
0
0
0
5
018
NOP
取目的操作数入口
00000831
0
0
0
0
0
0
0
0
4
031
NOP
执行指令入口
50000006
2
4
0
0
0
0
0
0
0
006
GRSoe,TRce
取源操作数 寄存器寻址
40080015
2
0
0
0
2
0
0
0
0
015
GRSoe,ARce
取源操作数 寄存器间接寻址
2008000C
1
0
0
0
2
0
0
0
0
00C
PCoe, ARce
取源操作数 寄存器变址寻址
2008000F
1
0
0
0
2
0
0
0
0
00F
PCoe, ARce
取源操作数
0006900D
0
0
0
0
1
2
1
1
0
00D
ARoe′, RD, DRce′, Pcinc
D400000E
6
5
0
0
0
0
0
0
0
00E
DRoe, Ace
40700017
2
0
1
3
0
0
0
0
0
017
GRSoe,ADD,SV
00069C10
0
0
0
0
1
2
1
1
6
010
ARoe′, RD, DRce′, Pcinc
D4000011
6
5
0
0
0
0
0
0
0
011
DRoe, Ace
取源操作数 相对寻址
20700017
1
0
1
3
0
0
0
0
0
017
PCoe,ADD,SV
C0080013
6
0
0
0
2
0
0
0
0
013
DRoe, ARce
取源操作数 间接寻址
00061014
0
0
0
0
1
2
0
1
0
014
ARoe′, RD, DRce′
C0080015
6
0
0
0
2
0
0
0
0
015
DRoe, ARce
取源操作数 直接寻址
00061016
0
0
0
0
1
2
0
1
0
016
ARoe′, RD, DRce′
D0000006
6
4
0
0
0
0
0
0
0
006
DRoe, TRce
取源操作数 立即寻址
60080015
3
0
0
0
2
0
0
0
0
015
Soe, ARce
54000007
2
5
0
0
0
0
0
0
0
007
GRSoe,Ace
取目的操作数 寄存器寻址
40080025
2
0
0
0
2
0
0
0
0
025
GRSoe,ARce
取目的操作数 寄存器间接寻址
2008001C
1
0
0
0
2
0
0
0
0
01C
PCoe, ARce
取目的操作数 寄存器变址寻址
2008001F
1
0
0
0
2
0
0
0
0
01F
PCoe, Arce
取目的操作数
0006901D
0
0
0
0
1
2
1
1
0
01D
ARoe′, RD, DRce′, Pcinc
D400001E
6
5
0
0
0
0
0
0
0
01E
DRoe, Ace
40700027
2
0
1
3
0
0
0
0
0
027
GRSoe,ADD,SV
00069C20
0
0
0
0
1
2
1
1
6
020
ARoe′, RD, DRce′, PCinc
D4000021
6
5
0
0
0
0
0
0
0
021
DRoe, Ace
取目的操作数 相对寻址
20700027
1
0
1
3
0
0
0
0
0
027
PCoe,ADD,SV
C0080023
6
0
0
0
2
0
0
0
0
023
DRoe, ARce
取目的操作数 间接寻址
00061024
0
0
0
0
1
2
0
1
0
024
ARoe′, RD, DRce′
C0080025
6
0
0
0
2
0
0
0
0
025
DRoe, ARce
取目的操作数 直接寻址
00061026
0
0
0
0
1
2
0
1
0
026
ARoe′, RD, DRce′
D4000007
6
5
0
0
0
0
0
0
0
007
DRoe, Ace
取目的操作数 立即寻址
60080025
3
0
0
0
2
0
0
0
0
025
Soe, ARce
三、测试程序、数据及运行结果
如下:
1、测试
:直接寻址,寄存器寻址
测试指令:MOV 0001 R1
指令编码:0741 0001
控存:
主存:
运行结果:
2、测试内容:立即数寻址,寄存器寻址
测试指令(或程序):MOV #1010H,R1
指令编码:0761 1010
运行结果:
四、设计中遇到的问题及解决方法。
最开始使用取目的操作数的时候,对于mov指令,不敢使用直接寻址,然后找不到结果,只会使用寄存器寻址,之后对直接寻址进行进一步了解,发现直接寻址可以把目的操作数直接存入主存当中,只要对主存进行刷新操作,即会有结果。
第三天:双操作数指令的微程序设计与调试
一、设计目标
完成ADD、ADDC、SUB、SUBB、CMP、AND、OR、XOR、TEST 9
条指令微程序的设计。
二、指令微程序设计
由上向下的微程序依次为ADD、ADDC、SUB、SUBB、CMP、AND、OR、XOR、TEST
98700E2E
4
6
1
3
0
0
0
0
7
02E
TRoe,ADD,SV,PSWce
ADD
98B00E2E
4
6
2
3
0
0
0
0
7
02E
TRoe,ADDC,SV,PSWce
ADDC
98F00E2E
4
6
3
3
0
0
0
0
7
02E
TRoe,SUB,SV,PSWce
SUB
99300E2E
4
6
4
3
0
0
0
0
7
02E
TRoe,SUBC,SV,PSWce
SUBB
98C00000
4
6
3
0
0
0
0
0
7
000
TRoe,CMP,PSWce
CMP
99700E2E
4
6
5
3
0
0
0
0
7
02E
TRoe,AND,SV,PSWce
AND
99B00E2E
4
6
6
3
0
0
0
0
7
02E
TRoe,OR,SV,PSWce
OR
9A300E2E
4
6
8
3
0
0
0
0
7
02E
TRoe,XOR,SV,PSWce
XOR
99400000
4
6
5
0
0
0
0
0
0
000
TRoe,AND,PSWce
TEST
三、测试指令、数据以及结果分析
测试内容:AND 0040H R1
指令编码:1F41 0040H
运行结果:
测试内容:
SUB #0101 (R1)
指令编码:1369 0101
运行结果:
测试指令:TEST 0048 R1
指令编码:2B41 0048
四、设计中遇到的问题及解决方法。
在执行test指令的编码时TRoe,AND,PSWce,是用AND,还是ADD,比较纠结,后来通过百度,同学间的讨论,以及进行测试比对,最后决定使用AND。通过这几天的上机,明显感觉到自己相比较前几天而言,更为熟练,遇到问题也不如之前多,自己也会想办法去解决。相信之后的几天会更加顺手。
第四天:单操作数运算和移位指令的微程序设计与调试
一、设计目标
完成单操作数运算指令INC、DEC、NOT和7条移位指令微程序的设计。
二、指令微程序设计
由上向下的微程序依次为INC、DEC、NOT和七条移位指令SAR、SHL、SHR、ROL、ROR、RCL、RCR
1A70 0E2E
0
6
9
3
0
0
0
0
7
02E
INC,SV,PSWce
INC指令
1AB0 0E2E
0
6
A
3
0
0
0
0
7
02E
DEC ,SV,PSWce
DEC指令
19F0 0E2E
0
6
7
3
0
0
0
0
7
02E
NOT,SV,PSWce
NOT指令
18100E2E
0
6
0
1
0
0
0
0
7
02E
SR,PSWce
SAR
18200E2E
0
6
0
2
0
0
0
0
7
02E
SL,PSWce
SHL
18100E2E
0
6
0
1
0
0
0
0
7
02E
SR,PSWce
SHR
18200E2E
0
6
0
2
0
0
0
0
7
02E
SL,PSWce
ROL
18100E2E
0
6
0
1
0
0
0
0
7
02E
SR,PSWce
ROR
18200E2E
0
6
0
2
0
0
0
0
7
02E
SL,PSWce
RCL
18100E2E
0
6
0
1
0
0
0
0
7
02E
SR,PSWce
RCR
三、测试指令、数据以及结果分析
1、测试指令:INC 0031H
指令编码 023A 0031
2、测试指令:Shl 0001
指令编码:005A 0040
执行前主存
刷新后的主存:
3、测试指令 INC 0035H 指令编码 023A 0035 0035→1010
运行结果:
4、测试内容:DEC +2
指令编码:0258 0002
运行结果:
5、测试指令 NOT 0035H 指令编码027A 0035
运行结果:
6、测试指令 ROL 0035H 指令编码 009A 0035
运行结果:
四、设计中遇到的问题及解决方法。
今天测试的量比较大,需要在前一天把指令准备好,进行测试的过程中出现了很多问题,比如说在执行入口的时候就没有反应了,有些编码的错误,导致后续不能执行,然后先把微地址给写在纸上,然后再与测试的指令进行比对,没有错误的话,再对指令的编码进行核对,刷新主存,控存,找出错误所在地。总之今天做的比前几天困难,量比较大,耗时较长,不如前几天的简单了。
第五天:子程序调用、堆栈和转移指令的微程序设计与调试
一、设计目标
完成CALL、RET、PUSH、POP和9条转移指令的微程序的设计
二、指令微程序设计
9条转移指令,由上向下依次为 JC、JNC、JO、JNO、JZ、JNZ、JS、JNS、JMP
微地址(H)
微指令(H)
微指令字段(H)
微命令
F0
F1
F2
F3
F4
F5
F6
F7
F8
F9
068
A4000200
5
1
0
0
0
0
0
0
1
000
ARoe,PCce
069
A4000200
5
1
0
0
0
0
0
0
1
000
ARoe,PCce
06A
A4000200
5
1
0
0
0
0
0
0
1
000
ARoe,PCce
06B
A4000200
5
1
0
0
0
0
0
0
1
000
ARoe,PCce
06C
A4000200
5
1
0
0
0
0
0
0
1
000
ARoe,PCce
06D
A4000200
5
1
0
0
0
0
0
0
1
000
ARoe,PCce
06E
A4000200
5
1
0
0
0
0
0
0
1
000
ARoe,PCce
06F
A4000200
5
1
0
0
0
0
0
0
1
000
ARoe,PCce
070
A4000200
5
1
0
0
0
0
0
0
1
000
ARoe,PCce
CALL指令
微地址(H)
微指令(H)
微指令字段(H)
微命令
F0
F1
F2
F3
F4
F5
F6
F7
F8
F9
07A
000000D0
0
0
0
0
0
0
0
0
0
0D0
0D0
F40000D1
7
5
0
0
0
0
0
0
0
0D1
SPoe,Ace
0D1
B2B000D2
5
4
A
3
0
0
0
0
0
0D2
DEC,SV,ARoe,TRce
0D2
7C0800D3
3
7
0
0
2
0
0
0
0
0D3
Soe,ARce,SPce
0D3
200300D4
1
0
0
0
0
3
0
0
0
0D4
PCoe,DRce
0D4
84052200
4
1
0
0
1
1
0
2
1
000
ARoe’,DRoe’,WR,TRoe,PCce
RET指令
微地址(H)
微指令(H)
微指令字段(H)
微命令
F0
F1
F2
F3
F4
F5
F6
F7
F8
F9
05A
0000003C
0
0
0
0
0
0
0
0
0
03C
03C
F408003D
7
5
0
0
2
0
0
0
0
03D
SPoe,Ace,ARce
03D
0276103E
0
0
9
3
1
2
0
1
0
03E
INC,SV,ARoe',RD,DRce'
03E
C400003F
6
1
0
0
0
0
0
0
0
03F
DRoe,PCce
03F
7C000200
3
7
0
0
0
0
0
0
1
000
Soe,Spce
PUSH指令
微地址(H)
微指令(H)
微指令字段(H)
微命令
F0
F1
F2
F3
F4
F5
F6
F7
F8
F9
078
0000000C0
0
0
0
0
0
0
0
0
0
0C0
0C0
F40000C1
7
5
0
0
0
0
0
0
0
0C1
SPoe,Ace
0C1
02B000C2
0
0
A
3
0
0
0
0
0
0C2
DEC,SV
0C2
7C0800C3
3
7
0
0
2
0
0
0
0
0C3
Soe,SPce,ARce
0C3
00052200
0
0
0
0
1
1
0
2
1
000
ARoe’,DRoe’,WR
POP指令
微地址(H)
微指令(H)
微指令字段(H)
微命令
F0
F1
F2
F3
F4
F5
F6
F7
F8
F9
079
000000C8
0
0
0
0
0
0
0
0
0
0C8
0C8
B00000C9
5
4
0
0
0
0
0
0
0
0C9
ARoe,TRce
0C9
F40800CA
7
5
A
0
0
0
0
0
0
0CA
SPoe,Ace,ARce
0CA
027610CB
0
0
9
0
1
2
0
1
0
0CB
ARoe’,RD,DRce’,INC,SV
0CB
800800CC
4
0
0
0
2
0
0
0
0
0CC
TRoe,ARce
0CC
7C052200
3
7
0
0
1
1
0
2
1
000
Soe,SPce,ARoe’DRoe’,WR
三、测试指令、数据以及结果分析
1、测试指令:PUSH 0031H
指令编码:0771 0031
2、测试指令:Call 0060H
指令编码:035A 0060
四、设计中遇到的问题及解决方法。
这是关于子程序调用以及返回的指令,期间用到了sp,堆栈指令,而且很多时候进行测试的时候发现,堆栈操作进行的时候,压栈压不进去,然后进行测试发现自己的执行操作停的太早了,没有执行到最后一步,还有很多命令的执行只是自己想当然,特别对于把数据存入主存,多了一步移入寄存器,再从寄存器移出来。后来进行修改,总算是对的了。
第七天