CPTH说明书
发布时间:2011-11-28 10:37:23
发布时间:2011-11-28 10:37:23
第一章 系统概述
1.1 DJ-CPTH简介
DJ-CPTH型计算机组成原理实验系统<以下简称系统>,是由江苏启东市东疆计算机有限公司结合国内同类产品的优点,最新研制开发的超强型实验计算机装置<以下简称模型机>。该系统采用单片机管理和EDA控制技术,自带键盘和液晶显示器,支持脱机和联PC机两种工作模式,运用系统监控和数码管等实时监视,全面动态管理模型机的运行和内部资源。模型机软硬件配置完整,支持8位字长的多种寻址方式,指令丰富,系统支持RS-232C串行通讯,并配有以win98/2000/XP为操作平台的动态跟踪集成调试软件,示教效果极佳,特别适用于计算机组成原理课程的教学与实验。
1.2 DJ-CPTH特点
1、采用总线结构
总线结构的计算机具有结构清晰,扩展方便等优点。DJ-CPTH实验系统使用三组总线即地址总线ABUS、数据总线DBUS、指令总线IBUS和控制信号,CPU、主存、外设和管理单片机等部件之间通过外部数据总线传输, CPU内部则通过内部数据总线传输信息。各部件之间,通过三态缓冲器作接口连接,这样一方面增强总线驱动能力,另一方面在模型机停机时,三态门输出浮空,能保证不管模型机的CPU工作是否正常,管理单片机总能读/写主存或控存。
2、计算机功能模块化设计
DJ-CPTH为实验者提供运算器模块ALU,众多寄存器模块(A,W,IA ,ST,MAR,R0…R3等),程序计数器模块PC,指令部件模块IR,主存模块EM,微程序控制模块〈控存〉uM,微地址计数器模块UPC,组合逻辑控制模块及I/O等控制模块。各模块间的电源线、地线、地址总线和数据总线等已分别连通,模块内各芯片间数据通路也已连好,各模块的控制信号及必要的输出信号已被引出到主板插孔,供实验者按自己的设计进行连接。
3、智能化控制
系统在单片机监控下,管理模型机运行和读写,当模型机停机时,实验者可通过系统键盘,读写主存或控存指定单元的内容,使模型机实现在线开发。模型机运行时,系统提供单步一条微指令(微单步)、单步一条机器指令(程单步),连续运行程序及无限止暂停等调试手段,能动态跟踪数据,流向、捕捉各种控制信息,实时反映模型机现场,使实验者及时了解程序和微程序设计的正确性,便以修改。
4、提供两种实验模式
①手动运行“Hand……”:通过拨动开关和发光二极管二进制电平显示,支持最底层的手动操作方式的输入/输出和机器调试。
②自动运行:通过系统键盘及液晶显示器或PC机,直接接输入或编译装载用户程序<机器码程序和微程序>,实现微程序控制运行,运用多种调试手段运行用户程序,使实验者对计算机组成原理一目了然。
5、开放性设计
运算器采用了EDA技术设计,随机出厂时,已提供一套已装载的方案,能进行加、减、与、或、带进位加、带进位减、取反、直通八种运算方式,若用户不满意该套方案,可自行重新设计并通过JTAG 口下载。逻辑控制器由CPLD实现,也可进行重新设计并通过JTAG 口下载。用户还可以设计自己的指令/微指令系统。系统中已带三套指令/微程序系统,用户可参照来设计新的指令/微程序系统。
系统的数据线、地址线、控制线均在总线接口区引出,并设计了40 芯锁进插座,供用户进行RAM、8251、8255、8253、8259等接口器件的扩展实验。
6、支持中断实验
采用最底层的器件设计,让学生可以从微程序层面上学习中断请求、中断响应、中断处理、中断入口地址的产生、中断服务程序及中断返回(RETI)整个过程。
7、支持两种控制器实验
系统提供两种控制器方式,即微程序控制器和组合逻辑控制器。在微程序控制器中,系统能提供在线编程,实时修改程序,显示程序并进行调试的操作环境。组合逻辑控制器,已下载有一套完整的实验方案,用户也可使用CPLD工具在PC机上进行自动化设计。
8、支持子程序调用、返回、指令流水线和RISC精简指令系统实验。
9、配备以Win98/2000/XP为操作平台的集成调试软件包
系统支持RS-232C串行通讯,借助PC资源形成了强大的在线文档与图形的动态管理系统,自带编译器,支持汇编语言的编辑、编译、调试,一次点击即可完成程序和与其对应微程序的链接装载并自动弹出调试窗口,在主界面中开辟了程序和与其对应微程序的调试、模型机结构示意图(点击各模块即可修改双向模块参数)、微程序等跟踪显示窗口,供用户选择,可动态显示数据流向、实时捕捉数据、地址、控制总线的各种信息,使调试过程极为生动形象。
1.3 实验系统组成
CPTH计算机组成原理实验系统由实验平台、开关电源、软件三大部分组成。
实验平台上有寄存器组R0-R3、运算单元、累加器A、暂存器W、直通/左移/右移单元、地址寄存器、程序计数器、堆栈、中断源、输入/输出单元、存储器单元、微地址寄存器、指令寄存器、微程序控制器、组合逻辑控制器、扩展单元、总线接口区、微动开关/指示灯、逻辑笔、脉冲源、管理单片机、24个按键、字符式LCD、RS232。
第二章 模型机模块实验
对于硬件的描述可以有多种方法:如原理图,真值表,高级语言(本手册使用ABEL/VHDL),时序图等,在本手册中可以使用以上的四种方式来综合描述硬件。
2.1 寄存器实验
实验要求:利用CPTH 实验仪上的K16..K23 开关做为DBUS 的数据,其它开关做为控制信号,将数据写入寄存器,这些寄存器包括累加器A,工作寄存器W,数据寄存器组R0..R3,地址寄存器MAR,堆栈寄存器ST,输出寄存器OUT。
实验目的:了解模型机中各种寄存器结构、工作原理及其控制方法。
实验电路:寄存器的作用是用于保存数据的,因为我们的模型机是8位的,因此在本模型机中大部寄存器是8 位的,标志位寄存器(Cy, Z)是二位的。
CPTH 用74HC574 来构成寄存器。74HC574 的功能如下:
1. 在CLK的上升沿将输入端的数据打入到8 个触发器中
2. 当OC = 1 时触发器的输出被关闭,当OC=0 时触发器的输出数据
74HC574工作波形图
实验1:A,W 寄存器实验
寄存器A原理图
寄存器W 原理图
寄存器A,W 写工作波形图
连接线表:
系统清零和手动状态设定:K23-K16开关置零,按[RST]钮,按[TV/ME]键三次,进入"Hand......"手动状态。
在后面实验中实验模式为手动的操作方法不再详述.
将55H写入A寄存器
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据55H
置控制信号为:
按住STEP脉冲键,CK由高变低,这时寄存器A的黄色选择指示灯亮,表明选择A寄存器。放开STEP键,CK由低变高,产生一个上升沿,数据55H被写入A寄存器。
将66H写入W寄存器
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据66H
置控制信号为:
按住STEP脉冲键,CK由高变低,这时寄存器W 的黄色选择指示灯亮,表明选择W寄存器。放开STEP 键,CK 由低变高,产生一个上升沿,数据66H 被写入W 寄存器。
注意观察:
1.数据是在放开STEP键后改变的,也就是CK的上升沿数据被打入。
2.WEN,AEN为高时,即使CK有上升沿,寄存器的数据也不会改变。
实验2:R0,R1,R2,R3 寄存器实验
寄存器R 原理图
寄存器R 写工作波形图
连接线表
将11H写入R0寄存器
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据11H
置控制信号为:
按住STEP 脉冲键,CK 由高变低,这时寄存器R0 的黄色选择指示灯亮,表明选择R0 寄存器。放开STEP键,CK由低变高,产生一个上升沿,数据11H 被写入R0 寄存器。
将22H写入R1寄存器
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据22H
置控制信号为:
按住STEP 脉冲键,CK 由高变低,这时寄存器R1 的黄色选择指示灯亮,表明选择R1 寄存器。放开STEP键,CK由低变高,产生一个上升沿,数据22H被写入R1 寄存器。
将33H写入R2寄存器
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据33H
置控制信号为:
按住STEP 脉冲键,CK 由高变低,这时寄存器R2 的黄色选择指示灯亮,表明选择R2 寄存器。放开STEP键,CK由低变高,产生一个上升沿,数据33H被写入R2 寄存器。
将44H写入R3寄存器
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据44H
置控制信号为:
按住STEP 脉冲键,CK 由高变低,这时寄存器R3 的黄色选择指示灯亮,表明选择R3 寄存器。放开STEP键,CK由低变高,产生一个上升沿,数据44H被写入R3 寄存器。
注意观察:
1. 数据是在放开STEP键后改变的,也就是CK的上升沿数据被打入。
2. K1(SB), K0(SA) 用于选择寄存器。
寄存器R读工作波形图
读R0寄存器
置控制信号为:
这时寄存器R0 的红色输出指示灯亮,R0 寄存器的数据送上数据总线。此时数据总线指示灯L7... L0为:00010001. 将K11(RRD)置为1,关闭R0 寄存器输出。
读R1寄存器
置控制信号为:
这时寄存器R1 的红色输出指示灯亮,R1 寄存器的数据送上数据总线。此时数据总线指示灯L7... L0为: 00100010. 将K11(RRD)置为1, 关闭R1 寄存器输出。
读R2寄存器
置控制信号为:
这时寄存器R2 的红色输出指示灯亮,R2 寄存器的数据送上数据总线。此时数据总线指示灯L7... L0为: 00110011. 将K11(RRD)置为1, 关闭R2 寄存器输出。
读R3寄存器
置控制信号为:
这时寄存器R3 的红色输出指示灯亮,R3 寄存器的数据送上数据总线。此时数据总线指示灯L7... L0为: 01000100. 将K11(RRD)置为1, 关闭R3 寄存器输出。
注意观察:
1.数据在K11(RRD)为0 时输出,不是沿触发,与数据打入不同。
实验3:MAR 地址寄存器,ST 堆栈寄存器,OUT输出寄存器
寄存器MAR原理图
寄存器ST 原理图
寄存器OUT原理图
寄存器MAR,ST,OUT写工作波形图
连接线表
将12H写入MAR寄存器
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据12H
置控制信号为:
按住STEP脉冲键,CK由高变低,这时寄存器MAR的黄色选择指示灯亮,表明选择MAR寄存器。放开STEP键,CK由低变高,产生一个上升沿,数据12H被写入MAR寄存器。
K14(MAROE)为0, MAR寄存器中的地址输出,MAR 红色输出指示灯亮。
将K14(MAROE)置为1,关闭MAR输出。
将34H写入ST寄存器
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据34H
置控制信号为:
按住STEP 脉冲键,CK 由高变低,这时寄存器ST 的黄色选择指示灯亮,表明选择ST 寄存器。放开STEP键,CK由低变高,产生一个上升沿,数据34H被写入ST 寄存器。
将56H写入OUT寄存器
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据56H
置控制信号为:
按住STEP 脉冲键,CK 由高变低,这时寄存器OUT 的黄色选择指示灯亮,表明选择OUT 寄存器。放开STEP 键,CK 由低变高,产生一个上升沿,数据56H 被写入OUT寄存器。
2.2 运算器实验
实验要求:利用CPTH 实验仪的K16..K23 开关做为DBUS 数据,其它开关做为控制信号,将数据写累加器A和工作寄存器W,并用开关控制ALU的运算方式,实现运算器的功能。
实验目的:了解模型机中算术、逻辑运算单元的控制方法。
实验电路:CPTH 中的运算器由一片CPLD实现,有8 种运算,通过S2,S1,S0 来选择,运算数据由寄存器A及寄存器W 给出,运算结果输出到直通门D。
连接线表
将55H写入A寄存器
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据55H
置控制信号为:
按住STEP脉冲键,CK由高变低,这时寄存器A的黄色选择指示灯亮,表明选择A寄存器。放开STEP键,CK由低变高,产生一个上升沿,数据55H被写入A寄存器。
将33H写入W寄存器
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据33H
置控制信号为:
按住STEP脉冲键,CK由高变低,这时寄存器W 的黄色选择指示灯亮,表明选择W寄存器。放开STEP 键,CK 由低变高,产生一个上升沿,数据33H 被写入W 寄存器。
置下表的控制信号,检验运算器的运算结果
注意观察:
运算器在加上控制信号及数据(A,W)后,立刻给出结果,不须时钟。
2.3 数据输出实验/移位门实验
实验要求:利用CPTH 实验仪的开关做为控制信号,将指定寄存器的内容读到数据总线DBUS上。
实验目的:1、了解模型机中多寄存器接数据总线的实现原理。
2、了解运算器中移位功能的实现方法。
实验电路:CPTH 中有7 个寄存器可以向数据总线输出数据,但在某一特定时刻只能有一个寄存器输出数据,由X2,X1,X0决定那一个寄存器输出数据。
数据输出选择器原理图
连接线表
实验1:数据输出实验
置下表的控制信号,检验输出结果
实验2:移位实验
ALU直接输出和零标志位产生原理图
ALU左移输出原理图
ALU右移输出原理图
直通门将运算器的结果不移位送总线。当X2X1X0=100 时运算器结果通过直通门送到数据总线。同时,直通门上还有判0 电路,当运算器的结果为全0 时,Z=1,右移门将运算器的结果右移一位送总线。当X2X1X0=101 时运算器结果通过右通门送到数据总线。具体内部连接是:
Cy 与 CN →DBUS7
ALU7→DBUS6
ALU6→DBUS5
ALU5→DBUS4
ALU4 → DBUS3
ALU3 → DBUS2
ALU2 → DBUS1
ALU1 → DBUS0
Cy 与 CN → DBUS7
当不带进位移位时(CN=0):
0 →DBUS7
当带进位移位时(CN=1):
Cy →DBUS7
左移门将运算器的结果左移一位送总线。当X2X1X0=110 时运算器结果通过左通门送到数据总线。具体连线是:
ALU6 →DBUS7
ALU5→ DBUS6
ALU4→ DBUS5
ALU3→ DBUS4
ALU2→ DBUS3
ALU1→ DBUS2
ALU0→ DBUS1
当不带进位移位时(CN=0):
0 → DBUS0
当带进位移位时(CN=1):
Cy→ DBUS0
将55H写入A寄存器
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据55H
置控制信号为:
按住STEP脉冲键,CK由高变低,这时寄存器A的黄色选择指示灯亮,表明选择A寄存器。放开STEP键,CK由低变高,产生一个上升沿,数据55H被写入A寄存器。
S2S1S0=111 时运算器结果为寄存器A内容
注意观察:
移位与输出门是否打开无关,无论运算器结果如何,移位门都会给出移位结果。但究竟把那一个结果送数据总线由X2X1X0输出选择决定。
2.4 微程序计数器uPC 实验
实验要求:利用CPTH实验仪上的K16..K23 开关做为DBUS的数据,其它开关做为控制信号,实现微程序计数器uPC的写入和加1功能。
实验目的:1、了解模型机中微程序的基本概念。
2、了解uPC的结构、工作原理及其控制方法。
实验电路:
74HC161 是一片带预置的4 位二进制记数器。功能如下:
当RST = 0 时,记数器被清0
当IREN = 0 时,在CK的上升沿,预置数据被打入记数器
当IREN = 1 时,在CK的上升沿,记数器加一
TC为进位,当记数到F(1111)时,TC=1
CEP,CET 为记数使能,当CEP,CET=1 时,记数器工作,CEP,CET=0 时,记数器保持原记数值
uPC原理图
uPC工作波形图
在CPTH 中,指令IBUS[7:0]的高六位被接到uPC 预置的高六位,uPC 预置的低两位被置为0。一条指令最多可有四条微指令。
微程序初始地址为复位地址00,微程序入口地址由指令码产生,微程序下一地址有计数器产生。
连接线表
实验1:uPC 加一实验
置控制信号为:
按一次STEP脉冲键,CK产生一个上升沿,数据uPC 被加一。
实验2:uPC 打入实验
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据12H
置控制信号为:
当EMWR,EMEN=0时,数据总线(DBUS)上的数据被送到指令总线(IBUS)上。
按住STEP脉冲键,CK由高变低,这时寄存器uPC的黄色预置指示灯亮,表明uPC被预置。放开STEP键,CK由低变高,产生一个上升沿,数据10H被写入uPC寄存器。
2.5 PC 实验
实验要求:利用CPTH 实验仪上的K16..K23 开关做为DBUS 的数据,其它开关做为控制信号,实现程序计数器PC的写入及加1 功能。
实验目的:1、了解模型机中程序计数器PC的工作原理及其控制方法。2、了解程序执行过程中顺序和跳转指令的实现方法。
实验电路:
PC 是由两片74HC161构成的八位带预置记数器,预置数据来自数据总线。记数器的输出通过74HC245(PCOE)送到地址总线。PC 值还可以通过74HC245(PCOE_D)送回数据总线。
PC 原理图
在CPTH 中,PC+1 由PCOE 取反产生。
当RST = 0 时,PC 记数器被清0
当LDPC = 0 时,在CK的上升沿,预置数据被打入PC记数器
当PC+1 = 1 时,在CK的上升沿,PC记数器加一
当PCOE = 0 时,PC值送地址总线
PC打入控制原理图
PC 打入控制电路由一片74HC151 八选一构成(isp1016实现)。
当ELP=1 时,LDPC=1,不允许PC被预置
当ELP=0 时,LDPC 由IR3,IR2,Cy,Z确定
当IR3 IR2 = 1 X 时,LDPC=0,PC 被预置
当IR3 IR2 = 0 0 时,LDPC=非Cy,当Cy=1时,PC 被预置
当IR3 IR2 = 0 1 时,LDPC=非Z,当Z=1 时,PC 被预置
连接线表
实验1:PC 加一实验
置控制信号为:
按一次STEP脉冲键,CK产生一个上升沿,数据PC 被加一。
实验2:PC 打入实验
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据12H
置控制信号为:
每置控制信号后,按一下STEP键,观察PC的变化。
2.6 存储器EM 实验
实验要求:利用CPTH 实验仪上的K16..K23 开关做为DBUS 的数据,其它开关做为控制信号,实现程序存储器EM 的读写操作。
实验目的:了解模型机中程序存储器EM 的工作原理及控制方法。
实验电路:
存储器EM 由一片6116RAM 构成,是用户存放程序和数据的地方。存储器EM 通过一片74HC245 与数据总线相连。存储器EM 的地址可选择由PC或MAR 提供。
存储器EM 的数据输出直接接到指令总线IBUS,指令总线IBUS 的数据还可以来自一片74HC245。当ICOE 为0 时,这片74HC245 输出中断指令B8。
EM原理图
连接线表
实验1:PC/MAR 输出地址选择
置控制信号为:
以下存贮器EM实验均由MAR提供地址
实验2:存储器EM 写实验
将地址0 写入MAR
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据00H
置控制信号为:
按STEP键, 将地址0 写入MAR
将数据11H写入EM[0]
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据11H
置控制信号为:
按STEP键, 将数据11H写入EM[0]
将地址1 写入MAR
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据01H
置控制信号为:
按STEP键, 将地址1 写入MAR
将数据22H写入EM[1]
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据22H
置控制信号为:
按STEP键,将数据22H写入EM[1]
实验3:存储器EM 读实验
将地址0 写入MAR
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据00H
置控制信号为:
按STEP键, 将地址0 写入MAR
读EM[0]
置控制信号为:
EM[0]被读出:11H
将地址1写入MAR
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据01H
置控制信号为:
按STEP键,将地址0写入MAR
读EM[1]
置控制信号为:
EM[1]被读出:22H
实验4:存储器打入IR指令寄存器/uPC实验
将地址0写入MAR
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据00H
置控制信号为:
按STEP键,将地址0写入MAR
读EM[0],写入IR及uPC
置控制信号为:
EM[0]被读出:11H
按STEP键,将EM[0]写入IR及uPC,IR=11H,uPC=10H
将地址1写入MAR
二进制开关K23-K16用于DBUS[7:0]的数据输入,置数据01H
置控制信号为:
按STEP键,将地址1写入MAR
读EM[1],写入IR及uPC
置控制信号为:
EM[1]被读出:22H
按STEP键,将地址EM[1]写入IR及uPC,IR=22H,uPC=20H
实验5:使用实验仪小键盘输入EM
1.连接J1,J2
2.打开电源
3.按TV/ME键,选择EM
4.输入两位地址,00
5.按NEXT,进入程序修改
6.按两位程序数据
7.按NEXT选择下个地址/按LAST选择上个地址
8.重复6,7 步输入程序
9.按RST结束
2.7 微程序存储器uM 实验
实验要求:利用CPTH 实验仪上的开关做为控制信号,实现微程序存储器uM 的输出功能。
实验目的:1、了解微程序控制方式模型机的基本工作原理。
2、了解微程序存储器uM的控制方法。
实验电路:
存储器uM 由三片6116RAM 构成,共24 位微指令,采用水平型微指令格式。存储器的地址由uPC 提供, 片选及读信号恒为低, 写信号恒为高. 存储器uM 始终输出uPC 指定地址单元的数据。
uM原理图
连接线表
实验1:微程序存储器uM 读出
置控制信号为:K0为1
uM 输出uM[0]的数据
按一次STEP脉冲键,CK产生一个上升沿,数据uPC 被加一。
uM 输出uM[1]的数据
按一次STEP脉冲键,CK产生一个上升沿,数据uPC 被加一。
uM 输出uM[2]的数据
实验2:使用实验仪小键盘输入uM
1.连接J1, J2
2.打开电源
3.按TV/ME键, 选择uM
4.输入两位地址, 00
5.按NEXT, 进入微程序修改
6.按六位微程序数据
7.按NEXT选择下个地址/按LAST选择上个地址
8.重复6,7 步输入微程序
9.按RST结束
2.8 中断实验
实验要求:利用CPTH实验仪上的开关做控制信号,实现中断功能。
实验目的:了解模型机的中断功能的工作原理及中断过程中,申请、响应、处理、返回各阶段时序。
实验电路:中断电路有两个D触发器,分别用于保存中断请求信号(IREQ)及中断响应信号(IACK)。INT 有上升沿时,IREQ 触发器被置为1。当下一条指令取指时(IREN=0), 存贮器EM 的读信号(EMRDP)被关闭,同时产生读中断指令(ICEN)信号, 程序的执行被打断转而去执行B8指令响应中断。在取B8 的同时置IACK触发器被置为1,禁止新的中断响应。EINT信号置0,IACK,IREQ触发器为0,中断电路可以响应新的中断。
中断控制器原理图
连接线表
置控制信号为:
短路块选择端JINT指向RG侧,按RG 脉冲键,产生中断请求,此时黄色REQ 指示灯亮,同时B8 输出红色指示灯。
按STEP脉冲键,产生取指脉冲,黄色ACK 指示灯亮。
置控制信号为:
REQ,ACK灯灭。
第三章 CPTH 模型机
3.1 模型机总体结构
CPTH 模型机包括了一个标准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:见18页表。
X0:
WEN:将数据总线DBUS的值打入工作寄存器W中。
AEN: 将数据总线DBUS的值打入累加器A中。
S2: S2、S1、S0三位组合决定ALU做何种运算。
S1: 见16页表。
S0:
3.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。
3.3 模型机指令集
模型机的缺省的指令集分几大类: 算术运算指令、逻辑运算指令、移位指令、数据传输指令、跳转指令、中断返回指令、输入/输出指令。
3.4 模型机微指令集
指令/微指令表(insfile1.mic)
第四章 模型机综合实验(微程序控制器)
在综合实验中,模型机作为一个整体来工作的,所有微程序的控制信号由微程序存储器uM 输出,而不是由开关输出。在做综合实验之前,先用8 芯电缆连接J1 和J2,使系统处于非手动状态,这样实验仪的监控系统会自动打开uM的输出允许,微程序的各控制信号就会接到各寄存器、运算器的控制端口。此综合实验(1~7)使用的指令是模型机的缺省指令系统,系统自动默认装入缺省指令系统/非流水微指令系统文件:insfile1.mic。
在做综合实验时,可以用CPTH计算机组成原理实验软件输入、修改程序,汇编成机器码并下载到实验仪上,由软件控制程序实现单指令执行、单微指令执行、全速执行,并可以在软件上观察指令或微指令执行过程中数据的走向、各控制信号的状态、各寄存器的值。CPTH 软件的使用方法见第九章“CPTH 集成开发环境使用”。也可以用实验仪自带的小键盘和显示屏来输入、修改程序,用键盘控制单指令或单微指令执行,用LED 或用显示屏观察各寄存器的值。实验仪上的键盘使用方法见第八章“实验仪键盘使用”。
在用微程序控制方式做综合实验时,在给实验仪通电前,拔掉实验仪上所有的手工连接的接线,再用8 芯电缆连接J1 和J2,控制方式开关KC拨到“微程序控制”方向。若想用CPTH软件控制组成原理实验仪,就要启动软件,并用快捷图标的“连接通信口”功能打开设置窗口,选择实验仪连接的串行口,然后再点击“OK”按钮接通到实验仪。
实验1:数据传送实验/输入输出实验
1.在CPTH 软件中的源程序窗口输入下列程序
2.将程序另存为EX1.ASM,将程序汇编成机器码,调试窗口会显示出程序地址、机器码、反汇编指令。
3.按快捷图标的F7,执行“单微指令运行”功能,观察执行每条微指令时,寄存器的输入/输出状态,各控制信号的状态,PC 及uPC 如何工作。(见EX1.ASM程序跟踪结果)
EX1.ASM程序跟踪结果
每个程序的一开始的第一条微指令一定是取指令,此微指令的值为0CBFFFFH,对应到各个控制位就是EMRD、PCOE、及IREN为低,此三位有效,其它所有位都处于无效状态。在程序第一次运行时或复位后,uPC和PC的值都为0,PCOE有效将PC值送到ABUS,做为程序存储器EM的地址,EMRD信号有效就是从程序存储器EM中读出程序指令,IREN将读出的指令送到IR寄存器和uPC,此微指令的作用就是:从程序存储器EM的0地址读出程序指令机器码7CH,并存入uPC中做为微程序存储器uM的地址,从微程序存储器uM的7CH单元中读出微控制码0C7FFF7H,同时PC加1为读下一条指令或数据做准备。
MOV A,#12: 本指令为两个状态周期。在T1状态时,上次读出的指令机器码为7CH,存入uPC中做为微程序存储器uM的地址,读出微指令的值为0C7FFF7H,对应到各个控制位就是EMRDPCOE、EMEN及AEN为低,处于有效状态,其它控制位为无效状态。由于上条微指令(取指操作)已将PC加1,此时PCOE是将加1后的PC输出到ABUS做为程序存储器EM的地址,EMRD就是从程序存储EM中读出数据,本指令中读出的数据应为12H,EMEN将读出的数据送到DBUS总线上,AEN 是将DBUS总线上的值存入累加器A中。同时uPC加1为执行下条微指令做准备,PC加1为读取下一条指令做准备。每条指令的最后一条微指令一定是取指令操作,本指令的T0状态周期即为取指令,执行上一条微指令时uPC已经加1,按照此uPC为地址从微程序存储器uM读出的微指令的值为0CBFFFFH,参照第步的说明,此微指令从程序存储器EM中读取指令。
MOV A,R0: 本指令为两个状态周期。在T1状态时,由上条取指操作取出的指令机器码为70H,存入uPC后做为微程序地址访问微程序存储器uM的70H单元,读出微指令的值为0FFF7F7,各控制位的状态为RRD、AEN为低电平为有效状态,RRD有效表示从寄存器组R0-R3中读数送到DBUS上,在上条取指令操作时,IREN将取出的指令机器码70H送入IR寄存器,而IR寄存器的最低两位是用来选择寄存器R?的,此时IR寄存器最低两位为00,被读出的寄存器为R0。AEN有效表示将DBUS的数据写到累加器A中。同时uPC加1,为执行下条微指令做准备。 本指令的T0状态也是取指令,完成的功能是取出下一条要执行的指令机器码,并存入uPC和IR寄存器中。
MOV A,@R0: 本指令为三个状态周期。在T2状态时,由上个取指操作读出的指令机器码为74H,打入uPC后,从微程序存储器74H单元读出的微指令的值为0FF77FFH,有效的控制位为MAREN和RRD,RRD有效表示从寄存器组R0-R3中读出数据送到DBUS,MAREN有效表示将数据从DBUS总线上打入地址寄存器MAR。uPC加1取出下条微指令执行。在T1状态时,由uPC做为微程序存储器址,从uM的75H单元中读出微指令的值为0D7BFF7H,其中有效的控制位为EMRD、EMEN、MAROE和AEN。MAROE表示程序存储器EM的地址由地址寄存器MAR输出,EMRD表示从程序存储器EM中读出数据,EMEN表示读出的数据送到地址总线DBUS上,AEN有效表示将数据总线DBUS上的值存入累加器A中。此状态下uPC要加1,为取下条微指令做准备。本指令的T0状态执行的是取指操作。取指操作详细描述见程序开始部分的取指令的说明。
MOV A,01: 本指令为三个状态周期。在T2状态时,由上条取指操作取出的指令机器码为78H,存入uPC和IR寄存器后做为微程序存储器uM的地址,读出微指令的值为0C77FFFH,相应的有效控制位为EMRD、PCOE、EMEN和MAREN,PCOE有效表示将PC值做为程序存储器EM的地址,EMRD表示从程序存储器中读出数据,在本指令中此数据值为01H,EMEN表示将读出的数据送到DBUS总线,MAREN表示将DBUS总线上的数据打入地址寄存器MAR。uPC同时加1,取出下条微指令准备执行。在T1状态时,由uPC做为微程序存储器地址,从uM的79H单元中读出微指令的值为0D7BFF7H,可以参见上条指令的T1状态,此微指令的所完成的功能是,以MAR的值做为程序存储器的地址,读出数据并送到数据总线DBUS,同时将此数据存入累加器A中。uPC加1取出下条微指令准备执行。在T0状态,微指令执行取指令操作。
IN: 本指令分两个状态周期。在T1状态时,由上次取指操作取出的指令机器码为0C0H,以此做为微地址从uM中取出的微指令值为0FFFF17H,有效控制位为AEN、X2X1X0=000,因为X2、X1、X0为低,被选中的寄存器为输入端口IN,也就是说,输入端口IN上的数据被允许送到数据总线DBUS上,AEN有效表示将此数据打入累加器A中。同时uPC加1取出下条微指令准备执行。在T0状态,微指令执行的是取指令操作,取出下条指令准备执行。
OUT: 本指令分两个状态周期。 在T1状态,由上次取出的指令机器码为0C4H,以此为微地址从微程序存储器uM中读出的微指令为0FFDF9FH,有效控制位为OUTEN、X2X1X0=100(二进制),S2S1S0=111(二进制),S2S1S0=111表示运算器做“ALU直通”运算,也就是累加器不做任何运算,直接输出结果,而X2X1X0=100表示运算器的结果不移位直接输出到数据总线DBUS,OUTEN有效表示将数据总线上的数据打入输出端口寄存器OUT内。uPC加1,取出下条微指令准备执行。在T0状态,微指令执行的是取指操作,取出下条将要执行的指令。
实验2:数据运算实验(加/减/与/或)
1.在CPTH 软件中的源程序窗口输入下列程序
2.将程序另存为EX2.ASM,将程序汇编成机器码,调试窗口会显示出程序地址、机器码、反汇编指令。
3.按快捷图标的F7,执行“单微指令运行”功能,观察执行每条微指令时,寄存器的输入/输出状态,各控制信号的状态,PC及uPC如何工作。(见“EX2.ASM程序跟踪结果”详细介绍)
4.在了解数据运算的原理,可以加上一些数据传输指令给累加器A或寄存器R?赋值,再运算,并观察运算结果。
EX2.ASM程序跟踪结果
程序的开始执行一条取指的微指令,读入程序第一条指令。
ADDC A,R1:本指令为三个状态周期。在T2状态,由上次取指操作取出的指令码为21H,由IREN存入指令寄存器IR,最低两位为01(二进制),选择寄存器R1,指令码由于IREN打入uPC时,忽略掉指令的最低两位,而将uPC的最低两位置成00,uPC的值为20H,访问微程序存储器的20H单元,读出微指令值为0FFF7EFH,有效位为RRD及WEN,就是将R1内容送到工作寄存器W,uPC加1取出下条微指令在T1状态,读出的微指令值为0FFFE94H,有效位为FEN和AEN,FEN完成的操作是将标志位存入标志寄存器F(ALU内部),X2X1X0选择“ALU直通”到数据总线DBUS,S2S1S0选择的运算操作为“带进位的加法运算”,AEN将DBUS上的数据存入累加器A。在T0状态,取出下条将要执行的指令。
SUB A,@R1:本指令有四个状态周期。在T3状态,上次取出的指令码为35H,最低两位用于寻址R1寄存器,uPC的最低两位置0,来访问uM的34H单元的微指令,读出值为0FF77FFH,将R1的值存入MAR。在T2状态,微指令为0D7BFEFH,表示用MAR做为地址从EM中读出数据送到DBUS再存到W中。在T1状态微指令为0FFFE91H,表示ALU做“减运算”,其结果直通到DBUS,再存入中,同时保存标志位。T0状态为取指操作。
AND A,#55: 本指令为三个状态周期。在T2状态,微指令值为0C7FFEFH,表示以PC做为地址,从EM中读出数据送到DBUS,再将DBUS数据存W中。在T1状态,微指令为0FFFE93H,表示A和W做“逻辑与”运算,结果直通到DBUS,再存入A中,并保存标志位。
OR A,02:本指令有四个状态周期。在T3状态,微指令为0C77FFFH,表示以PC做为地址,从EM中读出数据送到DBUS,并存MAR中。在T2状态,微指令为0D7BFEFH,表示以MAR做为地址,从EM中读出数据送到DBUS,并存入W中。在T1状态微指令为0FFFE92H,表示A和W做“逻辑或”运算,结果“直通”到DBUS并存入A中。T0状态为取指操作。
实验3:移位/取反实验
1.在CPTH 软件中的源程序窗口输入下列程序
2.将程序另存为EX3.ASM,将程序汇编成机器码,调试窗口会显示出程序地址、机器码、反汇编指令。
3.按快捷图标的F7,执行“单微指令运行”功能,观察执行每条微指令时,寄存器的输入/输出状态,各控制信号的状态,PC及uPC如何工作。(见“EX3.ASM程序跟踪结果”详细介绍)
EX3.ASM程序跟踪结果
程序的开始执行一条取指的微指令,读入程序第一条指令。
MOV A, #55: 将累加器的值设为055H,以便下面观察。
RR A:本指令为两个状态周期。在T1状态,由上次取指操作取出的指令码为D0H,访问微程序存储器的20H单元,读出微指令值为0FFFCB7H,有效位为CN、FEN及AEN,表示不带进位移位,运算器控制S2S1S0=111(二进制)表示运算不运算,输出结果就为A的值,X2X1X0=101(二进制)表示,运算器“右移”输出到总线,FEN将标志位保存,AEN将DBUS内容存入A中,uPC加1取出下条微令。在T0状态,取出下条将要执行的指令。
RLC A:本指令有两个状态周期。在T1状态微指令为0FFFED7H,CN=1表示带进位移位,S2S1S0=111表示ALU不做运算,直接输出A内容,X2X1X0=110(二进制)表示,运算器“左移”输出到DBUS,AEN表示DBUS内容存入A中,FEN表示保存标志位。T0状态为取指操作。取出下条将要执行的指令。
CPL A: 本指令为两个状态周期。在T1状态,微指令为0FFFE96H,S2S1S0=110表示ALU做“取反”运算,X2X1X0=100(二进制)表示,运算器结果直通到DBUS,再存入A中,并保存标志位。T0状态为取指操作。取出下条将要执行的指令。
实验4:转移实验
1.在CPTH 软件中的源程序窗口输入下列程序
2.将程序另存为EX4.ASM,将程序汇编成机器码,调试窗口会显示出程序地址、机器码、反汇编指令。
3.按快捷图标的F7,执行“单微指令运行”功能,观察执行每条微指令时,寄存器的输入/输出状态,各控制信号的状态,PC 及uPC如何工作。观察在条件满足和不满足的情况下,条件跳转是否正确执行。(见“EX4.ASM 程序跟踪结果”详细介绍)
EX4.ASM程序跟踪结果
程序的开始执行一条取指的微指令,读入程序第一条指令。
MOV A, #01: 将累加器的值设为01H,用于下面计算来产生进位标志和零标志。
SUB A,#01:A值原为1,将A值第一次减1后,应产生“零标志”位。
JC 02: 由上条取指读出的指令码为0A0H,存入IR寄存器后,IR3、IR2的值为00(二进制),表示判进位跳转功能,指令码存入uPC后,从uM读出的微指令值为0C6FFFFH,表示以PC为地址从EM中读出数据02H并送到DBUS,ELP为低成有效状态,与IR3、IR2组成进位跳转控制,此时若有进位,就会产生一个控制信号,将总线DBUS上的值02H打入PC,下条微指令取指时,就会从EM新的地址02中读指令码;此时若无进位,DBUS上的值被忽略,PC加1,下条取指操作按新PC取出指令码执行。当前无进 位标志,顺序执行下条指令。
JZ 02: 由上条取指读出的指令码为0A4H,存入IR寄存器后,IR3、IR2的值为01(二进制),表示判零跳转功能,指令码存入uPC后,从uM读出的微指令值为0C6FFFFH,表示以PC为地址从EM中读出数据02H并送到DBUS,ELP为低成有效状态,与IR3、IR2组成零跳转控制,与上条指令相比,尽管微指令相同,由于指令码不同,上一个为判进位跳转,这个为判零跳转。此时若零标志位为1,即A=0时,就会产生一个控制信号,将总线DBUS上的值02H打入PC,下条微指令取指时,就会从EM新的地址02中读指令码;此时若零标志位为0,DBUS上的值被忽略,PC加1,下条取指操作按新PC取出指令码执行。由于A=0,零标志位为1,产生PC打入信号,将DBUS上的值02H打入PC。下一条取指操作,PC=02,以PC为地址从EM的02单元取出指令码执行,程序转到02地址。
SUB A,#01:A值现为0,再减1后,A=0FFH,并产生“进位标志”位。
JC 02: 此为判进位跳转指令,此时由于进位标志为1,与ELP、IR3、IR2组成的电路产生PC打入信号,将数据总线上的值存入PC,程序跳转到02H地址执行。
SUB A,#01:A值现为0FFH,再减1后,A=0FEH,无“零标志”,无“进位标志”位。
JC 02: 此为判进位跳转指令,此时无进位标志,程序顺序执行下条指令。
JZ 02: 此为判零跳转指令,此时无零标志位,程序顺序执行下条指令。
JMP 00: 由上条取指操作读出的指令码为0ACH,存入IR寄存器后,IR3、IR2的值为11(二进制),此为无条件跳转控制,指令码存入uPC后,从uM读出的微指令为0C6FFFFH,表示以PC为地址从EM中读出数据并送到数据总线DBUS上,因为ELP有效,与IR3、IR2组合产生PC的打入信号,将DBUS上的数据存入PC中,下一条取指微指令按新的PC值读出程序的指令码。MOV A, #01: 程序从开头重新执行。
实验5:调用实验
1.在CPTH 软件中的源程序窗口,输入下列程序
2.将程序另存为EX5.ASM,将程序汇编成机器码,调试窗口会显示出程序地址、机器码、反汇编指令。
3.按快捷图标的F7,执行“单微指令运行”功能,观察执行每条微指令时,寄存器的输入/输出状态,各控制信号的状态,PC 及uPC如何工作。观察在调用子程序和从子程序返回时,堆栈的工作情况。(见“EX5.ASM程序跟踪结果”详细介绍)
EX5.ASM程序跟踪结果
程序的开始执行一条取指的微指令,读入程序第一条指令。
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地址,执行程序。
实验6:中断实验
1.在CPTH 软件中的源
程序窗口输入下列程序
2.将程序另存为EX6.ASM,将程序汇编成机器码,反汇编窗口会显示出程序地址、机器码、反汇编指令。
3.在 IA单元模块中,将拨码开关设置为“11100000”,短路块选择端JINT指向RG侧,按快捷图标的F7,执行“单微指令运行”功能,在跟踪程序时,按下实验仪上中断请求按键[RG],中断请求灯亮,在每个指令的最后一条微指令执行完,就会响应中断,中断响应灯高。同时,观察执行每条微指令时,寄存器的输入/输出状态,各控制信号的状态,PC及uPC如何工作。观察程序执行时,堆栈及中断请求,中断响应位的状态。 (见“EX6.ASM程序跟踪结果”详细介绍)
EX6.ASM程序跟踪结果
程序的开始执行一条取指的微指令,读入程序第一条指令。
MOV A, #00: 将累加器的值设为00H,以便下面观察A加1后的结果。
NOP :程序空操作,等待中断请求。
JMP 02:程序无条件跳转到02地址,执行程序。在执行此指令前,按下实验仪上的中断请求钮,中断请求的灯会亮,表示有中断请求。在本指令的T0状态即取指状态,IREN有效将中断处理微程序地址0B8H,送到指令总线IBUS上。
_INT_ :本指令为中断处理微程序,有三个状态周期。在T2状态,微指令的值为0FFEF7FH,其中X2X1X0=011(二进制),表示从PC中读出数据送到DBUS上,STEN有效表示将DBUS上数据存入堆栈寄存器ST中,这条微指令执行的就是将PC值(即下条将执行的指令的地址)存入堆栈。在T1状态,微指令值为0FEFF3FH,其中X2X1X0=001表示将中断地址寄存器IA的值送到DBUS上,IA的缺省值为
0E0H,ELP有效,与指令寄存器IR的IR3、IR2=10(二进制)组合,将DBUS值存入PC,实现程序的跳转。在T0状态以中断地址0E0H为地址取出中断服务程序的第一条指令,准备执行。
ADD A,01:本指令将累加器加1。
RETI: 本指令有两个状态周期。在T1状态,取出的微指令为0FCFF5FH,X2X1X0=010(二进制)表示从ST读出数据送到DBUS上,EINT有效清除中断请求标志和中断响应标志,以便程序返回后,可以再次响应中断,ELP有效与IR3、IR2=11表示无条件将数据总线DBUS的值打入PC,实现中断服务程序返回功能。在T0状态,按新PC取出指令,准备执行。
NOP : 上次中断是在执行完“JMP 02”指令后响应的,中断返回的地址为其下条将要执行的指令,也就是“NOP”指令。
实验7:指令流水实验
指令流水操作,就是在微指令执行的过程中,在T1 状态,如果ABUS 和IBUS 空闲,则可以利用这个空闲来进行预取指令,让ABUS、IBUS和DBUS并行工作,实现指令的流水工作。我们已经建立了一套可流水操作的指令/微指令系统。用户可调入这个指令/微指令系统进行实验。为了方便比较,我们仍用实验1 的程序EX1.ASM,其它指令用户可以自己做实验来比较、验证。
1.在CPTH软件中,用菜单的[文件|调入指令系统/微程序]功能,打开CPTH下的“INSFILE2.MIC”,这就是流水操作的指令/微指令系统。
2.在CPTH软件中,用菜单的[文件|打开文件]功能,打开CPTH下的“EX1.ASM”源程序。编译后产生的机器码与实验1 相同。
3.按快捷图标的F7,执行“单微指令运行”功能,观察执行每条微指令时,寄存器的输入/输出状态,各控制信号的状态,PC及uPC如何工作。特别是在每条指令的T0状态周期,取指操作是否和其它指令并行执行。(见“EX1.ASM 程序流水操作跟踪结果”详细介绍)
EX1.ASM 程序流水操作跟踪结果
每个程序的一开始的第一条微指令一定是取指令,取出下条将要执行的指令。
MOV A,#12: 本指令为两个状态周期。在T1状态时,从程序存储器EM中读出数据送到累加器A,ABUS被占用,所以预指操作不能与数据总线DBUS上的操作并行执行。本指令的T0状态为正常的取指令操作。
MOV A,R0: 由于预指操作与数据总线可并行工作,本指令只有1个状态周期。由上条取指操作取出的指令机器码为70H,存入uPC后做为微程序地址访问微程序存储器uM的70H单元,读出微指令的值为0CBF7F7H,有效控制位为EMRD、PCOE、IREN、RRD、AEN,由于IR1、IR0的值为00,与RRD信号组合表示从R0中读出数据到DBUS总线,AEN将DBUS上的值存入累加器A,EMRDPCOE和IREN有效表示以PC做为地址从EM中读出下条指令,并存入IR和uPC中,PC加1。
MOV A,@R0: 本指令为三个状态周期。在T2状态时,将R0的值存入地址寄存器MAR。在T1状态时,以MAR为地址读出数据并送到累加器A中。在T0状态,取出下条将要执行指令。由于ABUS不空闲,所以取指操作不能并行工作。
MOV A,01: 本指令为三个状态周期。在T2状态时,以PC为地址从EM中读出数据存到MAR中,在T1状态,以MAR为地址从EM中读出数据存入累加器A。T0为取指操作。由于ABUS不空闲,取指操作不能并行执行。
IN: 本指令为1个状态周期。取指操作和输出操作可并行执行。由上次取指操作取出的指令机器码为0C0H,以此做为微地址从uM中取出的微指令值为0CBFF17H,有效控制位为EMRD、PCOE、IREN和AEN、X2X1X0=000(二进制)表示从输入寄存器IN读数据送到DBUS,AEN表示将此数据存入A,EMRD、PCOE和IREN有效表示以PC为地址从EM中读出指令存入IR和uPC中,PC加1。
OUT: 本指令有1个状态周期。取指操作和输出操作并行完成。 由上次取出微指令值为为0CBDF9FH,有效控制位为EMRD、PCOE、IREN、OUTEN、X2X1X0=100(二进制),S2S1S0=111(二进制),S2S1S0=111表示运算器做“ALU直通”运算,也就是累加器不做任何运算,直接输出结果,而X2X1X0=100表示运算器的结果不移位直接输出到数据总线DBUS,OUTEN有效表示将数据总线上的数据打入输出端口寄存器OUT内。与此同时,EMRD、PCOE、IREN表示以PC为地直址从EM中读出下条指令,存IR和uPC中,PC加1。
实验8 RISC 模型机
RISC处理器设计的一般原则:
1. 只选用使用频度高的指令,减小指令系统,使每一条指令能尽快的执行
2. 减少寻址方式,并让指令具有相同的长度
3. 让大部分指令在一个时钟完成
4. 所有指令只有存(ST)、取(LD)指令可访问内存,它他指令均在寄存器间进行运算
下面我们给出一个RISC的指令系统
可以看出在这个指令系统中,只有访问主存LD,ST指令和转移指令有两个字节,其余指令均为单字节单时钟指令。
1.在CPTH软件中,用菜单的[文件|调入指令系统/微程序]功能,打开CPTH下的“RISCFILE.MIC”,这就是RISC指令/微指令系统。
2.在CPTH软件中,用菜单的[文件|打开文件]功能,打开CPTH下的“EX7.ASM”源程序。
3.按快捷图标的F7,执行“单微指令运行”功能,观察执行每条微指令时,寄存器的输入/输出状态,各控制信号的状态,PC 及uPC 如何工作。
4.比较非RISC指令系统,可以看出RISC指令系统简单很多。
第五章 组合逻辑控制
5.1 组合逻辑控制器
微程序控制器由微程序给出24位控制信号,而微程序的地址又是由指令码提供的,这就是说24 位控制信号是由指令码确定的。如:MOV A,12H及MOV A,#34H指令的微程序如下:
我们用组合逻辑的方法来写出相应的控制表达式
IR7..IR2 为指令的高六位(低两位用于选择寄存器R0..R3)
T3,T2,T1,T0 为处于的周期
!EMRD = !IR7 & IR6 & IR5 & IR4 & IR3 & !IR2 & T2 // MOV A, MM T2 周期
# !IR7 & IR6 & IR5 & IR4 & IR3 & !IR2 & T1 // MOV A, MM T1 周期
# !IR7 & IR6 & IR5 & IR4 & IR3 & !IR2 & T0 // MOV A, MM T0 周期
# !IR7 & IR6 & IR5 & IR4 & IR3 & IR2 & T1 // MOV A, #II T1 周期
# !IR7 & IR6 & IR5 & IR4 & IR3 & IR2 & T0 ; // MOV A, #II T0 周期
!PCOE = !IR7 & IR6 & IR5 & IR4 & IR3 & !IR2 & T2 // MOV A, MM T2 周期
# !IR7 & IR6 & IR5 & IR4 & IR3 & !IR2 & T0 // MOV A, MM T0 周期
# !IR7 & IR6 & IR5 & IR4 & IR3 & IR2 & T1 // MOV A, #II T1 周期
# !IR7 & IR6 & IR5 & IR4 & IR3 & IR2 & T0 ; // MOV A, #II T0 周期
!EMEN = !IR7 & IR6 & IR5 & IR4 & IR3 & !IR2 & T2 // MOV A, MM T2 周期
# !IR7 & IR6 & IR5 & IR4 & IR3 & !IR2 & T1 // MOV A, MM T1 周期
# !IR7 & IR6 & IR5 & IR4 & IR3 & IR2 & T2; // MOV A, #II T1 周期
!MAREN = !IR7 & IR6 & IR5 & IR4 & IR3 & !IR2 & T2; // MOV A, MM T2 周期
!MAROE = !IR7 & IR6 & IR5 & IR4 & IR3 & !IR2 & T1; // MOV A, MM T1 周期
!AEN = # !IR7 & IR6 & IR5 & IR4 & IR3 & !IR2 & T1 // MOV A, MM T1 周期
# !IR7 & IR6 & IR5 & IR4 & IR3 & IR2 & T1; // MOV A, #II T1 周期
!IREN = !IR7 & IR6 & IR5 & IR4 & IR3 & !IR2 & T0 // MOV A, MM T0 周期
# !IR7 & IR6 & IR5 & IR4 & IR3 & IR2 & T0; // MOV A, #II T0 周期
上面给出的表达式仅是两条指令的表达式,而且没有化简的,不难看出24 位控制信号是指令码及周期数的函数。增加一条指令,只要增加一些或项即可,如增加 ADD A,#11H
EMRD 增加:
!IR7 & !IR6 & !IR5 & IR4 & IR3 & IR2 & T2 // ADD A, #II T2 周期
!IR7 & !IR6 & !IR5 & IR4 & IR3 & IR2 & T0 // ADD A, #II T0 周期
PCOE 增加:
!IR7 & !IR6 & !IR5 & IR4 & IR3 & IR2 & T2 // ADD A, #II T2 周期
!IR7 & !IR6 & !IR5 & IR4 & IR3 & IR2 & T0 // ADD A, #II T0 周期
EMEN 增加:
!IR7 & !IR6 & !IR5 & IR4 & IR3 & IR2 & T2 // ADD A, #II T2 周期
AEN 增加:
!IR7 & !IR6 & !IR5 & IR4 & IR3 & IR2 & T1 // ADD A, #II T1 周期
IREN 增加:
!IR7 & !IR6 & !IR5 & IR4 & IR3 & IR2 & T0 // ADD A, #II T0 周期
ADD A, #II 新增加的控制信号有 WEN,FEN,X2,X1,S2,S1,S0
!WEN = !IR7 & !IR6 & !IR5 & IR4 & IR3 & IR2 & T2 // ADD A, #II T2 周期
!FEN = !IR7 & !IR6 & !IR5 & IR4 & IR3 & IR2 & T1 // ADD A, #II T1 周期
!X2 = !IR7 & !IR6 & !IR5 & IR4 & IR3 & IR2 & T1 // ADD A, #II T1 周期
!X1 = !IR7 & !IR6 & !IR5 & IR4 & IR3 & IR2 & T1 // ADD A, #II T1 周期
!S2 = !IR7 & !IR6 & !IR5 & IR4 & IR3 & IR2 & T1 // ADD A, #II T1 周期
!S1 = !IR7 & !IR6 & !IR5 & IR4 & IR3 & IR2 & T1 // ADD A, #II T1 周期
!S0 = !IR7 & !IR6 & !IR5 & IR4 & IR3 & IR2 & T1 // ADD A, #II T1 周期
IR7..IR0 由指令寄存器提供,ABEL表达式是:
[IR7..IR0] := [IBUS7..IBUS0];
[IR7..IR0].CE = !IREN;
[IR7..IR0].AR = !RST;
[IR7..IR0].CLK = CK;
CPTH每条指令最多有4个周期(T3,T2,T1,T0),可由两位D触发器(RT1,RT0)表示。
T3 = RT1 & RT0;
T2 = RT1 & !RT0;
T1 = !RT1 & RT0;
T0 = !RT1 & !RT0;
RT1,RT0构成一个带预置的减计数器,ABEL 表达式是:
WHEN !RT1 & !RT0 THEN {
[RT1..RT0] := [CT1..CT0];
} ELSE {
[RT1..RT0] := [RT1..RT0] - 1;
}
[RT1..RT0].CLK = CK;
[RT1..RT0].AR = !RST;
当RT1,RT0为0 时,表示现执行的是本指令的最后一个周期,这个周期为取指周期。
在取指时将RT1,RT0 置为下一条指令的首个周期值。
当RT1,RT0不为0时,将周期数减一。
CT1,CT0根据指令计算出,ABEL 表达式是:
TRUTH_TABLE([IBUS7,IBUS6,IBUS5,IBUS4,IBUS3,IBUS2]->[CT1, CT0])
[ 0, 1, 1, 1, 1, 0]->[ 1, 0] ; // MOV A, MM
[ 0, 1, 1, 1, 1, 1]->[ 0, 1] ; // MOV A, #II
我们根据模型机提供的缺省指令系统,在ispLEVER软件开发环境中,参照下面ABEL格式的文件来设计组合逻辑控制器,来验证4.1实验的正确性,省略部分由学生自己完成。CPTH 实验仪上的组合逻辑控制器由一片LC4256V-100 实现,通过开关KC切换.出厂时已下载的组合逻辑控制器文件LOGIC见随机光盘。
module LOGIC
Title 'LOGIC'
Declarations
XRD,FF PIN istype 'COM';
EMWR PIN istype 'COM';
EMRD PIN istype 'COM';
PCOE PIN istype 'COM';
EMEN PIN istype 'COM';
IREN PIN istype 'COM';
EINT PIN istype 'COM';
ELP PIN istype 'COM';
MAREN PIN istype 'COM';
MAROE PIN istype 'COM';
OUTEN PIN istype 'COM';
STEN PIN istype 'COM';
RRD PIN istype 'COM';
RWR PIN istype 'COM';
CN PIN istype 'COM';
FEN PIN istype 'COM';
X2 PIN istype 'COM';
X1 PIN istype 'COM';
X0 PIN istype 'COM';
WEN PIN istype 'COM';
AEN PIN istype 'COM';
S2 PIN istype 'COM';
S1 PIN istype 'COM';
S0 PIN istype 'COM';
IBUS7 PIN ;
IBUS6 PIN ;
IBUS5 PIN ;
IBUS4 PIN ;
IBUS3 PIN ;
IBUS2 PIN ;
IBUS1 PIN ;
IBUS0 PIN ;
CK PIN ;
RST PIN;
RT1 PIN istype 'REG';
RT0 PIN istype 'REG';
CT1 PIN istype 'COM';
CT0 PIN istype 'COM';
MON PIN ;
IR7 NODE istype 'REG';
IR6 NODE istype 'REG';
IR5 NODE istype 'REG';
IR4 NODE istype 'REG';
IR3 NODE istype 'REG';
IR2 NODE istype 'REG';
IR1 NODE istype 'REG';
IR0 NODE istype 'REG';
T3 pin istype 'COM';
T2 pin istype 'COM';
T1 pin istype 'COM';
T0 pin istype 'COM';
Equations
// XRD
!XRD = IR7 & !IR6 & !IR5 & IR4 & !IR3 & !IR2 & T1; // READ A, MM
// EMWR
!EMWR = IR7 & !IR6 & !IR5 & !IR4 & !IR3 & IR2 & T1 # // MOV @R?, A
IR7 & !IR6 & !IR5 & !IR4 & IR3 & !IR2 & T1 ; // MOV MM, A
// EMRD
!EMRD = !IR7 & !IR6 & !IR5 & !IR4 & !IR3 & !IR2 & T0 # // _FATCH_
!IR7 & !IR6 & !IR5 & !IR4 & !IR3 & IR2 & T0 # // UNDEF
!IR7 & !IR6 & !IR5 & !IR4 & IR3 & !IR2 & T0 # // UNDEF
!IR7 & !IR6 & !IR5 & !IR4 & IR3 & IR2 & T0 # // UNDEF
!IR7 & !IR6 & !IR5 & IR4 & !IR3 & !IR2 & T0 # // ADD A, R?
!IR7 & !IR6 & !IR5 & IR4 & !IR3 & IR2 & T2 # // ADD A, @R?
!IR7 & !IR6 & !IR5 & IR4 & !IR3 & IR2 & T0 # // ADD A, @R?
----------------以下省略部分由学生自己完成
………
………
………
----------------
// Does not output when MON is high
XRD.OE = !MON&FF;
EMWR.OE = !MON&FF;
EMRD.OE = !MON&FF;
PCOE.OE = !MON&FF;
EMEN.OE = !MON&FF;
IREN.OE = !MON&FF;
EINT.OE = !MON&FF;
ELP.OE = !MON&FF;
MAREN.OE = !MON&FF;
MAROE.OE = !MON&FF;
OUTEN.OE = !MON&FF;
STEN.OE = !MON&FF;
RRD.OE = !MON&FF;
RWR.OE = !MON&FF;
CN.OE = !MON&FF;
FEN.OE = !MON&FF;
X2.OE = !MON&FF;
X1.OE = !MON&FF;
X0.OE = !MON&FF;
WEN.OE = !MON&FF;
AEN.OE = !MON&FF;
S2.OE = !MON&FF;
S1.OE = !MON&FF;
S0.OE = !MON&FF;
// Load IR register
[IR7..IR0] := [IBUS7..IBUS0];
[IR7..IR0].CE = !IREN;
[IR7..IR0].AR = !RST;
[IR7..IR0].CLK = CK;
// T counter
WHEN !RT1 & !RT0 THEN {
[RT1..RT0] := [CT1..CT0];
} ELSE {
[RT1..RT0] := [RT1..RT0] - 1;
}
[RT1..RT0].CLK = CK;
[RT1..RT0].AR = !RST;
// set T
T3 = RT1 & RT0;
T2 = RT1 & !RT0;
T1 = !RT1 & RT0;
T0 = !RT1 & !RT0;
// constant for CT1,0 counter
TRUTH_TABLE ([IBUS7,IBUS6,IBUS5,IBUS4,IBUS3,IBUS2] -> [CT1, CT0])
[ 0, 0, 0, 0, 0, 0] -> [ 0, 0]; // Fetch
[ 0, 0, 0, 0, 0, 1] -> [ 0, 0]; // UNDEF
[ 0, 0, 0, 0, 1, 0] -> [ 0, 0]; // UNDEF
[ 0, 0, 0, 0, 1, 1] -> [ 0, 0]; // UNDEF
[ 0, 0, 0, 1, 0, 0] -> [ 1, 0]; // ADD A, R?
[ 0, 0, 0, 1, 0, 1] -> [ 1, 1]; // ADD A, @R?
[ 0, 0, 0, 1, 1, 0] -> [ 1, 1]; // ADD A, MM
[ 0, 0, 0, 1, 1, 1] -> [ 1, 0]; // ADD A, #II
[ 0, 0, 1, 0, 0, 0] -> [ 1, 0]; // ADDC A, R?
[ 0, 0, 1, 0, 0, 1] -> [ 1, 1]; // ADDC A, @R?
[ 0, 0, 1, 0, 1, 0] -> [ 1, 1]; // ADDC A, MM
[ 0, 0, 1, 0, 1, 1] -> [ 1, 0]; // ADDC A, #II
[ 0, 0, 1, 1, 0, 0] -> [ 1, 0]; // SUB A, R?
[ 0, 0, 1, 1, 0, 1] -> [ 1, 1]; // SUB A, @R?
[ 0, 0, 1, 1, 1, 0] -> [ 1, 1]; // SUB A, MM
[ 0, 0, 1, 1, 1, 1] -> [ 1, 0]; // SUB A, #II
[ 0, 1, 0, 0, 0, 0] -> [ 1, 0]; // SUBC A, R?
[ 0, 1, 0, 0, 0, 1] -> [ 1, 1]; // SUBC A, @R?
[ 0, 1, 0, 0, 1, 0] -> [ 1, 1]; // SUBC A, MM
[ 0, 1, 0, 0, 1, 1] -> [ 1, 0]; // SUBC A, #II
[ 0, 1, 0, 1, 0, 0] -> [ 1, 0]; // AND A, R?
[ 0, 1, 0, 1, 0, 1] -> [ 1, 1]; // AND A, @R?
[ 0, 1, 0, 1, 1, 0] -> [ 1, 1]; // AND A, MM
[ 0, 1, 0, 1, 1, 1] -> [ 1, 0]; // AND A, #II
[ 0, 1, 1, 0, 0, 0] -> [ 1, 0]; // OR A, R?
[ 0, 1, 1, 0, 0, 1] -> [ 1, 1]; // OR A, @R?
[ 0, 1, 1, 0, 1, 0] -> [ 1, 1]; // OR A, MM
[ 0, 1, 1, 0, 1, 1] -> [ 1, 0]; // OR A, #II
[ 0, 1, 1, 1, 0, 0] -> [ 0, 1]; // MOV A, R?
[ 0, 1, 1, 1, 0, 1] -> [ 1, 0]; // MOV A, @R?
[ 0, 1, 1, 1, 1, 0] -> [ 1, 0]; // MOV A, MM
[ 0, 1, 1, 1, 1, 1] -> [ 0, 1]; // MOV A, #II
[ 1, 0, 0, 0, 0, 0] -> [ 0, 1]; // MOV R?, A
[ 1, 0, 0, 0, 0, 1] -> [ 1, 0]; // MOV @R?, A
[ 1, 0, 0, 0, 1, 0] -> [ 1, 0]; // MOV MM, A
[ 1, 0, 0, 0, 1, 1] -> [ 0, 1]; // MOV R?, #II
[ 1, 0, 0, 1, 0, 0] -> [ 1, 0]; // READ A, MM
[ 1, 0, 0, 1, 0, 1] -> [ 1, 0]; // WRITE MM, A
[ 1, 0, 0, 1, 1, 0] -> [ 0, 0]; // UNDEF
[ 1, 0, 0, 1, 1, 1] -> [ 0, 0]; // UNDEF
[ 1, 0, 1, 0, 0, 0] -> [ 0, 1]; // JC MM
[ 1, 0, 1, 0, 0, 1] -> [ 0, 1]; // JZ MM
[ 1, 0, 1, 0, 1, 0] -> [ 0, 0]; // UNDEF
[ 1, 0, 1, 0, 1, 1] -> [ 0, 1]; // JMP MM
[ 1, 0, 1, 1, 0, 0] -> [ 0, 0]; // UNDEF
[ 1, 0, 1, 1, 0, 1] -> [ 0, 0]; // UNDEF
[ 1, 0, 1, 1, 1, 0] -> [ 1, 0]; // _INT_
[ 1, 0, 1, 1, 1, 1] -> [ 1, 1]; // CALL MM
[ 1, 1, 0, 0, 0, 0] -> [ 0, 1]; // IN
[ 1, 1, 0, 0, 0, 1] -> [ 0, 1]; // OUT
[ 1, 1, 0, 0, 1, 0] -> [ 0, 0]; // UNDEF
[ 1, 1, 0, 0, 1, 1] -> [ 0, 1]; // RET
[ 1, 1, 0, 1, 0, 0] -> [ 0, 1]; // RR A
[ 1, 1, 0, 1, 0, 1] -> [ 0, 1]; // RL A
[ 1, 1, 0, 1, 1, 0] -> [ 0, 1]; // RRC A
[ 1, 1, 0, 1, 1, 1] -> [ 0, 1]; // RLC A
[ 1, 1, 1, 0, 0, 0] -> [ 0, 0]; // NOP
[ 1, 1, 1, 0, 0, 1] -> [ 0, 1]; // CPL A
[ 1, 1, 1, 0, 1, 0] -> [ 0, 0]; // UNDEF
[ 1, 1, 1, 0, 1, 1] -> [ 0, 1]; // RETI
[ 1, 1, 1, 1, 0, 0] -> [ 0, 0]; // UNDEF
[ 1, 1, 1, 1, 0, 1] -> [ 0, 0]; // UNDEF
[ 1, 1, 1, 1, 1, 0] -> [ 0, 0]; // UNDEF
[ 1, 1, 1, 1, 1, 1] -> [ 0, 0]; // UNDEF
end LOGIC
5.2 用CPLD实现运算器功能
在ispLEVER软件开发环境中,我们可以参照下面VHDL格式的文件来设计运算器,来验证2.2实验的运算器功能 ,省略部分由学生自己完成.CPTH 实验仪上的运算器由一片LC4256V-100实现,出厂时已下载的运算器文件ALU见随机光盘,用户可自行修改以实现其功能。
library ieee;
use ieee.std_logic_1164.all;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ALU is
PORT (
clk : IN STD_LOGIC; -- 时钟输入
rst : IN STD_LOGIC; -- 复位输入
AEN :IN STD_LOGIC; -- A写允许
WEN :IN STD_LOGIC; -- W写允许
S0 :IN STD_LOGIC;
S1 :IN STD_LOGIC;
S2 :IN STD_LOGIC; -- 运算器功能选择
X0 :IN STD_LOGIC;
X1 :IN STD_LOGIC;
X2 :IN STD_LOGIC; -- 寄存器输出控制
R_CY: BUFFER STD_LOGIC; -- 进位标志寄存器
R_Z : OUT STD_LOGIC; -- 零标志寄存器
FEN :IN STD_LOGIC; -- 标志寄存器写允许
CN :IN STD_LOGIC; -- 移位时是否带进位
RL0,RR7,JRC,JRZ:OUT STD_LOGIC;
D_BUS:INOUT STD_LOGIC_VECTOR(7 DOWNTO 0);
PC7,CY_IN:IN STD_LOGIC;手动控制和手动进位
ALU :OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
end;
architecture ALU of ALU is
-- 寄存器定义
SIGNAL A : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL W : STD_LOGIC_VECTOR(7 DOWNTO 0);
-- 标志定义
SIGNAL CY : STD_LOGIC; -- 本次运算进位标志
SIGNAL Z : STD_LOGIC; -- 本次运算零标志
-- ALU运算器定义
SIGNAL T : STD_LOGIC_VECTOR(8 DOWNTO 0); -- 运算结果
begin
-- 寄存器 A
PROCESS(clk, rst, AEN)
BEGIN
IF rst = '0' THEN
A <= "00000000";
ELSIF AEN = '1' THEN
NULL;
ELSIF clk'EVENT AND clk = '1' THEN
A <= D_BUS;
END IF;
END PROCESS;
-- 寄存器 W
PROCESS(clk, rst, WEN)
BEGIN
IF rst = '0' THEN
W <= "00000000";
ELSIF WEN = '1' THEN
NULL;
ELSIF clk'EVENT AND clk = '1' THEN
W <= D_BUS;
END IF;
END PROCESS;
------------------
RL0<=CN AND R_CY WHEN PC7='0' ELSE
CN AND CY_IN;
RR7<=CN AND R_CY WHEN PC7='0' ELSE
CN AND CY_IN;
-------------------- ALU运算,以下省略部分由学生自己完成.
………
………
………
-------------------------
JRZ <=R_Z WHEN PC7='0' ELSE 'Z';
JRC <=R_CY WHEN PC7='0' ELSE 'Z';
end ALU;
]
第六章 设计指令/微指令系统
CPTH计算机组成原理实验仪,可以由用户自己设计指令/微指令系统,前一章的“指令流水实验”就是利用另一套指令/微指令系统来实现指令的流水工作。这样用户可以在现有的指令系统上进行扩充,加上一些较常用的指令,也可重新设计一套完全不同的指令/微指令系统。CPTH 内已经内嵌了一个智能化汇编语言编译器,可以对用户设定的汇编助记符进行汇编。做为例题,我们建立一个有如下指令的系统:
因为硬件系统需要指令机器码的最低两位做为R0-R3 寄存器寻址用,所以指令机器码要忽略掉这两位。我们暂定这四条指令的机器码分别为04H,08H,0CH,10H。其它指令的设计,用户可参考此例,做为练习来完成。
一·创建指令系统(助记符、机器码)
1.打开CPTH组成原理实验软件,选择[文件|新建指令系统/微程序],清除原来的指令/微程序系统,观察软件下方的“指令系统”窗口,所有指令码都“未使用”。
2.选择第二行,即“机器码1”为0000 01XX行,在下方的“助记符”栏填入数据装载功能的指令助记符“LD”,在“操作数1”栏选择“A”,表示第一个操作数为累加器A。在“操作数2”栏选择“#*”,表示第二个操作数为立即数。按“修改”按钮确认。
3.选择第三行,即“机器码1”为0000 10XX行,在下方的“助记符”栏填入加法功能的指令助记符“ADD”,在“操作码1”栏选择“A”,表示第一操作数为累加器A,在“操作数2”栏选择“#*”,表示第二操作数为立即数。按“修改”按钮确认。
4.选择第四行,即“机器码1”为0000 11XX行,在下方的“助记符”栏填入无条件跳转功能的指令助记符“GOTO”,在“操作码1”栏选择“*”,表示跳转地址为*,此指令无第二操作数,无需选择“操作数2”。按“修改”按钮确认。因为硬件设计时,跳转指令的跳转控制需要指令码的第3 位和第2位IR3、IR2来决定,无条件跳转的控制要求IR3必需为1,所以无条件跳转的机器码选择在此行,机器码为000011XX。关于跳转控制的硬件设计和实验可参考前面章节。
5.选择第五行,即“机器码1”为0001 00XX行,在下方的“助记符”栏填入输出数据功能的指令助记符“OUT”,由于此指令隐含指定了将累加器A输出到输出寄存器,所以不用选择“操作码1”和“操作数2”,也可在“操作码1”栏选择“A”,按“修改”按钮确认。现在我们只是输入了四条指令(见下图)
二.下面我们根据指令的功能来设计相应的微程序。
将窗口切换到“uM微程序”窗口,现在此窗口中所有微指令值都是0FFFFFFH,也就是无任何操作,我们需要在此窗口输入每条指令的微程序来实现该指令的功能。
⑴每个程序开始要执行的第一条微指令应是取指操作,因为程序复位后,PC 和uPC 的值都为0,所以微程序的0 地址处就是程序执行的第一条取指的微指令。取指操作要做的工作是从程序存储器EM 中读出下条将要执行的指令,并将指令的机器码存入指令寄存器IR和微程序计数器uPC中,读出下条操作的微指令。根据此功能,观察窗口下方的各控制信号,有“勾”表示信号为高,处于无效状态,去掉“勾”信号为低,为有效状态。要从EM中读数,EMRD 必需有效,去掉信号下面的“勾”使其有效;读EM的地址要从PC输出,所以PCOE要有效,允许PC输出,去掉PCOE下面的“勾”,PCOE有效同时还会使PC加1,准备读EM的下一地址;IREN是将EM读出的指令码存入uPC和IR,所以要去掉IREN的“勾”使其有效。这样,取指操作的微指令就设计好了,取指操作的微指令的值为CBFFFFH。然后把助记符"_FATCH_",状态"T0",微地址"00",微程序"CBFFFFH"..(其余为注释可略),按照上表格式填入,其余类同.
⑵现在我们来看把立即数装入累加器A要做哪些工作,首先要从EM中读出立即数,并送到数据总线DBUS,再从DBUS 上将数据打入累加器A中,按照这个要求,从EM中读数据,EMRD应该有效,EM的地址由PC输出,PCOE必需有效,读出的数据送到DBUS,EMEN也应有效,要求将数据存入A中,AEN也要有效,根据前面描述“LD A,#*”指令有两个状态周期,T1状态将所有有效位下面的“勾”去掉,使其有效,这条微指令的值为C7FFF7H。为了保证程序的连续执行,每条指令的最后必需是取指令,取出下条将要执行的指令。T0状态取指微指令的值为CBFFFFH。(取操作描述可见第⑴ 步)。
⑶本指令为立即数加法指令,立即数加可分两步,首先从EM中读出立即数,送到DBUS,并存入工作寄存器W 中,从EM中读数,EMRD应有效,读EM的地址由PC输出,PCOE要有效,读出的数据要送到DBUS,EMEN应有效,数据存入W 中,WEN应有效,根据描述,“ADD A,#*”指令的T1状态微指令的值为C7FFEFH。第二步,执行加法操作,并将结果存入A中。执行加法操作,S2S1S0 的值应为000(二进制),结果无需移位直接输出到DBUS,X2X1X0 的值就要为100(二进制),从DBUS 将数据再存入A中,AEN应有效。与此同时,ABUS 和IBUS空闲,取指操作可以并行执行,也就是以PC 为地址,从EM 中读出下条将要执行指令的机器码,并打入IR和uPC中,根据取指操作的说明,EMRD、PCOE、IREN 要有效,根据上面描述,T0状态时将EMRD、PCOE、IREN、X2X1X0、AEN、S2S1S0都置成有效和相应的工作方式,此微指令的值为CBFF90H。
⑷“GOTO *”为无条件跳转,所要执行的操作为从EM 中读出目标地址,送到数据总线DBUS 上,并存入PC 中,实现程序跳转。从EM 中读数,EMRD 要有效,读EM的地址由PC输出,PCOE有效,数据送到DBUS,EMEN要有效,将数据打入PC中,由两位决定,ELP 有效,指令寄存器IR的第三位IR3应为1,由于本指令机器码为0CH,存入IR后,IR3 为1。将EMRD、PCOE、EMEN、ELP 设成低,使其成为有效状态,结合指令的第三位,实现程序跳转,这条微指令的值为C6FFFFH。下条微指令应为取指操作,将EMRD、PCOE、IREN 设成有效,微指令的值为CBFFFFH。
⑸“OUTA”,将累加器的内容输出到输出端口。其操作为累加器A不做运算,直通输出,ALU 结果不移位输出到DBUS,DBUS 上的数据存入输出端口OUT。累加器A 直通输出结果,S2S1S0值要为111(二进制),ALU 结果不移位输出到数据总线DBUS,X2X1X0的值要等于100(二进制),DBUS 数据要打入OUT,那么OUTEN 应有效。与此同时,ABUS 和IBUS空闲,取指操作可以并行执行,也就是以PC为地址,从EM中读出下条将要执行指令的机器码,并打入IR和uPC中,根据取指操作的说明,EMRD、PCOE、IREN 要有效,综上所述,将EMRD、PCOE、IREN、OUTEN、X2X1X0、S2S1S0 置成有效状态和相应的工作方式,微指令的值为CBDF9FH。
(6)选择菜单[文件|保存指令系统/微程序]功能,将新建的指令系统/微程序保存下来,以便以后调用。为不与已有的指令系统冲突,将新的指令系统/微程序保存为“new.mac”
三、在源程序窗口输入下面程序
将程序另存为NEW.ASM,选择[文件|调入指令系统/微程序 ],调入 new.mac,将程序汇编成机器码,观察反汇编窗口,会显示出程序地址、机器码、反汇编指令。
按快捷图标的F7,执行“单微指令运行”功能,观察执行每条微指令时,数据是否按照设计要求流动,寄存器的输入/输出状态是否符合设计要求,各控制信号的状态,PC及uPC如何工作是否正确。
到此为止,我们利用CPTH 软件系统已经建成了一个新的指令系统/微程序。新的指令系统从汇编助记符到指令机器码到微指令都与原来的指令系统有所不同。做为例子,我们只创建了四条指令,对于其它指令,用户可以做为练习来扩充完整,成为一个真正的指令系统。
第七章 扩展实验
CPTH 计算机组成原理实验仪的模型机具有对外部设备操作的指令,用这两条的输入、输出指令 可以对扩展的外部设备进行操作,实现功能的扩展。例如扩展外部的8255 来扩展输入、输出端口,扩展外部的8253 来扩展定时器/计数器等等。
扩展实验一:用8255 扩展I/O 端口实验
1.将8255 插在40 芯紧锁座上,按图和接线表连接好8255 各信号线。
2.打开CPTH计算机组成原理实验仪电源,运行CPTH 软件,将软件连接到实验仪硬件。输入下面程序:(或从CPTH目录下调入EX8255.ASM)。
3.将程序编译后全速执行,程序从8255 的PA 口读回数据,取反后输出到PB 口,重
复循环。拨动K16-K23 开关,可以看到L0-L7 上有相应的输出。
扩展实验二:用8253 扩展定时器试验
1.将8253 插在40 芯紧锁座上,按图和接线表接好8253 的信号线。
2.打开CPTH 计算机组成原理实验仪电源,运行CPTH 软件,将软件连接到实验仪硬件。输入下面程序:(或从CPTH 目录下调入EX8253.ASM)。
3.将程序汇编后单步执行到循环处,再单步观察L0 灯的翻转情况,如果全速执行L0 翻转过快,可对8253计数器高字节写入一个数字,再全速执行,观察L0 灯。
第八章 实验仪键盘使用
DJ-CPTH计算机组成原理实验仪除了可以连在PC机上调试程序,也可以用实验仪上自带的键盘输入程序及微程序,并可以单步调试程序和微程序,在显示屏上观察、修改各内部寄存器的值,编辑修改程序和微程序存储器。
显示屏的显示内容分四个主菜单:
1、观察和修改内部寄存器;2、观察和修改程序存储器;3、观察和修改微程序存储器;4、手动状态。四个主菜单用TV/ME 键切换。如下图:
1、观察、修改内部寄存器:
内部寄存器的内容分五页显示,用LAST或NEXT键向前或向后翻页,可以显示所有内部寄存器值,输入数字可修改非只读寄存器值。见下图:
2、观察、修改程序存储器内容:
显示屏显示如下图,其中“Adr”表示程序存储器地址,“DB”表示该地址中数据。光标初始停在“Adr”处,此时可以用数字键输入想要修改的程序地址,也可以用NEXT 和LAST 键将光标移到“DB”处,输入或修改此地址中的数据。再次按NEXT或LAST键可自动将地址+1 或将地址-1,并可用数字键修改数据。按MON 键可以回到输入地址00的状态。见下图。
3.观察、修改微程序存储器内容:
微程序存储器数据的观察、修改与上面程序存储器的观察修改方法相似,不同的是微程序要输入3 个字节,而程序存储器的修改只要输入1 个字节。微程序观察修改的显示屏显示如下图,其中“Adr”表示微程序地址,“MH”表示微程序的高字节,“MM”表示微程序的中字节,“ML”表示微程序的低字节。
使用实验仪键盘可以用三种方法调试程序,程序单步、微程序单步、全速执行。当用键盘调试程序时,显示屏显示寄存器第一页的内容。
[STEP] 为微程序单步执行键,每次按下此键,就执行一个微程序指令,同时显示屏显示微程序计数器、程序计数器、A 寄存器、W 寄存器的值。可以通过NX 或LS 键翻页
观察其它寄存器的值,观察各个寄存器的输出和输入灯的状态。
[SCAL]为程序单步执行键,每次按下此键,就执行一条程序指令,同时显示屏显示微程序计数器、程序计数器、A 寄存器、W 寄存器的值。可以通过NX 或LS 键翻页观察其它寄存器的值。
[EX]为全速执行键,按下此键时,程序就会全速执行,按键盘任一键暂停程序执行,并且显示当前 寄存器的值.
[RG]为中断请求键,按下此键时,会产生一个中断请求信号INT.
[RST]复位键,按下此键,程序中止运行,所有寄存器清零(IR除外),程序指针回到0 地址。
举例:用键盘输入以下程序代码:
1.按TV 键,直到显示屏显示内容为
2.按NX 键,光标移到“DB”下,显示屏为
3.按1,2 两个数字键, 显示屏为
4.按NX 键,地址+1,显示屏为
5.按3,4 两个数字键,显示屏为
重复4、5 两步,直到输入所有的程序代码。
在第1 步时,光标停在“Adr”处,可以按数字键0 。。。F 输入要修改的程序存储器的地址,然后再按NEXT 键输入程序代码。如果光标移到“DB”下,而此时又想改变地址,可以按MON 键,将光标移回到“Adr”处,按数字键输入地址。输入微程序代码的方法与此相似,不同的是程序只需输入两个数字,即一个字节,而微程序要输入6 个数字,即三个字节。如果多于6 个数字会自动从右向左移动光标。如果输入不足6个数字就用NEXT或LAST翻页,则只有被改动的几个数字有效,其它数字不变。
4. 用小键盘调试实验一
一:输入机器码
按TV 键选择EM
顺序输入机器码:7C 12 70 74 78 01 C0 C4
输完机器码后按RST 复位
二:单步执行微程序
按RST 复位键后,PC=0,uPC=0
uM输出24 位微程序:CB FF FF 此微指令为取指指令
第一条微指令
按一次STEP键,完成一个时钟,此时:
PC值为01(时钟上升沿PC+1)
IR 值为7C,uPC值为7C (指令码)
uM 输出为:C7 FF F7 (EM 值送A)
第二条微指令
按一次STEP键,完成一个时钟,此时:
PC值为02(时钟上升沿PC+1)
A值为12
uPC值为7D (时钟上升沿uPC+1)
uM 输出为:CB FF FF (取指指令)
第三条微指令
按一次STEP键,完成一个时钟,此时:
PC值为03(时钟上升沿PC+1)
IR 值为70,uPC值为70 (指令码)
uM 输出为:FF F7 F7 (R?值送A)
第四条微指令
按一次STEP键,完成一个时钟,此时:
PC值为03(时钟上升沿PC+1)
A值为00
uPC值为71 (时钟上升沿uPC+1)
uM 输出为:CB FF FF (取指指令)
第五条微指令
按一次STEP键,完成一个时钟,此时:
PC值为04(时钟上升沿PC+1)
IR 值为74,uPC值为74 (指令码)
uM 输出为:FF 77 FF (R?值送MAR)
第六条微指令
按一次STEP键,完成一个时钟,此时:
MAR 值为00
uPC值为75 (时钟上升沿uPC+1)
uM 输出为:D7 BF F7 (EM 值送A)
第七条微指令
按一次STEP键,完成一个时钟,此时:
A值为7C
uPC值为76
uM 输出为:CB FF FF (取指)
用同样的方法执行余下的指令。也可以用SCAL 或EX 键执行指令。
在做分部模块实验时,实验仪键盘0...F,NX,LS不起作用,显示屏显示内容为8 芯电缆的连接方式。例如显示屏显示内容如下:表示手动方式,J1 通过8 芯电缆接到J3,或J2 通过8 芯电缆接到J3。
第九章 CPTH 集成开发环境使用
CPTH 集成调试软件界面分六部分:
1) 主菜单区 实现实验仪的各项功能的菜单,包括[文件][编辑][汇编][运行][帮助]五大项,各项下面做详细介绍。
2) 快捷图标区 快速实现各项功能按键。
3) 调试窗口区 在此区域有 调试窗口、源程序窗口、 EM程序代码窗口。调试窗口显示程序编译后的机器码及反汇编的程序;源程序用于输入、显示、编辑汇编源程序;EM 程序代码窗口用数据方式机器码。
4) 结构图区 结构图能结构化显示模型机的各部件,以及运行时数据走向寄存器值,图示帮助进行图示化实验指导。逻辑波形图能显示模型机运行时所有信号的时序。
5) 微程序/跟踪区 微程序表格用来显示程序运行时微程序的时序,及每个时钟脉冲各控制位的状态,跟踪表用来记录显示程序及微程序执行的轨迹,指令系统显示指令集。
6) 寄存器状态区 用来显示程序执行时各内部寄存器的值。
1) 主菜单
主菜单分[文件][编辑][汇编][运行][帮助]五部分
[文件 | 打开文件] 打开已有的汇编程序或文本文件。
[文件 | 保存文件] 将修改过的文件保存。不论是汇编源程序还是其它文本文件,只要被修改过,就会被全部保存。
[文件 | 新建文件] 新建一个空的汇编源程序。
[文件 | 另存为... ] 将修改过的程序换名保存。
[文件 | 打开指令系统/微程序] 打开设计好的指令系统和微程序文件,用于俢改指令系统和微程序文件。
[文件 | 调入指令系统/微程序] 调入设计好的指令系统和微程序定义,用于编译汇编源程序。
[文件 | 退出] 退出集成开发环境。
[编辑 | 重做] 撤消/恢复上次输入的文本。
[编辑 | 剪切] 将选中的文本剪切到剪贴板上。
[编辑 | 复制] 将选中的文本复制到剪贴板上。
[编辑 | 粘贴] 从剪贴板上将文本粘贴到光标处。
[编辑 | 全选] 全部选中文本
[汇编 | 汇编] 将汇编程序汇编成机器码并下载。
[运行 | 全速执行] 全速执行程序。
[运行 | 单指令执行] 每步执行一条汇编程序指令。
[运行 | 单微指令执行] 每步执行一条微程序指令。
[运行 | 暂停] 暂停程序的全速执行。
[运行 | 复位] 将程序指针复位到程序起始处。
[帮助 | 关于] 有关CPTH 计算机组成原理实验仪及软件的说明。
[帮助 | 帮助] 软件使用帮助。
2)快捷键图标
图标的“刷新”功能就是在连机过程中刷新各寄存器,程序存储器,微程序存储器的值。以便观察实验仪的各参数内容。
文件的“打开”、“保存”功能与主菜单的相应功能一样。
文件的编辑功能,执行控制功能,其它快捷命令与主菜单也相同。
3)调试窗口区
调试窗口区分三个窗口:调试窗口、源程序窗口、EM 程序窗口
源程序窗口用于输入、修改程序。在[文件]菜单中打开一个以“*.ASM”为后缀的文件时,系统认为此文件为源程序,其内容会在源程序窗口显示,并可以修改,然后编译。若再次打开以“*.ASM”后缀的文件,则新文件将旧文件覆盖,在源程序窗口只显示最新打开的汇编源程序。在[文件]菜单中,使用“新建文件”功能,会清除源程序窗口的内容,让用户重新输入新的程序。
调试窗口用于显示程序地址、机器码、反汇编后的程序。
EM 程序窗口以十六进制数据的形式显示程序编译后的机器码。可以直接输入数值来修改机器码。
4)结构图区
结构图区分三种窗口,结构图窗口、图示帮助窗口、逻辑分析窗口。
结构图窗口显示模型机的内部结构,包括各种寄存器(A、W、R0-R3、MAR、IR、ST、L、D、R)、运算器(ALU)、程序指针(PC)、程序存储器(EM)、微程序指针(uPC)、微程序存储器(uM)及各种状态位(RCy、Rz、IReq、IAck),在程序单步运行时,可以在结构图上看到数据的走向及寄存器的输入输出状态。其中DBUS为数据总线、ABUS为地址总线、IBUS 为指令总线。RT1、RT0 显示的将要执行的指令的第几个时钟周期。本模型机最多有四个时钟周期,用RT1、RT0 的11、10、01、00 四个状态表示。见上图。
图示帮助进行图示化实验指导。
逻辑分析窗口显示的是在指令执行时,各种信号的时序波形,包括所有寄存器、所有的控制信号在不同时钟状态下的值,可以直观地看到各种信号彼此之间的先后时序关系。
5)指令/微程序/跟踪窗口
此区分三页:指令集窗口、微程序窗口、跟踪窗口。
指令集窗口用于显示指令系统和设计用户自己的指令系统。各条指令相应的微程序设计在“uM 微程序”窗口中设计(见uM 微程序窗口)
uM 微程序窗口用于观察每条指令所对应的微程序的执行过程,以及微代码的状态。在此窗口中,可以看到数据是从何寄存器输出的、数据输入到何寄存器、地址是由PC输出还是由MAR 输出、运算器在做何种运算、如何移位、uPC及PC如何工作等等。可以通过改变窗口下方的微代码的各个控制位的方式来重新设计微程序,与“指令系统”窗口的指令修改相结合,可以设计自己的指令。
可以将鼠标移到相应的程序行或微程序行来显示执行该指令或微指令时,各寄存器、控制位的状态。
跟踪窗口显示程序执行过程的轨迹,包括每条被执行的指令、微指令,以及微指令执行时,各控制位、各个寄存器的状态。
6)寄存器状态
寄存器状态区显示程序执行时,各内部寄存器的值。
附录一 实验用芯片介绍