第二部分 基本模型机的设计与实现
一、 实验目的
1、在掌握部件单元电路实验的基础上,进一步将其组成系统以构造一台基本模型实验计算机。
2、设计五条机器指令,并编写相应的微程序,具体上机调试,掌握整机软硬件组成概念。
二、实验内容
1、实验原理
部件实验过程中,各部件单元的控制信号是人为模拟产生的,而本次实验将能在微程序控制下自动产生各部件单元控制信号,实现特定指令的功能。这里,实验计算机数据通路的控制将由微程序控制器来完成,CPU从内存中取出一条机器指令到指令执行结束的一个指令周期全部由微指令组成的序列来完成,即一条机器指令对应一个微程序。
(1)有关微控制器部分在前一实验中已详细介绍。
(2)主存储器的读、写和运行
为了向主存储器RAM中装入程序或数据,并且检查写入是否正确以及能运行主存储器中的程序,必须设计三个控制操作微程序。
存储器读操作:
拨动总清开关后,置控制开关SWC、SWA为"0 0"时,按要求连线后,连续按"启动运行"开关,可对主存储器RAM连续手动读操作。
存储器写操作:
拨动总清开关后,置控制开关SWC、SWA为"0 1"时,按要求连线后,再按"启动运行"开关,可对主存储器RAM进行连续手动写入。
运行程序:
拨动总清开关后,置控制开关SWC、SWA为"1 1"时,按要求连线后,再按"启动运行"开关,即可转入到第01号"取址"微指令,启动程序运行。
上述三条控制指令用两个开关SWC、SWA的状态来设置,其定义如表2.1所示。
表2.1
SWC
SWA
控制台指令
0
0
读内存
0
1
写内存
1
1
启动程序
(3)指令寄存器介绍
指令寄存器用来保存当前正在执行的一条指令。当执行一条指令时,先把它从内存取到缓冲寄存器中,然后再传送到指令寄存器。指令划分为操作码和地址码字段,由二进制构成,为了执行任何一条给定的指令,必须对操作码进行测试P(1),通过节拍脉冲T4的控制以便识别所要求的操作。"指令译码器"根据指令中的操作码进行译码,强置微控器单元的微地址,使下一条微指令指向相应的微程序首地址。
(4)输入输出设备
本系统有两种外部I/O设备,一种是二进制代码开关KD0~KD7,它作为输入设备INPUT;另一种是数码显示块,它作为输出设备OUTPUT。例如:输入时,二进制开关数据直接经过三态门送到外部数据总线上,只要开关状态不变,输入的信息也不变。输出时,将输出数据送到外部数据总线上,当写信号(W/R)有效时,将数据打入输出锁存器,驱动数码块显示。
(5)设计指令
根据基本模型机的硬件设计五条机器指令:外设输入指令IN、二进制加法指令ADD、存数指令STA、输出到外设指令OUT、无条件转移指令JMP。指令格式如下:
助记符 机器指令码 说明
IN 0000 0000 "外部开关量输入"KD0~KD7的开关状态→R0
ADD addr 0001 0000 ×××× ××××; R0+[addr]→R0
STA addr 0010 0000 ×××× ××××; R0→[addr]
OUT addr 0011 0000 ×××× ××××; [addr]→BUS
JMP addr 0100 0000 ×××× ××××; [addr]→PC
说明:
指令IN为单字节指令,其余均为双字节指令,××××××××为addr对应的主存储器二进制地址码。
(6)基本模型机监控软件的设计
本模型机监控软件主要完成从输入设备读入数据,进行简单算术运算后,将结果存入内存的某个单元,最后通过输出设备输出结果。
监控软件详细如下:
地 址 内容 助记符 说 明
0000 0000 0000 0000 IN "INPUTDEVICE"→R0
0000 0001 0001 0000 ADD[0AH] R0+[0AH]→R0
0000 0010 0000 1010
0000 0011 0010 0000 STA[0BH] R0→[0BH]
0000 0100 0000 1011
0000 0101 0011 0000 OUT[0BH] [0BH]→BUS
0000 0110 0000 1011
0000 0111 0100 0000 JMP[00H] 00H→PC
0000 1000 0000 0000
0000 1001
0000 1010 0000 0001 自定义参加运算的数
0000 1011 求和结果存放单元
(7)监控程序的16进制文件格式(文件名C8JHE1):
程序: 机器指令格式说明
$ P00 00 $PXX XX
$ P01 10 十六进制地址 机器指令
$ P02 0A
$ P03 20
$ P04 0B
$ P05 30
$ P06 0B
$ P07 40
$ P08 00
$ P0A 01
微程序:
$ M00 108105 微指令格式说明
$ M01 82ED05 $MXX XXXXXXXX
$ M02 48C004 十六进制地址 微指令代码
$ M03 04E004
$ M04 05B004
$ M05 06A205
$ M06 019A95
$ M07 0DE004
$ M08 011004
$ M09 83ED05
$ M0A 87ED05
$ M0B 8EED05
$ M0C 96ED05
$ M0D 018206
$ M0E 0FE004
$ M0F 15A004
$ M10 92ED05
$ M11 94ED05
$ M12 17A004
$ M13 018005
$ M14 182004
$ M15 010A07
$ M16 81D104
$ M17 100A07
$ M18 118A06
2、实验接线
(1)J20,J21,J22接上短路片,
(2)J23,J24,J25,J26接左边;
(3)J27,J28 右边;
(4)J29不接;
(5)JA1,JA2,JA3置“接通”;
(6)JA4置“高阻”;
(7)JA5置“接通”;
(8)JA8置“微程序”
(9)JA6 置“微控”
(10)EXJ1接BUS3
3、读写程序
手动方法写代码程序(机器指令)步骤如下:
通过上一步将 机器指令对应的微代码正确地写入E2ROM 2816芯片后,再进行机器指令程序的装入和检查。
A. 将“编程开关”置“运行”位置,“运行控制”开关置“运行”位置,“运行方式”开关置“单步”位置。
B. 拨动总清开关(0→1),微地址寄存器清零,程序计数器清零。然后使控制开关SWC、SWA开关置为“0 1”,按动一次“启动运行”开关,微地址显示灯LUA0~LUA5显示“010001”,再按动一次“启动运行”开关,微地址显示灯LUA0~LUA5显示“010100”,此时数据开关的内容置为要写入的机器指令,再按动一次“启动运行”开关,即完成该条指令的写入。若仔细阅读微程序流程,就不难发现,机器指令的首地址只要第一次给出即可,PC会自动加1,所以,每次按动“启动运行”开关,只有在微地址灯显示“010100”时,才设置内容,直到所有机器指令写完。
微动方式写机器指令
“编程开关”→“运行”,“运行控制”→“运行”,“运行方式”→“单步”,总清开关“0→1”μA5 ~ μA0 = 000000 = LμA5 ~ LμA0 PC = 0000 0000 SWC SWA = 0 1
按“启动运行”
每当LμA5 ~ LμA0 = 010100时,输入机器指令代码(用KD7 ~ KD0)
注意AR灯(LAD7 ~ LAD0)显示的内存单元地址
写内存 SWC SWA=0 1
C. 写完程序后须进行检验。拨动总清开关(0→1)后,微地址清零,PC程序计数器清零,然后使控制开关SWC、SWA为“0 0”,按动“启动运行”开关,微地址灯将显示“010000”,再按“启动运行”开关,微地址灯显示为“010010”,第三次按“启动运行”开关,微地址灯显示为“010111”,此时总线数据显示灯LZD0~LZD7显示为该首地址的内容,再按动一次“启动运行”开关,微地址灯显示为“010000”,2位数码管即显示RAM中的程序。不断按动“启动运行”开关,可检查后续单元内容。
注意:每次仅在微地址灯显示为“010000”时,2位数码管显示的内容才是相应地址中的机器指令内容。
读内存 SWC SWA=0 0
4、运行程序
① 单步运行程序
A. “编程开关”置“运行”状态,“运行方式”开关置为“单步”状态,“运行控制”开关置为“运行”状态。
B. 拨动总清开关(0→1),微地址清零,PC计数器清零,程序首地址为00H。
C. 按动“启动运行”开关,即单步运行一条微指令。对照微程序流程图,观察微地址显示灯是否和流程一致。
启动运行机器指令(因为机器指令不同,所以 01H 单元的下一条微指令不定)
SWC SWA=1 1
② 连续运行程序
A. “编程开关”置“运行”状态,“运行方式”开关置为“连续”状态,“运行控制”开关置为“运行”状态。
B. 拨动总清开关,清微地址及PC计数器,按动“启动运行”开关,系统连续运行程序。如果要停止程序的运行,只需将“运行控制”开关置为“停止”状态,系统就停机。
C. 停机后,可检查数码管显示数值或存数单元0BH中的结果是否正确。
5、实验步骤
(1)根据实验原理设计数据通路框图,如图2.1所示。
当拟定"取指"微指令时,该微指令的判别测试字段为P(1)测试。由于"取指"微指令是所有微程序都使用的公用微指令,因此P(1)的测试结果出现多路分支。本机用指令寄存器的前4位I7~I4作为测试条件,出现5路分支,占用5个固定微地址单元。实验机控制操作为P(4)测试,它以控制开关SWC、SWA作为测试条件,出现了3路分支,占用3个固定微地址单元。当分支微地址单元固定后,剩下的其它地方就可以一条微指令占用控存一个微地址单元随意填写。
图2.1 数据通路框图
(2)根据机器指令画出对应的微程序流程图
1)运行微程序流程图 2)控制器流程图 |
(3)根据微程序流程图设计微指令并转换成16进制代码文件。
当全部微程序设计完毕后,应将每条微指令代码化,即按微指令格式将微程序流程图转化成二进制微代码表,再转换成16进制代码文件。请根据微程序流程图设计微指令代码,并填入表2.2。
表2.2
S3 S2 S1 S0 M CN WE B1 B0 | A | B | C | uA5----uA0 | |
00 | 0 0 0 0 0 1 0 1 1 | 0 0 0 | 0 0 0 | 1 0 0 | 0 1 0 0 0 0 |
01 | 0 0 0 0 0 1 0 1 1 | 1 1 0 | 1 1 0 | 1 1 0 | 0 0 0 0 1 0 |
02 | 0 0 0 0 0 1 0 0 1 | 1 0 0 | 0 0 0 | 0 0 1 | 0 0 1 0 0 0 |
03 | 0 0 0 0 0 1 0 0 1 | 1 1 0 | 0 0 0 | 0 0 0 | 0 0 0 1 0 0 |
04 | 0 0 0 0 0 1 0 0 1 | 0 1 1 | 0 0 0 | 0 0 0 | 0 0 0 1 0 1 |
05 | 0 0 0 0 0 1 0 1 1 | 0 1 0 | 0 0 1 | 0 0 0 | 0 0 0 1 1 0 |
06 | 1 0 0 1 0 1 0 1 1 | 0 0 1 | 1 0 1 | 0 0 0 | 0 0 0 0 0 1 |
07 | 0 0 0 0 0 1 0 0 1 | 1 1 0 | 0 0 0 | 0 0 0 | 0 0 1 1 0 1 |
08 | 0 0 0 0 0 1 0 0 0 | 0 0 1 | 0 0 0 | 0 0 0 | 0 0 0 0 0 1 |
09 | 0 0 0 0 0 1 0 1 1 | 1 1 0 | 1 1 0 | 1 1 0 | 0 0 0 0 1 1 |
0A | 0 0 0 0 0 1 0 1 1 | 1 1 0 | 1 1 0 | 1 1 0 | 0 0 0 1 1 1 |
0B | 0 0 0 0 0 1 0 1 1 | 1 1 0 | 1 1 0 | 1 1 0 | 0 0 1 1 1 0 |
0C | 0 0 0 0 0 1 0 1 1 | 1 1 0 | 1 1 0 | 1 1 0 | 0 1 0 1 1 0 |
0D | 0 0 0 0 0 1 1 0 1 | 0 0 0 | 0 0 1 | 0 0 0 | 0 0 0 0 0 1 |
0E | 0 0 0 0 0 1 0 0 1 | 1 1 0 | 0 0 0 | 0 0 0 | 0 0 1 1 1 1 |
0F | 0 0 0 0 0 1 0 0 1 | 0 1 0 | 0 0 0 | 0 0 0 | 0 1 0 1 0 1 |
10 | 0 0 0 0 0 1 0 1 1 | 1 1 0 | 1 1 0 | 1 1 0 | 0 1 0 0 1 0 |
11 | 0 0 0 0 0 1 0 1 1 | 1 1 0 | 1 1 0 | 1 1 0 | 0 1 0 1 0 0 |
12 | 0 0 0 0 0 1 0 0 1 | 0 1 0 | 0 0 0 | 0 0 0 | 0 1 0 1 1 1 |
13 | 0 0 0 0 0 1 0 1 1 | 0 0 0 | 0 0 0 | 0 0 0 | 0 0 0 0 0 1 |
14 | 0 0 0 0 0 1 0 0 0 | 0 1 0 | 0 0 0 | 0 0 0 | 0 1 1 0 0 0 |
15 | 0 0 0 0 0 1 1 1 0 | 0 0 0 | 1 0 1 | 0 0 0 | 0 0 0 0 0 1 |
16 | 0 0 0 0 0 1 0 0 1 | 1 0 1 | 0 0 0 | 1 1 0 | 0 0 0 0 0 1 |
17 | 0 0 0 0 0 1 1 1 0 | 0 0 0 | 1 0 1 | 0 0 0 | 0 1 0 0 0 0 |
18 | 0 0 0 0 0 1 1 0 1 | 0 0 0 | 1 0 1 | 0 0 0 | 0 1 0 0 0 1 |
(4)读写程序
手动方法写微程序参看实验三。
手动方法写代码程序(机器指令)步骤如下:
通过上一步将机器指令对应的微代码正确地写入E2ROM 2816芯片后,再进行机器指令程序的装入和检查。
A. 将"编程开关"置" 运行 "位置,"运行控制"开关置" 运行 "位置,"运行方式"开关置" 单步 "位置。
B. 拨动总清开关(0→1),微地址寄存器清零,程序计数器清零。然后使控制开关SWC、SWA开关置为" 0 1 ",按动一次" 启动运行 "开关,微地址显示灯LUA0~LUA5显示" 010001 ",再按动一次" 启动运行 "开关,微地址显示灯LUA0~LUA5显示" 010100 ",此时数据开关的内容置为要写入的机器指令,再按动一次" 启动运行 "开关,即完成该条指令的写入。若仔细阅读微程序流程,就不难发现,机器指令的首地址只要第一次给出即可,PC会自动加1,所以,每次按动" 启动运行 "开关,只有在微地址灯显示" 010100 "时,才设置内容,直到所有机器指令写完。
C. 写完程序后须进行检验。拨动总清开关(0→1)后,微地址清零,PC程序计数器清零,然后使控制开关SWC、SWA为" 0 0 ",按动"启动运行"开关,微地址灯将显示" 010000 ",再按" 启动运行 "开关,微地址灯显示为" 010010 ",第三次按" 启动运行 "开关,微地址灯显示为" 010111 ",此时总线数据显示灯LZD0~LZD7显示为 该首地址的内容 ,再按动一次" 启动运行 "开关,微地址灯显示为
" 010000 ",2位数码管即显示 RAM中的程序 。不断按动" 启动运行 "开关,可检查后续单元内容。
注意:每次仅在微地址灯显示为" 010000 "时,2位数码管显示的内容才是相应地址中的机器指令内容。
(5)运行程序
①单步运行程序
A. "编程开关"置" 运行 "状态,"运行方式"开关置为" 单步 "状态,"运行控制"开关置为" 运行 "状态。
B. 拨动总清开关(0→1),微地址清零,PC计数器清零,程序首地址为00H。
C. 按动" 启动运行 "开关,即单步运行一条微指令。对照微程序流程图,观察微地址显示灯是否和流程一致。
②连续运行程序
A. "编程开关"置" 运行 "状态,"运行方式"开关置为" 连续 "状态,"运行控制"开关置为" 运行 "状态。
B. 拨动总清开关,清微地址及PC计数器,按动" 启动运行 "开关,系统连续运行程序。如果要停止程序的运行,只需将"运行控制"开关置为" 停止 "状态,系统就停机。
C.停机后,可检查存数单元0BH中的结果是否正确。
问题:如何检查存数单元0BH中的结果?请写出详细步骤。
步骤如下:
将SWC,SWA都置为1,运行控制开关置为“运行”,运行方式置为“单步”,编程开关置为“读”,再将微地址输入端uA5~ Ua0置为“001011”,按“启动运行”开关,即可观察结果。
三、根据图2.1基本机组成图,分析其工作原理。
机器指令
存放数据
内存RAM
机器指令功能
地址
内容
十六进制
地址
内容
IN
0000 0000
0000 0000
00H
00H
输入指令:SWB-BUS
ADD [0AH]
0000 0001
0001 0000
01H
10H
加法:R0+[0AH]—R0
0000 0010
0000 1010
02H
0AH
STA [0BH]
0000 0011
0010 0000
03H
20H
存数:R0—[0BH]
0000 0100
0000 1011
04H
0BH
OUT [0BH]
0000 0101
0011 0000
05H
30H
输出:[0BH]—BUS
0000 0110
0000 1011
06H
0BH
JMP [00H]
0000 0111
0100 0000
07H
40H
跳转:00H—PC
0000 1000
0000 0000
08H
00H
自定义单元
0000 1001
09H
操作数存放单元
0000 1010
0AH
01H
运算结果存放单元
0000 1011
0BH
四、给出读写五条机器指令过程和验证结果。
机器指令
微程序入口地址
微地址
微操作
微代码
微指令功能说明
0区 1区
2区
IN
01H
01H
PC—AR PC+1
05
ED
82
取指微操作
02H
RAM—BUS BUS—IR
04
C0
48
08H
SWB—R0
04
10
01
执行指令微操作
外部数据开关给R0输入数据
机器指令
微程序入口地址
微地址
微操作
微代码
微指令功能说明
0区 1区
2区
ADD
09H
01H
PC-AR PC+1
05
ED
82
取指令,译码
02H
RAM-BUS BUS-IR
04
C0
48
09H
PC-AR PC+1
05
ED
83
加法
03H
RAM-BUS BUS-AR
04
E0
04
04H
RAM-BUS BUS-DR2
04
B0
05
05H
R0-DR1
05
A2
06
06H
(DR1)+(DR2)-R0
95
9A
01
机器指令
微程序入口地址
微地址
微操作
微代码
微指令功能说明
0区 1区
2区
STA
0AH
01H
PC-AR PC+1
05
ED
82
取指令,译码
02H
RAM-BUS BUS-IR
04
C0
48
0AH
PC-AR PC+1
05
ED
87
存数
07H
RAM-BUS BUS-AR
04
E0
0D
0DH
R0-BUS BUS-RAM
06
82
01
机器指令
微程序入口地址
微地址
微操作
微代码
微指令功能说明
0区 1区
2区
OUT
0BH
01H
PC-AR PC+1
05
ED
82
取指令译码
02H
RAM-BUS BUS-IR
04
C0
48
0BH
PC-AR PC+1
05
ED
8E
输出
0EH
RAM-BUS BUS-AR
04
E0
0F
0EH
RAM-BUS BUS-DR1
04
A0
15
15H
DR1-LED
07
0A
01
机器指令
微程序入口地址
微地址
微操作
微代码
微指令功能说明
0区 1区
2区
JMP
0CH
01H
PC-AR PC+1
05
ED
82
取指令,译码
02H
RAM-BUS BUS-IR
04
C0
48
0CH
PC-AR PC+1
05
ED
96
JMP
16H
RAM-BUS BUS-PC
04
D1
81
五、实验总结
手动操作时,系统按照程序编写方式,逐一执行代码:提取机器指令、放入指令寄存器、测试、执行所需操作…执行上述操作的同时,也需要手动的操作IN单元、开关单元、WR、RD等,从而完成一系列的指令操作。最后程序正确的执行,并得出最后正确结果。联机操作时,通过写入需要执行的程序、微程序命令,在CMA软件中进行仿真实验,在实验模型中,可以看到执行每一条指令所进行的一系列操作,同时观察出数据的流向、各个门的开闭。运行到最后,得出正确结果。
无论是手动操作还是联机操作,都可以正确的执行写入的程序指令,得出正确的结果。通过两次不同实验的对比,我们可以发现,其实微程序起的作用就是将所有指令需要执行的操作编写成一条条的微操作,形成一个微程序库。当执行不同的指令时,同时调出对应的微操作,完成指令操作。
通过这次的微程序控制实验,自己深有体会。原来计算机处理程序指令是通过先提取指令、送往指令寄存器,然后利用判断电路对指令类型进行测试,再进行相应的指令操作。在判断数据的流向、存储器的打开等选择上,这时就靠微程序起作用了。在手动操作运行程序时,我们通过逐步手动的控制输入输出流、WR、RD等控制信号,从而进行一系列的指令操作,完成所需运算。而微程序起的作用就是人为的把需要执行指令所需的“人为动作”,全部以微指令的方式存储起来,当需要执行相应的微指令时,直接从微存中调出微程序即可。所以,微程序起的作用简而言之就是替代手工的操作,使得计算机可以按照一定的逻辑关系运行,这同样也是计算机可以在没有人的操作下独立运行人们所编写的原因,同时也保持了绝对的准确性。通过手动操作运行程序和联机运行程序的对比,明白了原来微程序是以程序命令的方式模拟手动操作。这样计算机的准确性也就同时上了一个新的台阶。