TEC-2 微程序设计与测试
个人理解,错误请指正:)
题目要求
将内存单元数据DATA减去用绝对地址ADDR表示的内存单元的内容,结果保存到由DR内容指定的内存单元中。
指令格式
D4 | DR | X |
ADDR | ||
DATA |
指令功能
DATA- [ADDR] → [DR]
设计分析
根据指令的功能和指令格式,先读取地址ADDR单元内容暂时放置于Q寄存器中。通过把PC→AR,此时MEM里的内容就是内存单元的数据DATA。这时,MEM-Q→Q,并将DR→AR,这时地址寄存器AR存放的正好是DR,因此只要将Q寄存器内容写入存储器就可以完成指令功能。此外,微程序中必须实现两次PC+1→PC操作,才能确保PC的正确走向。
微程序
1 100: PC→AR, PC+1→PC ;0000 0E00 A0B5 5402 2 101: MEM→AR ;0000 0E00 10F0 0002 3 102: MEM→Q ;0000 0E00 00F0 0000 4 103: PC→AR, PC+1→PC ;0000 0E00 A0B5 5402 5 104: MEM-Q→Q ;0000 0E00 02E0 0000 6 105: DR→AR ;0000 0E00 90B0 000A 7 106: Q→MEM, CC#=0 ;0029 0300 1020 0010
微码详解
PC→AR, PC+1→PC 0000 0E00 A0B5 5402
CI3-0 | /MIO REQ /WE | MI8-0 | A | B | SCi | DC1 | DC2 | ||||||||
顺序执行 |
不操作 |
F→B Y=A |
R+S |
R=0 S=B |
PC | PC | Cin取值1 | 不用管 | 地址寄存器AR | ||||||
/WE设为1把Y(PC) 送到内部总线好让AR接收 |
F=0+PC+Cin→PC Y=A=PC Y的内容会 被送到内部数据总线 |
PC默认是R5 | PC默认是R5 | PC+1→PC |
PC→AR (Y→AR) |
||||||||||
1110 | 101 | 0 1 0 | 0 0 0 | 0 1 1 | 0101 | 0101 | 01 | 000 | 010 |
注:以下A,B均为0000,不操作
MEM→AR 0000 0E00 10F0 0002
CI3-0 | /MIO REQ /WE | MI8-0 | SCi | DC1 | DC2 | ||||
顺序执行 |
存储器读 |
无 F |
R+S |
R=D S=0 |
Cin取值0 | 不用管 | 地址寄存器AR | ||
MEM的数据 送到内部总线 |
Y=F=D+0 送到内部总线 |
D+0 |
D输入端是 内部总线送来的数据 |
MEM→AR (Y=D→AR) |
|||||
1110 | 001 | 0 0 1 | 0 0 0 | 1 1 1 | 00 | 000 | 010 |
MEM→Q 0000 0E00 00F0 0000
CI3-0 | /MIO REQ /WE | MI8-0 | SCi | DC1 | DC2 | ||||
顺序执行 |
存储器读 |
F→Q Y=F |
R+S |
R=D S=0 |
Cin取值0 | 不用管 | 未使用 | ||
MEM的数据 送到内部总线 |
F=D+0→Q |
D+0 |
D输入端是 内部总线送来的数据 |
||||||
1110 | 001 | 0 0 1 | 0 0 0 | 1 1 1 | 00 | 000 | 000 |
PC→AR, PC+1→PC 0000 0E00 A0B5 5402(略)
MEM-Q→Q 0000 0E01 02E0 0000
CI3-0 | SST | /MIO REQ /WE | MI8-0 | SCi | DC1 | DC2 | |||||
顺序执行 |
接收ALU的 标志位输出值 |
存储器读 |
F→Q Y=F |
R-S |
R=D S=Q |
Cin取值0 | 不用管 | 未使用 | |||
运算可能导致 标志位的变化 |
MEM的数据 送到内部总线 |
F=D-Q→Q |
D-Q |
D输入端是 内部总线送来的数据 |
|||||||
1110 | 001 | 001 | 0 0 0 | 0 1 0 | 1 1 0 | 00 | 000 | 000 |
DR→AR 0000 0E00 90B0 000A
CI3-0 | /MIO REQ /WE | MI8-0 | SCi | SA | SB | DC1 | DC2 | ||||
顺序执行 |
不操作 |
无 Y=F |
R+S |
R=0 S=B |
Cin 取值0 |
A=A | B=DR | 不用管 |
地址寄存器 AR |
||
/WE设为1把Y 送到内部总线好让AR接收 |
Y=F=0+B 送到内部总线 |
0+B |
|
SA=0 A口的值来自A口的字段 SA=1 A口的值来自SR的字段 |
SB=0 B口的值来自B口的字段 SB=1 B口的值来自DR的字段 |
DR→AR (Y→AR) |
|||||
1110 | 101 | 0 0 1 | 0 0 0 | 1 1 0 | 00 | 0 | 1 | 000 | 010 |
Q→MEM, CC#=0, 3#, A4H 0029 0300 1020 0010
下地址MAR9-0 | CI3-0 | /MIO REQ /WE | MI8-0 | SCi | DC1 | DC2 | ||||
A4H A4H微指令的功能是依据有无中断请求, 决定是进入中断处理过程,还是顺序执行下一条指令。 这是每条机器指令完成后应该执行的一项操作。 |
条件转移 |
存储器写 |
无 Y=F |
R+S |
R=0 S=Q |
Cin取值0 | 运算器的输出 | 未使用 | ||
最后要条件转移到A4H执行后续处理程序 若有中断:→ADH∽B6H→A5H 若无中断:→A5H |
|
|
Y=F=Q |
0+Q |
|
送往内部总线IB的数据 这样MEM就能拿到Y(Q)了 |
||||
10100010 (往前补零) |
0011 | 000 | 0 0 1 | 0 0 0 | 010 | 00 | 001 | 000 |
插曲
关于如何得到微码,首先我们得利用微指令分析器。但当我戳那个小企鹅时,发生了错误……这样:
这是TABCTL32.OTX所在目录不正确的原因,且尚未加载到,可自行寻找解决方案。嘴上这么说还是给了链接【。
测试
工具:
你可以打开TEC-2模拟机,再开监控程序;也可以直接打开该文件夹下的monitor~
步骤
1. 首先,将微码输入到由0900H开始的内存单元中。用E命令输入微码,回车后输入微程序。每个数值间以空格分开,输入完毕后按回车键。如:
>E0900
2. 加载微码,以A命令输入微码。如:
>A0800
0800:MOV R1, 900 ;微码在内存中的首地址 0802:MOV R2,7 ;微指令条数 0804:MOV R3, 100 ;微码在微控制存储器中的首地址 0806:LDMC ;加载微码指令,将微码指令加载到微控制存储器中 0807:RET 0808:
3. 用G命令运行加载微码的程序。如:
>G0800
4. 用A命令输入新程序,用来测试。如:
>A0820 0820:MOV R0,0011 ; 0011→R0 0822:MOV [0890],R0 ; R0内容→内存0890地址 0824:MOV R1,0891 ; 0891→R1 0826:NOP ; NOP是空操作指令,预留单元 0827:NOP 0828:NOP 0829:RET
5. 在NOP开始的地方调用新指令用来测试。如:
>E0826 D410 0890 0111 ; 指令格式:D4DRX ADDR DATA (D410的1是R1寄存器,结果要送到的地方。在4中,我们用了 MOV R1, 0891命令,故之后可以在0891看R1的内容)
这样就调用了新指令的操作码D410,配合操作数 ADDR=0890 DATA=1111。然后:
>G0820 ; 执行首地址为0820的微程序
6. 查看结果,用D或者R命令查看程序运行后内存或寄存器状态。
>D0891
7. 运行截图:
参考
- http://www.cnblogs.com/joyeecheung/p/3687773.html
- http://www.cnblogs.com/chenshiyu/p/4457211.html
后记
给我检查的老师特别水……立刻就过了,但是TA效良大大检查我的时候,我就gg了。不过也学到了很多,下面稍微记录一下~
- PC是什么?PC在微程序当中的变化?作用是什么?
- PC是程序计数器,即program counter,默认是R5。
- 在程序当中的变化是,0827→0828→0829。
- 分别将PC指向的东西读到微程序当中。在本例中,分别对应着[ADDR],DATA,RET。
- 既然PC最开始在0827,那么D4DRX是什么时候被读的?以及D4DRX是什么,何时被定义的?
- 在程序开始之前,PC就已经读把这条指令读到IR(指令寄存器)里了。
- D4对应的是0100H为首地址的微程序。关于这个对应关系...尚不了解_(:з」∠)_
- D4DRX [ADDR] DATA都放在哪儿?
- 在本例中,通过E0826指令按序读到程序当中NOP的位置。
- 为什么在MEM-Q→Q时,需要接收ALU标志位的输出值?为什么PC+1→PC不需要呢?
- 前者需要是因为有加减运算,可能导致负的结果或者溢出等状况,所以需要接收标志位的输出。
- 后者不需要是因为PC是程序计数器,它的值是内存地址...所以并不需要接收标志位的输出。
- 为什么本例中要有DR→AR这条指令?
- 因为结果是送到DR寄存器里的地址指向的内存~
- A、E、G、D的作用都是什么?
- A:输入单条汇编指令,两次回车退出。
- E:输入多条机器指令。
- G:执行首地址为...的微程序
- D:查看内存状态
如果你问我做机组实验有什么感受的话,我只想说:我绝对不会去嵌软的……TAT