1总体设计方案 - 1 -
1.1 课程设计的目的 - 1 -
1.2利用COP2000实验平台上设计指令微指令(微程序)系统并验证,掌握微程序设计控制器的基本方法并了解指令系统与硬件结构的对应关系; - 1 -
1.3 课程设计的任务 - 1 -
1.4 详细了解并掌握COP2000模型机的微程序控制原理,通过综合实验来实现 - 1 -………………………………………………………………………………….
2设计原理 - 6 -
3设计结论和心得 - 23 -
1总体设计方案
1.1 课程设计的目的
1.利用COP2000实验平台上设计指令微指令(微程序)系统并验证,掌握微程序设计控制器的基本方法并了解指令系统与硬件结构的对应关系;
2.在部件单元电路实验的基础上,进一步将其组成,系统地构造一台基本模型计算机。
1.2 课程设计的任务
利用COP2000实验仪,详细了解该模型机的指令/微指令系统入手,以实现加法和减法运算功能为应用目标,在COP2000的集成开发环境下,设计全新的指令系统并编写对应的微程序;之后编写实现直接寻址、间接寻址、加减法、与、或、移位、跳转操作、输出操作的程序进行设计的实验。
注意:
每个设计汇编语言程序代码不得少于10条。
1.2.1 详细了解并掌握COP2000模型机的微程序控制原理,通过综合实验来实现
COP2000模型机指令系统的特点:
COP2000 模型机包括了一个标准 CPU 所具备所有部件,这些部件包括:运算器 ALU、 累加器 A、工作寄存器 W、左移门 L、直通门D、右移门R、寄存器组 R0-R3、程序计数器 PC、地址寄存器 MAR、堆栈寄存器 ST、中断向量寄存器IA、输入端口IN、输出端口寄存 器 OUT、程序存储器EM、指令寄存器 IR、微程序计数器 uPC、微程序存储器 uM,以及中 断控制电路、跳转控制电路。其中运算器和中断控制电路以及跳转控制电路用 CPLD 来实 现,其它电路都是用离散的数字电路组成。微程序控制部分也可以用组合逻辑控制来代替。
模型机为 8 位机,数据总线、地址总线都为8 位,但其工作原理与16 位机相同。相比而 言 8 位机实验减少了烦琐的连线,但其原理却更容易被学生理解、吸收。 模型机的指令码为 8 位,根据指令类型的不同,可以有 0 到 2 个操作数。指令码的最低 两位用来选择 R0-R3 寄存器,在微程序控制方式中,用指令码做为微地址来寻址微程序存 储器,找到执行该指令的微程序。而在组合逻辑控制方式中,按时序用指令码产生相应的控 制位。在本模型机中,一条指令最多分四个状态周期,一个状态周期为一个时钟脉冲,每个 状态周期产生不同的控制逻辑,实现模型机的各种功能。模型机有 24 位控制位以控制寄存 器的输入、输出,选择运算器的运算功能,存储器的读写。
24 位控制位分别介绍如下:
XRD : 外部设备读信号,当给出了外设的地址后,输出此信号,从指定外设读数据。
EMWR: 程序存储器 EM 写信号。
EMRD: 程序存储器 EM 读信号。
PCOE: 将程序计数器 PC 的值送到地址总线 ABUS 上。
EMEN: 将程序存储器 EM 与数据总线 DBUS 接通,由 EMWR 和 EMRD 决定是将 DBUS 数据写 到 EM 中,还是从 EM 读出数据送到 DBUS。
IREN: 将程序存储器 EM 读出的数据打入指令寄存器 IR 和微指令计数器 uPC。 EINT: 中断返回时清除中断响应和中断请求标志,便于下次中断。
ELP: PC 打入允许,与指令寄存器的 IR3、IR2 位结合,控制程序跳转。
MAREN:将数据总线 DBUS 上数据打入地址寄存器 MAR。
MAROE:将地址寄存器 MAR 的值送到地址总线 ABUS 上。
OUTEN:将数据总线 DBUS 上数据送到输出端口寄存器 OUT 里。
STEN: 将数据总线 DBUS 上数据存入堆栈寄存器 ST 中。
RRD: 读寄存器组 R0-R3,寄存器 R?的选择由指令的最低两位决定。
RWR: 写寄存器组 R0-R3,寄存器 R?的选择由指令的最低两位决定。
CN: 决定运算器是否带进位移位,CN=1 带进位,CN=0 不带进位。
FEN: 将标志位存入 ALU 内部的标志寄存器。
X2: X2、X1、X0 三位组合来译码选择将数据送到 DBUS 上的寄存器。
X1: 见 16 页表。
X0: WEN: 将数据总线 DBUS 的值打入工作寄存器 W 中。
AEN: 将数据总线 DBUS 的值打入累加器 A 中。
S2: S2、S1、S0 三位组合决定 ALU 做何种运算。
S1: 见 14 页表。
S0:
1.2.2 模型机寻址方式
模型机的寻址方式分五种:
累加器寻址: 操作数为累加器 A,例如“CPL A”是将累加器 A 值取反,还有些 指令是隐含寻址累加器 A,例如“OUT”是将累加器 A 的值输出到输 出端口寄存器 OUT。
寄存器寻址: 参与运算的数据在 R0-R3 的寄存器中,例如 “ADD A,R0”指令 是将寄存器 R0 的值加上累加器 A 的值,再存入累加器 A中。
寄存器间接寻址: 参与运算的数据在存储器 EM 中,数据的地址在寄存器 R0-R3 中,例 如 “MOV A,@R1”指令是将寄存器 R1 的值做为地址,把存储器 EM 中该地址的内容送入累加器 A中。
存储器直接寻址: 参与运算的数据在存储器 EM 中,数据的地址为指令的操作数。例如 “AND A,40H”指令是将存储器 EM 中 40H 单元的数据与累加器 A的值做逻辑与运算,结果存入累加器 A。
立即数寻址: 参与运算的数据为指令的操作数。例如 “SUB A,#10H”是从累加 器 A 中减去立即数 10H,结果存入累加器 A。
1.2.3该模型机指令系统的特点(包括其微指令格式的说明等):
①总体概述
该模型机的微指令是以直接表示法进行编码的,其特点是操作控制字段中的每一位代表一个微命令。这种方法的优点是简单直观,其输出直接用于控制。缺点是微指令字较长,因而使控制存储器容量较大、
②微指令格式的说明
模型机有24位控制位以控制寄存器的输入、输出,选折运算器的运算功能,存储器的读写。微程序控制器由24位控制信号,而微程序的地址又是有指令码提供的,也就是说24位控制信号是由指令码确定的。该模型机的微指令长度为24位。其中微指令中只含有微命令字段,没有微地址字段。其中微命令字段采用直接按位的表示法,哪位为0,表示选中该微操作,而微程序的地址则有指令码确定。这24位操作控制信号的功能如表1所示
表1 24位控制位
操作控制信号 控 制 信 号 的 说 明
XRD 外部设备读信号,当给出了外设的地址后,输出此信号,从指定外设读数据。
EMWR 程序存储器EM写信号。
EMRD 程序存储器EM读信号。
PCOE 将程序计数器PC的值送到地址总线ABUS上。
EMEN 将程序存储器EM与数据总线DBUS接通,由EMWR和EMRD决定是将DBUS数据写到EM中,还是从EM读出数据送到DBUS。
IREN 将程序存储器EM读出的数据打入指令寄存器IR和微指令计数器μPC。
EINT 中断返回时清除中断响应和中断请求标志,便于下次中断。
ELP PC打入允许,与指令寄存器的IR3、IR2位结合,控制程序跳转。
MAREN 将数据总线DBUS上数据打入地址寄存器MAR。
MAROE 将地址寄存器MAR的值送到地址总线ABUS上。
OUTEN 将数据总线DBUS上数据送到输出端口寄存器OUT里。
STEN 将数据总线DBUS上数据存入堆栈寄存器ST中。
RRD 读寄存器组R0~R3,寄存器R?的选择由指令的最低两位决定。
RWR 写寄存器组R0~R3,寄存器R?的选择由指令的最低两位决定。
CN 决定运算器是否带进位移位,CN=1带进位,CN=0不带进位。
FEN 将标志位存入ALU内部的标志寄存器。
X2 X2、X1、X0三位组合来译码选择将数据送到DBUS上的寄存器。
X1
X0
WEN 将数据总线DBUS的值打入工作寄存器W中。
AEN 将数据总线DBUS的值打入累加器A中。
S2 S2、S1、S0三位组合决定ALU做何种运算。
S1
S0
③ 模型机部件说明
COP2000中有7个寄存器可以向数据总线输出数据, 但在某一特定时刻只能有一个寄存器输出数据. 由控制位X2,X1,X0决定那一个寄存器输出数据。
X2 X1 X0 输出寄存器
0 0 0 IN_OE 外部输入门
0 0 1 IA_OE 中断向量
0 1 0 ST_OE 堆栈寄存器
0 1 1 PC_OE PC寄存器
1 0 0 D_OE 直通门
1 0 1 R_OE 右移门
1 1 0 L_OE 左移门
1 1 1 没有输出
COP2000中的运算器由一片EPLD实现. 有8种运算, 通过S2,S1,S0来选择。运算数据由寄存器A及寄存器W给出, 运算结果输出到直通门D。
S2 S1 S0 功能
0 0 0 A+W 加
0 0 1 A-W 减
0 1 0 A|W 或
0 1 1 A&W 与
1 0 0 A+W+C 带进位加
1 0 1 A-W-C 带进位减
1 1 0 ~A A取反
1 1 1 A 输出A
3. 微程序控制器组成及原理
微程序控制器主要由控制存储器、微指令寄存器和地址转移逻辑三大部分组成。其工作原理为:
① 将程序和数据通过输入设备送入存储器;
② 启动运行后,从存储器中取出程序指令送到控制器去识别,分析该指令要求什么事;
③ 控制器根据指令的含义发出相应的命令(如加法、减法),将存储单元中存放的操作数据取出送出运算器进行运算,再把运算结果送回存储器指定的单元中;
④ 运算任务完成后,就可以根据指令将结果通过输出设备输出。
2设计原理
2.1本次设计,将综合利用乘法的算法来实现一个数与相邻的数的乘法,并将乘数减到0,主体设计为在主程序中实现n的递减,然后调用小程序中的乘法,这样达到实现n的邻乘的目的,,且在实现邻乘的过程中,其中每次将乘数减1,直到0为止,同时将乘法算出来的中间结果暂时存放在R0里面,然后通过加减法,来实现乘数的减1,与被乘数的更新,即将中间结果替换被乘数。也实现了别的操作,如直接寻址、间接寻址、加减法、与、或、移位、跳转操作、输出操作, 这其中还有入栈和出栈的操作。
2.2小程序调用的原理:
2.2.1小程序示列:
MOV A,#00H ;立即数00H存入累加器A
LOOP: ;调用子程序
CALL INCA ;跳转到子程序
JMP LOOP ;跳转到循环
INCA:
ADD A,#1 ;累加器加1
RET ;子程序返回
END ;结束
2.2.2小程序跟踪结果:
2.2.3小程序执行结果的分析:
程序的开始执行一条取指的微指令,读入程序第一条指令。
MOV A, #00: 将累加器的值设为00H,以便下面观察A加1后的结果。
CALL 06:本指令有四个状态周期。在T3状态,根据指令码为0BCH,读出微指令值为0FF7F7FH,有效位为PCOE、MAREN,X2X1X0 的值为011(二进制),PCOE有效是将PC加1,以便在下步将PC压栈时,存入堆栈的是程序下一条指令的地址,MAREN有效及X2X1X0的 值表示从PC中读出值并送到MAR中。在T2状态,读出微指令为0FFEF7FH,有效位STEN,X2X1X0=100(二进制),表示从PC中读数据并 存入堆栈寄存器ST中。在T1状态,微指令值为0D6BFFFH,表示以MAR为地址从EM中读出数据,此数据就是子程序的地址,此时堆栈中 保存的是调用子程序下条指令的地址。将此数据送到DBUS,再存入PC中,实现程序跳转。在T0状态,按新的PC值,取出下条将要执 行的指令。
ADD A,01:本指令将累加器加1。
RET: 本指令有两个状态周期。在T1状态,上条取指操作读出的指令码为0CCH,存入IR后,IR3、IR2的值为11(二进制),取出 的微指令的值为0FEFF5FH,有效位为ELP,X2X1X0=010(二进制)表示从ST中输出数据到总线,ELP有效与IR3、IR2=11表示无条件将数 据总线DBUS的数据打入PC,实现子程序返回功能。在T0状态,按新PC取出指令,准备执行。
JMP 02: 程序无条件跳转到02地址,执行程序。
2.3.计算机中实现乘法原理
(1)无符号乘法
(1)无符号乘法
①实例演示(即,列4位乘法具体例子演算的算式):
乘数与被乘数假设为1100(12)与1000(8),结果应该为96(十进制)。
运算图示为:
1 1 0 0 被乘数
X 1 0 0 0 乘数
0 0 0 0 初始部分积
0 0 0 0 乘数最低位为0,部分积加0,被乘数左移一位,乘数右移一位
0 0 0 0
+ 0 0 0 0 情况同上
0 0 0 0 0
+ 0 0 0 0 情况同上
0 0 0 0 0 0
+ 1 1 0 0 乘数最低位为1,部分积加被乘数,被乘数左移一位,乘数右移一位
(0) 1 1 0 0 0 0 0 计算完毕,运算结果为01100000(96)
算法流程图:如下章所示
硬件原理框图:
相关说明: 将R1打入A中,R0存放的为部分积,部分积初值为0,若乘数最低位为1,之后被乘数与部分积通过ALU加和,结果存于R0中。由于上一步吗R(即被乘数)已在A中,所以直接通过X2X1X0的控制可实现A的逻辑左移1位。之后可将R2(乘数) 打入A中,通过对X2X1X0的控制可实现A的逻辑右移1位。期间判断乘数、被乘数是否为0的操作。
2.4.对应于以上算法如何分配使用COP2000实验仪中的硬件
无符号乘法对应与COP2000乘法仪的硬件具体分配情况如下表所示:
表 无符号乘法的硬件分配情况
硬件名称 实现算法功能描述
寄存器R0 计算时用来存放部分积和最后的积
寄存器R1 ① 初始化时,用来存放被乘数;
② 在程序执行的过程中,用来存放向左移后的被乘数
寄存器R2 ② 初始化时,用来存放乘数;
③ 在程序执行的过程中,用来存放向右移后的乘数
累加器A 执行ADD R?,A(加法)、SHL R?,#Ⅱ(左移1位)、SHR R?(右移一位)等命令时所必需使用的寄存器
寄存器W 执行ADD R?,A(加法)、TEST R?,#Ⅱ(测试与)等命令时所必需使用的寄存器
左移门L 用来实现相应数据左移一位的运算,并能够控制该运算的结果是否输出到数据总线。
直通们D 用来控制ALU的执行结果(未经移位)是否输出到数据总线。
右移们R 用来实现相应数据右移一位的运算,并能够控制该运算的结果是否输出到数据总线
程序计数器PC ① 控制程序按顺序正常执行;
② 当执行转移指令时,从数据线接收要跳转的地址,使程序能够按需要自动执行
③ 当要从EM中读取数据时,由PC提供地址。
存储器EM 存储指令和数据
微程序计数器UPC 向微程序存储器uM提供相应微指令的地址
微程序存储器uM 存储相应指令的微指令。微程序
输出寄存器OUT 可以将相应的运算结果输出到输出寄存器OUT
堆栈ST 可以用来暂放操作数或者对寄存器值进行保护
2.5在COP2000集成开发环境下设计的指令/微指令系统
(1)新的指令集:
助记符 机器码1 机器码2 指令说明
FATCH 实验机占用,不可修改
Mov R? #Ⅱ 寄存器传送立即数
Mov A R? 寄存器的数传送到累加器A上
Mov A @R? 寄存器间接寻址
Mov @R? A 寄存器间接寻址
Mov A #Ⅱ 累加器传送立即数
Mov MM A 吧累加器的数写入到存储器
ADD R? A 累加器和某个寄存器的数相加
ADD R? #Ⅱ 某个寄存器数加上立即数
SUB R? A 累加器与寄存器作减法
SUB R? #Ⅱ 寄存器减去立即数
PUSH A 将累加器数入栈
POP A 将累加器数出栈
IN 输入寄存器
OUT 输出寄存器
AND A #Ⅱ 与运算
OR A #Ⅱ 或运算
CPL A 按位取反
CALL MM 调用小程序
RET 返回
TEST R? #Ⅱ 测试指令
JMP MM 跳转
SHL R? 右移
SHR R? 左移
JZ MM 跳转
CMP R? A
(2)微指令集
① 将窗口切换到uM 微程序窗口, 现在此窗口中所有微指令值都是0FFFFFFH,也就是无任何操作,我们需要在此窗口输入每条指令的微程序来实现该指令的功能。
② 选择菜单[文件|保存指令系统/微程序]功能将新建的指令系统/微程序保存下来以便以后调用为了不与已有的指令系统冲突将新的指令系统/微程序保存为MY.INS。
④ 将所设计的微指令截图显示入下表中。
2.6源程序:
MOV R0,#00H ;初始化R0
MOV R1,#03H ;给R1赋值
MOV A,R1 ;吧R1的值传送到A
PUSH A ;吧A入栈
AND A,#00H ;吧A与0作于运算
OUT ;
OR A ,#00H ;吧A与0作或运算
OUT ;
CPL A ;吧A按位取反
OUT
CPL A ;再把A按位取反
OUT
MOV A,@R1 ;间接寻址
OUT
POP A ;出栈
OUT
MOV R2,#03H ;给R2赋值
TEST R2,#0FH ;检查R2末位是否为0
JZ OVER ;跳转到结束
LOOP: SUB R2,#01H ;将R2减去1
CALL INCA ;调用小程序
MOV A,R0 ;吧R0的值传给A
ADD R1,A ;吧A的值加到R1上
ADD R2,#01H ;R2加1
MOV A,R2 ; 吧R2的值传送到A
SUB R1,A ; R1值减去A的值
SUB R2,#01H ; R2减去1
JMP LOOP ;跳转到循环
INCA: TEST R2,#0FH ;检查R2末位是否为0
JZ OVER ; 跳转结束
TEST R2,#01H ; 测试末位为1,是就跳转
JZ NEXT ;跳转
MOV A,R1 ;吧R1的值传送到A中
ADD R0,A ; 吧累加器A的数与寄存器R0的数进行加和
RET ;返回
NEXT: SHL R1 ;将被乘数左移一位
SHR R2 ; 将乘数右移一位
JMP INCA ; 继续下一次判定并作乘法
OVER: JMP OVER ;死循环锁住PC的值
6.程序运行根棕
3设计结论和心得
3.1 调试运行程序时是否出现问题,是否有重新调整指令/微指令系统设计的情况出现?请在此具体说明。