目的与要求
深入了解计算机各种指令的执行过程,以及控制器的组成,指令系统微程序设计的具体知识,进一步理解和掌握动态微程序设计的概念;完成微程序控制的特定功能计算机的指令系统设计和调试。
要进行这项大型实验,必须清楚地懂得:
- TEC-2机的功能部件及其连接关系;
- TEC-2机每个功能部件的功能与具体组成;
- TEC-2机支持的指令格式;
- TEC-2机的微指令格式,AM2910芯片的用法;
- 已实现的典型指令的执行实例,即相应的微指令与其执行次序的安排与衔接;
- 要实现的新指令的格式与功能。
实验环境
$TEC-2$模拟机
具体内容
请选定指令格式、操作码,按照要求,设计三条指令。
指令一
说明
把用绝对地址表示的内存单元
ADDR1
中的内容与内存单元ADDR2
中的内容相减,结果存于内存单元ADDR1
中。三字指令(控存入口
110H
)。格式
D8××,ADDR1,ADDR2
功能
[ADDR1]=[ADDR1]-[ADDR2]
微程序设计与实现
执行顺序 | 微指令 | 说明 |
---|---|---|
1 | $PC\to AR,PC+1 \to PC$ | 为读取第1个操作数的地址做准备 |
2 | $MEM \to R6$ | 读取第1个操作数的地址送入$R_6$ |
3 | $PC \to AR,PC+1 \to PC$ | 为读取第2个操作数的地址做准备 |
4 | $MEM \to AR$ | 读取第2个操作数的地址送入$AR$ |
5 | $R6 \to AR,MEM \to R6$ | 第1个操作数地址送$AR$,读取第2个操作数送入$R_6$ |
6 | $MEM-R6\to R6$ | 第1个操作数-第2个操作数送入$R_6$ |
7 | $R6 \to MEM$ | $R_6$送第1个操作数所在存储单元 |
- $PC\to AR,PC+1 \to PC$
1 | 0000 0E00 A0B5 5402 |
七
顺序执行,下址字段任意取值即可
六
$AM2910$命令码为14,即14号指令,顺序执行
五
$SCC、SC$
顺序执行时不需要条件测试,不需要使用$\bar{CC}$,所以这4位任意取值
$SST$
此时并非真正的运算,并且第6条微指令才是真正的运算,所以这3位任意即可
四、三
$\bar{MIO}、REQ、\bar{WE}$
不需要读写存储器或输入输出设备,所以为
10X
$MI_{8-6}$
运算结果送$B$口,运算器Y输出$A$口
$MI_{5-3}$
选择加法运算
$MI_{2-0}$
运算数选择$B$口和0,(选$A$口和0也可以,因为$A$口和$B$口是同一个寄存器)
$A$口
选$PC$,即$R_5$
二
$B$口
选$PC$,即$R_5$
$SCI$
最低位进位设置为1
$SSH$
不移位
一
$SA、SB$
选微指令中的$A$口、$B$口地址
$DC1$
因为$AR$只能接收来自运算器的结果输出信号,所以$DC1$可以任意
$DC2$
运算器输出送$AR$
- $MEM \to R6$
1 | 0000 0E00 30F0 6000 |
七
顺序执行,下址字段任意取值即可
六
$AM2910$命令码为14,即14号指令,顺序执行
五
$SCC、SC$
顺序执行时不需要条件测试,不需要使用$\bar{CC}$,所以这4位任意取值
$SST$
此时并非真正的运算,并且第6条微指令才是真正的运算,所以这3位任意即可
四、三
$\bar{MIO}、REQ、\bar{WE}$
读存储器
$MI_{8-6}$
运算结果送$B$口,运算器Y输出运算结果(并没有使用)
$MI_{5-3}$
选择加法运算
$MI_{2-0}$
运算数选择$D$和0
$A$口
任意
二
$B$口
选$R6$
$SCI$
最低位进位设置为0
$SSH$
不移位
一
$SA、SB$
$A$口任意,因为不使用$A$口;选择微指令中的$B$口地址
$DC1$
任意
$DC2$
不控制
- $PC \to AR,PC+1 \to PC$
1 | 0000 0E00 A0B5 5402 |
这条微指令和本机器指令的第一条微指令完全一样,不再做解释说明
- $MEM \to AR$
1 | 0000 0E00 10F0 0002 |
七
顺序执行,下址字段任意取值即可
六
$AM2910$命令码为14,即14号指令,顺序执行
五
$SCC、SC$
顺序执行时不需要条件测试,不需要使用$\bar{CC}$,所以这4位任意取值
$SST$
此时并非真正的运算,并且第6条微指令才是真正的运算,所以这3位任意即可
四、三
$\bar{MIO}、REQ、\bar{WE}$
读存储器
$MI_{8-6}$
运算结果不送寄存器,运算器Y输出运算结果送$AR$
$MI_{5-3}$
选择加法运算
$MI_{2-0}$
运算数选择$D$和0
$A$口
任意
二
$B$口
任意
$SCI$
最低位进位设置为0
$SSH$
不移位
一
$SA、SB$
都任意,因为不使用$A$口和$B$口
$DC1$
任意
$DC2$
运算器输出送$AR$
- $R6 \to AR,MEM \to R6$
1 | 0000 0E00 20F6 6002 |
七
顺序执行,下址字段任意取值即可
六
$AM2910$命令码为14,即14号指令,顺序执行
五
$SCC、SC$
顺序执行时不需要条件测试,不需要使用$\bar{CC}$,所以这4位任意取值
$SST$
此时并非真正的运算,并且第6条微指令才是真正的运算,所以这3位任意即可
四、三
$\bar{MIO}、REQ、\bar{WE}$
读存储器
$MI_{8-6}$
运算结果送$B$口,运算器Y输出$A$口
$MI_{5-3}$
选择加法运算
$MI_{2-0}$
运算数选择$D$和0
$A$口
$R_6$
二
$B$口
$R_6$
$SCI$
最低位进位设置为0
$SSH$
不移位
一
$SA、SB$
使用微指令中的$A$口和$B$口
$DC1$
任意
$DC2$
运算器输出送$AR$
- $MEM-R6\to R6$
1 | 0000 0E01 22D6 6000 |
七
顺序执行,下址字段任意取值即可
六
$AM2910$命令码为14,即14号指令,顺序执行
五
$SCC、SC$
顺序执行时不需要条件测试,不需要使用$\bar{CC}$,所以这4位任意取值
$SST$
此时是真正的运算,设置标志位
四、三
$\bar{MIO}、REQ、\bar{WE}$
读存储器
$MI_{8-6}$
运算结果送$B$口;运算器Y输出$A$口(并没有使用)
$MI_{5-3}$
选择减法运算
$MI_{2-0}$
运算数选择$D$和$A$口
$A$口
$R_6$
二
$B$口
$R_6$
$SCI$
最低位进位设置为0
$SSH$
不移位
一
$SA、SB$
使用微指令中的$A$口和$B$口
$DC1$
任意
$DC2$
不控制
- $R6 \to MEM$
1 | 0029 0300 1046 0010 |
七
这是最后一条微指令,下一条微指令是
A4H
。六
$AM2910$命令码为3,即3号指令,条件转移
五
$SCC、SC$
$\bar{CC}$设为0,进行转移
$SST$
此时并不是运算,所以标志位不变
四、三
$\bar{MIO}、REQ、\bar{WE}$
写存储器
$MI_{8-6}$
运算结果不送寄存器;运算器Y输出$A$口
$MI_{5-3}$
选择加法运算
$MI_{2-0}$
运算数选择0和$A$口
$A$口
$R_6$
二
$B$口
任意
$SCI$
最低位进位设置为0
$SSH$
不移位
一
$SA、SB$
使用微指令中的$A$口;$B$口任意
$DC1$
运算器输出送$IB$
$DC2$
不控制
指令测试
如下图所示,[A00H]
存储单元($ADDR1$)存储了0045H
,[A01H]
存储单元($ADDR2$)存储了0023H
,最终指令运行后[A00H]
为0022H
,实现[ADDR1]=[ADDR1]-[ADDR2]
。
指令二
说明
将一通用寄存器内容加上某内存单元内容,结果放在另一寄存器中。
双字指令(控存入口
130H
),$SR$和$DR$分别为源、目的寄存器(各4位)。格式
E0 DR SR,ADDR
功能
DR=SR+ [ADDR]
微程序设计与实现
执行顺序 | 微指令 | 说明 |
---|---|---|
1 | $PC\to AR,PC+1 \to PC$ | 为读取操作数的地址做准备 |
2 | $MEM \to AR$ | 操作数的地址送入$AR$ |
3 | $SR+MEM \to DR$ | 计算$SR$与操作数的和存入$DR$ |
- $PC\to AR,PC+1 \to PC$
1 | 0000 0E00 A0B5 5402 |
这条微指令和第一条机器指令的第一条微指令完全一样,不再做解释说明
- $MEM \to AR$
1 | 0000 0E00 10F0 0002 |
这条微指令和第一条机器指令的第四条微指令完全一样,不再做解释说明
- $SR+MEM \to DR$
1 | 0029 0301 30D0 0088 |
七
这是最后一条微指令,下一条微指令是
A4H
。六
$AM2910$命令码为3,即3号指令,条件转移
五
$SCC、SC$
$\bar{CC}$设为0,进行转移
$SST$
此时进行了运算,需要对标志位进行设置
四、三
$\bar{MIO}、REQ、\bar{WE}$
读存储器
$MI_{8-6}$
运算结果送$B$口;运算器Y输出运算结果(并没有使用)
$MI_{5-3}$
选择加法运算
$MI_{2-0}$
运算数选择$D$和$A$口
$A$口
使用机器指令中设置的$SR$,微指令中不需要给$A$口地址
二
$B$口
使用机器指令中设置的$DR$,微指令中不需要给$B$口地址
$SCI$
最低位进位设置为0
$SSH$
不移位
一
$SA、SB$
使用机器指令中的$SR、DR$
$DC1$
任意
$DC2$
不控制
指令测试
如图示,$R_0$($SR$)为0023H
,A00H
($ADDR$)存储0023H
,程序运行后$R_1$($DR$)为0046H
,实现DR=SR+ [ADDR]
。
指令三
说明
转移指令
判断两个通用寄存器内容是否相等,若相等则转移到指定绝对地址,否则顺序执行。
双字指令(控存入口
140H
),SR
和DR
分别为源、目的寄存器(各4位),ADDR
为绝对地址。提示
利用指令的
CND
字段,即$IR_{10-8}$,令$IR_{10-8}=101$,即$\bar{CC}=Z$。当
DR==SR
时Z=1
,微程序不跳转,接着执行$MEM \to PC$(即$ADDR\to PC$);而当
DR!=SR
时Z=0
,微程序跳转至A4H
。
格式
E5 DR SR,ADDR
功能
if DR==SR goto ADDR
else 顺序执行
微程序设计与实现
执行顺序 | 微指令 | 说明 |
---|---|---|
1 | $SR-DR$ | 测试$SR$与$DR$是否相等 |
2 | $PC \to AR,PC+1 \to PC,\ $如果$Z=0,$则微程序跳转到$A4H$ | 为读取转移地址做准备 |
3 | $MEM \to PC$ | 程序转移到指定地址 |
- $SR-DR$
1 | 0000 0E01 9210 0088 |
七
顺序执行,下址字段任意
六
$AM2910$命令码为14,即14号指令,顺序执行
五
$SCC、SC$
顺序执行,不需要条件测试
$SST$
此时进行了运算,需要对标志位进行设置,来判断$SR$和$DR$是否相等
四、三
$\bar{MIO}、REQ、\bar{WE}$
不进行存储器或IO操作
$MI_{8-6}$
运算结果不送寄存器;运算器Y输出运算结果(并没有使用)
$MI_{5-3}$
选择减法运算
$MI_{2-0}$
运算数选择$A$口和$B$口
$A$口
使用机器指令中设置的$SR$,微指令中不需要给$A$口地址
二
$B$口
使用机器指令中设置的$DR$,微指令中不需要给$B$口地址
$SCI$
最低位进位设置为0
$SSH$
不移位
一
$SA、SB$
使用机器指令中的$SR、DR$
$DC1$
任意
$DC2$
不控制
- $PC \to AR,PC+1 \to PC$,如果$Z=0$,则微程序跳转到$A4H$
1 | 0029 03E0 A045 5412 |
七
微程序转移,下址字段为
A4H
六
$AM2910$命令码为3,即3号指令,条件转移
五
$SCC、SC$
测试条件设置为$IR_{10-8}$,指令中将$IR_{10-8}$设为5,即$\bar{CC}=Z$
$SST$
此时并不是计算,状态位保持即可
四、三
$\bar{MIO}、REQ、\bar{WE}$
不进行存储器或IO操作
$MI_{8-6}$
运算结果送$B$口;运算器Y输出$A$口
$MI_{5-3}$
选择加法运算
$MI_{2-0}$
运算数选择$A$口和0
$A$口
$A$口设置为$PC$,即$R_5$。
二
$B$口
$B$口设置为$PC$,即$R_5$。
$SCI$
最低位进位设置为1
$SSH$
不移位
一
$SA、SB$
使用微指令中的$A$口和$B$口地址
$DC1$
由于是写$AR$,这里把运算器输出送$IB$。经过前两条机器指令的试验,实际上$DC1$可以任意。
$DC2$
写$AR$
- $MEM \to PC$
1 | 0029 0300 30F0 5000 |
七
微程序转移,下址字段为
A4H
六
$AM2910$命令码为3,即3号指令,条件转移
五
$SCC、SC$
测试条件设置为0,一定转移
$SST$
此时并不是计算,状态位保持即可
四、三
$\bar{MIO}、REQ、\bar{WE}$
读存储器
$MI_{8-6}$
运算结果送$B$口;运算器Y输出运算结果(并没有使用)
$MI_{5-3}$
选择加法运算
$MI_{2-0}$
运算数选择$D$和0
$A$口
$A$口任意,并不使用。
二
$B$口
$B$口设置为$PC$,即$R_5$。
$SCI$
最低位进位设置为0
$SSH$
不移位
一
$SA、SB$
使用微指令中的$B$口地址,$A$口任意(因为不使用$A$口)。
$DC1$
任意
$DC2$
不控制
指令测试
当$R_1$($SR$)存储0023H
、$R_2$($DR$)存储0026H
时,即$DR \neq SR$时,程序顺序执行,运行了MOV R1,0026
,所以程序运行后$R_1$为0026H
。
当$R_1$($SR$)存储0023H
、$R_2$($DR$)存储0023H
时,即$DR = SR$时,程序跳转至828H
($ADDR$),所以未运行MOV R1,0026
,所以程序运行后$R_1$仍为0023H
。
- $DR \neq SR$时
- $DR = SR$时
实验心得
- 磨刀不误砍柴工。在设计微程序前,我把实验书看了一遍,有些地方不是很懂;之后着手去设计微程序,然后再去看书,理解到的更多了;最终微程序设计完之后,我又把书看了一遍,又发现了很多之前理解不到位的地方,正所谓温故而知新。我想这最能说明实践和理论的关系吧,多动手多动脑,才能巩固对知识的理解。
- 通过本次对微指令码一位位的设计,我对于计算机的底层实现有了更深的理解,更进一步地了解了计算机的工作原理,特别是运算器、控制器、内存、寄存器等部件之间的协作。本学期也学了汇编语言,它几乎是最靠近计算机硬件的编程语言了,在本次课程设计中,自主设计硬件间的协作,又算是直接接触了硬件,巩固了汇编和计组两门学科的知识与其联系。
- 通过本次课程设计,我巩固了微程序设计的方法与思想,比如微指令、微操作、微命令、水平型微指令、微控存等基本概念,了解了微程序层次上程序员所看到的的计算机系统结构,加深了对程序员一词的理解。不同层次的程序员由于工作的“机器”不同,所以面对的问题以及其实现往往也是极为不同的。
附加材料
以下为$TEC-2$部分知识点总结。
字长
$TEC-2$机字长为16位,运算器、主存、数据与地址总线均为16位。
指令
$TEC-2$机指令有6位操作码,故支持64条指令,其中53条已实现,用于写出该机的监控程序。
$IR$:指令寄存器,存储当前正在执行的指令。
指令最高6位($IR_{15-10}$)是操作码,之后两位$IR_{9-8}$是条件码,把它用作条件转移指令的判断条件,因此可以认为这两位是指令的扩展操作码。除条件转移指令之外,其余指令不使用这两位。
主存
主存支持$64K$字,$4K\times8$的$ROM(2732)$存放监控程序,$2K\times8$的$RAM(2716)$存放用户数据及数据。
运算器
运算器主要由4片$AM2901$级联而成,可实现8种运算功能,16个双端口($A$、$B$)读出、单端口($B$)写入的通用寄存器($R_{0-15}$,其中$R_{4-6}$作为$SP$、$PC$、$IP$),另配有1片$AM2902$实现快速进位。
$IP$
保存当前正在运行的指令的地址,用于转移变址的目的。
所以在课设第一条指令中可以使用$R_6$暂存数据,因为此时不需要转移变址,用不到$IP$。
$I_{8-6}$
进行寄存器结果选择和Y输出选择
$I_{5-3}$
进行运算功能选择
$I_{2-0}$
进行数据来源选择
引脚信号
$D_{3-0}$
外部送给$AM2901$的数据信号,比如从内存读出来的数据
$Y_{3-0}$
$AM2901$向外送出的数据,受$\bar{OE}$控制。但在$TEC-2$中,$\bar{OE}$已接地
$A、B$
选择寄存器组中的源与目的寄存器。
当$A$、$B$同值时,被选中的同一个寄存器的内容将被同时送到$A$、$B$两个数据输出端口
控制器
- 控制器主要由一片$AM2910$、7片$6116(RAM,2K\times8)$(微控存)、16位的指令寄存器$IR$和2片$2716$(存储用于实现53条机器指令的微程序,加电后读取送入微控存)等组成。
- 程序计数器$PC$用运算器中的通用寄存器$R_5$代替,保存下一条指令的地址。
- 指令地址寄存器$IP$由运算器中的$R_6$代替。
- 控存字长56位,已实现的53条指令的微程序存放在2片单独的8位$ROM$中,加电的过程自动调入控存(装入微码)。
- 地址总线的输入信号仅有一组,即地址寄存器($AR$),而AR只能接收来自运算器的结果输出信号。
$AM2910$
$AM2910$,微程序定序器,作用:形成下一条微指令的地址。
三个输出使能信号
作用:决定直接输入D的来源
$\bar{MAP}$
当其有效时,$D$来源于$MAPROM$,用于实现从机器指令到相应的微程序段的转移。
$\bar{VECT}$
当其有效时,原意为$D$来源于中断向量,现用于接收手拨微地址。
$\bar{PL}$
当其有效时,$D$来源于微指令的下地址字段,用于实现微程序转移。
引脚定义
$\bar{CC}$
条件测试,当其为低电平时,测试成功,转移(使用下址字段);否则,顺序执行。
$\bar{OE}$
Y输出允许信号,低电平有效,已接地
$\bar{CCEN}$
$\bar{CC}$允许信号,已接地
16条命令
2号命令
指令功能分支,无条件转$MAP$
3号命令
条件转移,条件测试$\bar{CC}$为1时顺序执行,否则按下地址$D$转移。
14号命令
顺序执行下一条微指令
微程序
微指令格式
每位的用处已在EXCEL表格中说明。
$DC1$和$DC2$
关于这两个控制位我还有两个问题
$DC2$为$2$时
写$AR$时应把$DC2$设为2,即$AR$接收来自$IB$的数据;但$DC1$课本上都是设为0,即微型开关送$IB$。
这样不就是把微型开关送到了$AR$嘛?这不太对啊!?以下是我的猜测:
我猜在这里$DC1$应该是任意的。因为$AR$只能接收运算器的输出,所以当$DC2$设置为写$AR$时,就忽略$DC1$的设置,硬件应该可以实现。
$DC2$为$0$时
此时代表$NC$,即无寄存器接收$IB$的数据,所以此时$DC1$应该也是任意,书上写的是0。
$SSH$
常用微指令
19H
取指令,$PC$增量。
该条微指令公用于所有指令。
1AH
按新取来的指令的操作码找到该条指令本身的微程序段的入口地址。
19H之后一定是1AH。
A4H
根据有无中断请求,决定是进入中断处理过程,还是顺序执行。
任何一条机器指令执行完都要去A4H检测中断
程序调试
以第一条指令为例
前期准备
$S_2S_1S_0$
设为
100
$FS_1FS_2FS_3FS_4$
设为
1010
$STEP/CONT$
设为
CONT
输入并查看微码
E900
将微码输入到
900H
开始的内存单元中D900
查看内存
将微码加载到微控存
A800
输入加载微码的程序
1
2
3
4
50800: MOV R1,900 ; 900是微码在内存中地址
0802: MOV R2,7 ; 共7条微指令
0804: MOV R3,110 ; 微码在微控存中的首地址
0806: LDMC ;加载微码
0807: RETG800
运行上边的代码,把微码装入微控存
110H
开始的单元中
测试指令
A820
输入测试指令的程序到
820H
开始的内存单元中1
2
3
4
5
6
7
80820: MOV R0,0045
0822: MOV [A00],R0 ; [A00]单元存储45H
0824: MOV R1,0023
0826: MOV [A01],R1 ; [A01]单元存储23H
0828: NOP ; 占一个字
0829: NOP
082A: NOP
082B: RETE826
把新指令写到
826H
开始的内存单元1
0828 0000:D800 0000:0A00 0000:0A01
U820
反汇编,查看我们输入的测试指令的程序
1
2
3
4
5
6
7
80820: 2C00 0045 MOV R0, 0045
0822: 3400 0A00 MOV [0A00], R0
0824: 2C10 0023 MOV R1, 0023
0826: 3401 0A01 MOV [0A01], R1
0828: D800 DW D800
0829: 0A00 ADC R0, R0 ; 高8位为000010XX,对应指令为ADC,实际上是我们自己设计的指令
082A: 0A01 ADC R0, R1
082B: AC00 RETG820
运行从
820H
开始的程序
观察运算结果
DA00
作者:@臭咸鱼
转载请注明出处:https://chouxianyu.github.io
欢迎讨论和交流!