复杂模型机实验
5.3 复杂模型机设计实验
5.3.1 实验目的
综合运用所学计算机组成原理知识,设计并实现较为完整的计算机。
5.3.2 实验设备
PC机一台,TD-CMA实验系统一套。
5.3.3 实验原理
下面讲述一下模型计算机的数据格式及指令系统。 1.数据格式
模型机规定采用定点补码表示法表示数据,字长为8位,8位全用来表示数据(最高位不表示符号),数值表示范围是: 0≤X≤28-1。
2.指令设计
模型机设计三大类指令共十五条,其中包括运算类指令、控制转移类指令,数据传送类指令。运算类指令包含三种运算,算术运算、逻辑运算和移位运算,设计有6条运算类指令,分别为:ADD、AND、INC、SUB、OR、RR,所有运算类指令都为单字节,寻址方式采用寄存器直接寻址。控制转移类指令有三条HLT、JMP、BZC,用以控制程序的分支和转移,其中HLT为单字节指令,JMP和BZC为双字节指令。数据传送类指令有IN、OUT、MOV、LDI、LAD、STA共6条,用以完成寄存器和寄存器、寄存器和I/O、寄存器和存储器之间的数据交换,除MOV指令为单字节指令外,其余均为双字节指令。
3.指令格式
所有单字节指令(ADD、AND、INC、SUB、OR、RR、HLT和MOV)格式如下:
其中,OP-CODE为操作码,RS为源寄存器,
RD为目的寄存器,并规定:
IN和OUT的指令格式为:
其中括号中的1表示指令的第一字节,2表示指令的第二字节,OP-CODE为操作码,
RS为源寄存器,RD为目的寄存器,P为I/O端口号,占用一个字节,系统的I/O地址译码原理见图5-3-1(在地址总线单元)。
A6A7
A1B1A2B2G1NG2N
Y10NY11NY12NY13NY20NY21NY22NY23N
IOY0IOY1IOY2IOY3
GND
74LS139
图5-3-1 I/O地址译码原理图
由于用的是地址总线的高两位进行译码,I/O地址空间被分为四个区,如表5-3-1所示:
表5-3-1 I/O地址空间分配
系统设计五种数据寻址方式,即立即、直接、间接、变址和相对寻址,LDI指令为立即寻址,LAD、STA、JMP和BZC指令均具备直接、间接、变址和相对寻址能力。
LDI的指令格式如下,第一字节同前一样,第二字节为立即数。
LAD、STA、JMP和BZC指令格式如下。
其中M为寻址模式,具体见表5-3-2,以R2做为变址寄存器RI。
表5-3-2 寻址方式
4.指令系统
本模型机共有15条基本指令,表5-3-3列出了各条指令的格式、汇编符号、指令功能。
表5-3-3 指令描述
5.3.4 总体设计
本模型机的数据通路框图如图5-3-2所示。
图5-3-2 数据通路框图
和前面的实验相比,复杂模型机实验指令多,寻址方式多,只用一种测试已不能满足设计要求,为此指令译码电路需要重新设计。如图5-3-3所示在IR单元的INS_DEC中实现。
PT4I[7]
SE3
PT4I[6]PT4FZSE4SE2
图5-3-3 指令译码原理图
本实验中要用到四个通用寄存器R3…R0,而对寄存器的选择是通过指令的低四位,为此还得设计一个寄存器译码电路,在IR单元的REG_DEC(GAL16V8)中实现,如图5-3-4所示。
图5-3-4 寄存器译码原理图
根据机器指令系统要求,设计微程序流程图及确定微地址,如图5-3-5所示。
按照系统建议的微指令格式,见表5-3-4,参照微指令流程图,将每条微指令代码化,译成二进制代码表,见表5-3-5,并将二进制代码表转换为联机操作时的十六进制格式文件。
表5-3-4 微指令格式
23M2322CN21WR2019RDIOM18-15S3-S014-12A字段11-9B字段
8-6C字段5-0UA5-UA0
A字段
141312选择000NOP001LDA010LDB011LDRi100保留101LOAD110LDAR111
LDIR
B字段
11109选择000NOP001ALU_B010RS_B011RD_B100RI_B101保留110PC_B1
11
保留
C字段
876选择000NOP001P010P011P100保留101LDPC110保留1
11
保留
表5-3-5 二进制代码表
图5-3-5 微程序流程图
根据现有指令,在模型机上实现以下运算:从IN单元读入一个数据,根据读入数据的低4位值X,求1+2+…+X的累加和,01H到0FH共15个数据存于60H到6EH单元。
根据要求可以得到如下程序,地址和内容均为二进制数。
地 址 内 容 助记符 说 明
00000000 00100000 ; START: IN R0,00H 从IN单元读入计数初值 00000001 00000000
00000010 01100001 ; LDI R1,0FH 立即数0FH送R1 00000011 00001111
00000100 00010100 ; AND R0,R1 得到R0低四位 00000101 01100001 ; LDI R1,00H 装入和初值00H 00000110 00000000
00000111 11110000 ; BZC RESULT 计数值为0则跳转 00001000 00010110
00001001 01100010 ; LDI R2,60H 读入数据始地址 00001010 01100000
00001011 11001011 ; LOOP: LAD R3,[RI],00H 从MEM读入数据送R3,
变址寻址,偏移量为00H
00001100 00000000
00001101 00001101 ; ADD R1,R3 累加求和 00001110 01110010 ; INC RI 变址寄存加1,指向下一数据 00001111 01100011 ; LDI R3,01H 装入比较值 00010000 00000001
00010001 10001100 ; SUB R0,R3
00010010 11110000 ; BZC RESULT 相减为0,表示求和完毕 00010011 00010110
00010100 11100000 ; JMP LOOP 未完则继续 00010101 00001011
00010110 11010001 ; RESULT: STA 70H,R1 和存于MEM的70H单元 00010111 01110000
00011000 00110100 ; OUT 40H,R1 和在OUT单元显示 00011001 01000000
00011010 11100000 ; JMP START 跳转至START 00011011 00000000
00011100 01010000 ; HLT 停机
01100000 00000001 ; 数据 01100001 00000010 01100010 00000011 01100011 00000100 01100100 00000101 01100101 00000110 01100110 00000111 01100111 00001000 01101000 00001001 01101001 00001010 01101010 00001011
01101011 00001100 01101100 00001101 01101101 00001110 01101110 00001111
5.3.5 实验步骤
1. 按图5-3-6连接实验线路,仔细检查接线后打开实验箱电源。
2. 写入实验程序,并进行校验,分两种方式,手动写入和联机写入。 1) 手动写入和校验 (1) 手动写入微程序
① 将时序与操作台单元的开关KK1臵为‘停止’档,KK3臵为‘编程’档,KK4臵为‘控存’档,KK5臵为‘臵数’档。
② 使用CON单元的SD05——SD00给出微地址,IN单元给出低8位应写入的数据,连续两次按动时序与操作台的开关ST,将IN单元的数据写到该单元的低8位。
③ 将时序与操作台单元的开关KK5臵为‘加1’档。
④ IN单元给出中8位应写入的数据,连续两次按动时序与操作台的开关ST,将IN单元的数据写到该单元的中8位。IN单元给出高8位应写入的数据,连续两次按动时序与操作台的开关ST,将IN单元的数据写到该单元的高8位。
⑤ 重复①、②、③、④四步,将表5-3-5的微代码写入2816芯片中。 (2) 手动校验微程序
① 将时序与操作台单元的开关KK1臵为‘停止’档,KK3臵为‘校验’档,KK4臵为‘控存’档,KK5臵为‘臵数’档。
② 使用CON单元的SD05——SD00给出微地址,连续两次按动时序与操作台的开关ST,MC单元的指数据指示灯 M7——M0显示该单元的低8位。
③ 将时序与操作台单元的开关KK5臵为‘加1’档。 ④ 连续两次按动时序与操作台的开关ST,MC单元的指数据指示灯 M15——M8显示该单元的中8位,MC单元的指数据指示灯 M23——M16显示该单元的高8位。
⑤ 重复①、②、③、④四步,完成对微代码的校验。如果校验出微代码写入错误,重新写入、校验,直至确认微指令的输入无误为止。
(1) 手动写入机器程序
① 将时序与操作台单元的开关KK1臵为‘停止’档,KK3臵为‘编程’档,KK4臵为‘主存’档,KK5臵为‘臵数’档。
② 使用CON单元的SD7——SD0给出地址,IN单元给出该单元应写入的数据,连续两次按动时序与操作台的开关ST,将IN单元的数据写到该存储器单元。
③ 将时序与操作台单元的开关KK5臵为‘加1’档。
④ IN单元给出下一地址(地址自动加1)应写入的数据,连续两次按动时序与操作台的开关ST,将IN单元的数据写到该单元中。然后地址会又自加1,只需在IN单元输入后续地址的数据,连续两次按动时序与操作台的开关ST,即可完成对该单元的写入。
⑤ 亦可重复①、②两步,将所有机器指令写入主存芯片中。 (2) 手动校验机器程序
① 将时序与操作台单元的开关KK1臵为‘停止’档,KK3臵为‘校验’档,KK4臵为‘主存’档,KK5臵为‘臵数’档。
② 使用CON单元的SD7——SD0给出地址,连续两次按动时序与操作台的开关ST,CPU内总线的指数据指示灯 D7——D0显示该单元的数据。
③ 将时序与操作台单元的开关KK5臵为‘加1’档。
④ 连续两次按动时序与操作台的开关ST,地址自动加1,CPU内总线的指数据指示灯 D7——D0显示该单元的数据。此后每两次按动时序与操作台的开关ST,地址自动加1,CPU内总线的指数据指示灯 D7——D0显示该单元的数据,继续进行该操作,直至完成校验,如发现错误,则返回写入,然后校验,直至确认输入的所有指令准确无误。
⑤ 亦可重复①、②两步,完成对指令码的校验。如果校验出指令码写入错误,重新写入、校验,直至确认指令的输入无误为止。
2) 联机写入和校验
联机软件提供了微程序和机器程序下载功能,以代替手动读写微程序和机器程序,但是微程序和机器程序得以指定的格式写入到以TXT为后缀的文件中,本次实验程序如下,程序中分号‘;’为注释符,分号后面的内容在下载时将被忽略掉。
图5-3-6 实验接线图
; //*************************************** //
; // //
; // 复杂模型机实验指令文件 //
; // //
; // By TangDu CO.,LTD //
; // //
; //*************************************** //
; //****** Start Of Main Memory Data ****** //
$P 00 20 ; START: IN R0,00H 从IN单元读入计数初值
$P 01 00
$P 02 61 ; LDI R1,0FH 立即数0FH送R1
$P 03 0F
$P 04 14 ; AND R0,R1 得到R0低四位
$P 05 61 ; LDI R1,00H 装入和初值00H
$P 06 00
$P 07 F0 ; BZC RESULT 计数值为0则跳转
$P 08 16
$P 09 62 ; LDI R2,60H 读入数据始地址
$P 0A 60
$P 0B CB ; LOOP: LAD R3,[RI],00H 从MEM读入数据送R3,
变址寻址,偏移量为00H
$P 0C 00
$P 0D 0D ; ADD R1,R3 累加求和
$P 0E 72 ; INC RI 变址寄存加1,指向下一数据
$P 0F 63 ; LDI R3,01H 装入比较值
$P 10 01
$P 11 8C ; SUB R0,R3
$P 12 F0 ; BZC RESULT 相减为0,表示求和完毕
$P 13 16
$P 14 E0 ; JMP LOOP 未完则继续
$P 15 0B
$P 16 D1 ; RESULT: STA 70H,R1 和存于MEM的70H单元
$P 17 70
$P 18 34 ; OUT 40H,R1 和在OUT单元显示
$P 19 40
$P 1A E0 ; JMP START 跳转至START
$P 1B 00
$P 1C 50 ; HLT 停机
$P 60 01 ; 数据
$P 61 02
$P 62 03
$P 63 04
$P 64 05
$P 65 06
$P 66 07
$P 67 08
$P 68 09
$P 69 0A
$P 6A 0B
$P 6B 0C
$P 6C 0D
$P 6D 0E
$P 6E 0F
; //***** End Of Main Memory Data *****//
; //** Start Of MicroController Data **//
$M 00 000001 ; NOP
$M 01 006D43 ; PC->AR, PC加1
$M 03 107070 ; MEM->IR, P
$M 04 002405 ; RS->B
$M 05 04B201 ; A加B->RD
$M 06 002407 ; RS->B
$M 07 013201 ; A与B->RD
$M 08 106009 ; MEM->AR
$M 09 183001 ; IO->RD
$M 0A 106010 ; MEM->AR
$M 0B 000001 ; NOP
$M 0C 103001 ; MEM->RD
$M 0D 200601 ; RD->MEM
$M 0E 005341 ; A->PC
$M 0F 0000CB ; NOP, P
$M 10 280401 ; RS->IO
$M 11 103001 ; MEM->RD
$M 12 06B201 ; A加1->RD
$M 13 002414 ; RS->B
$M 14 05B201 ; A减B->RD
$M 15 002416 ; RS->B
$M 16 01B201 ; A或B->RD
$M 17 002418 ; RS->B
$M 18 02B201 ; A右环移->RD
$M 1B 005341 ; A->PC
$M 1C 10101D ; MEM->A
$M 1D 10608C ; MEM->AR, P
$M 1E 10601F ; MEM->AR
$M 1F 101020 ; MEM->A
$M 20 10608C ; MEM->AR, P
$M 28 101029 ; MEM->A
$M 29 00282A ; RI->B
$M 2A 04E22B ; A加B->AR
$M 2B 04928C ; A加B->A, P
$M 2C 10102D ; MEM->A
$M 2D 002C2E ; PC->B
$M 2E 04E22F ; A加B->AR
$M 2F 04928C ; A加B->A, P
$M 30 001604 ; RD->A
$M 31 001606 ; RD->A
$M 32 006D48 ; PC->AR, PC加1
$M 33 006D4A ; PC->AR, PC加1
$M 34 003401 ; RS->RD
$M 35 000035 ; NOP
$M 36 006D51 ; PC->AR, PC加1
$M 37 001612 ; RD->A
$M 38 001613 ; RD->A
$M 39 001615 ; RD->A
$M 3A 001617 ; RD->A
$M 3B 000001 ; NOP
$M 3C 006D5C ; PC->AR, PC加1
$M 3D 006D5E ; PC->AR, PC加1
$M 3E 006D68 ; PC->AR, PC加1
$M 3F 006D6C ; PC->AR, PC加1
; //** End Of MicroController Data **//
选择联机软件的‚【转储】—【装载】‛功能,在打开文件对话框中选择上面所保存的文件,软件自动将机器程序和微程序写入指定单元。
选择联机软件的‚【转储】—【刷新指令区】‛可以读出下位机所有的机器指令和微指令,并在指令区显示,对照文件检查微程序和机器程序是否正确,如果不正确,则说明写入操作失败,应重新写入,可以通过联机软件单独修改某个单元的指令,以修改微指令为例,先用鼠标左键单击指令区的‘微存’TAB按钮,然后再单击需修改单元的数据,此时该单元变
为编辑框,输入6位数据并回车,编辑框消失,并以红色显示写入的数据。
3. 运行程序
方法一:本机运行
将时序与操作台单元的开关KK1、KK3臵为‘运行’档,按动CON单元的总清按钮CLR,将使程序计数器PC、地址寄存器AR和微程序地址为00H,程序可以从头开始运行,暂存器A、B,指令寄存器IR和OUT单元也会被清零。
将时序与操作台单元的开关KK2臵为‘单步’档,每按动一次ST按钮,即可单步运行一条微指令,对照微程序流程图,观察微地址显示灯是否和流程一致。每运行完一条微指令,观测一次数据总线和地址总线,对照数据通路图,分析总线上的数据是否正确。
当模型机执行完OUT指令后,检查OUT单元显示的数是否正确,按下CON单元的总清按钮CLR,改变IN单元的值,再次执行机器程序,从OUT单元显示的数判别程序执行是否正确。
方法二:联机运行(软件使用说明请看附录1)
进入软件界面,选择菜单命令‚【实验】—【复杂模型机】‛,打复杂模型机实验数据通路图,选择相应的功能命令,即可联机运行、监控、调试程序。
按动CON单元的总清按钮CLR,然后通过软件运行程序,当模型机执行完OUT指令后,检查OUT单元显示的数是否正确。在数据通路图和微程序流中观测指令的执行过程,并观测软件中地址总线、数据总线以及微指令显示和下位机是否一致。