|||
5. 原型CPU设计
这一部分将介绍CPU的整体设计,这种设计现在被称为微体系结构。自从有了高速缓存cache之后,CPU的概念已经转化成“核”,即能够运行程序的单位。为了简单先设计一个原型CPU,存储器是特制的只读存储器。
5.1. 原型CPU的结构
5.1.1. EROM将程序预先以某种工艺放入某种存储器,使用时只能读而不能写,这种存储器叫只读存储器(ROM)。图5‑1是有16个存储单元的8位只读存储器。每个地址线adi就是一个存储单元。数据线dk与地址线adi之间用带开关的二极管连接,被选中单元开关接通,那一位数据就是1,不然是0。这个ROM可以事先手动输入数据和程序,因而叫可输入只读存储器,简记为EROM。
图5‑1 可输入的ROM
以只读存储器EROM代替输入设备,以发光二极管组代替输出设备,并且只能作加、减法运算的计算机,应该是最简单的CPU了。这种计算机实际上是省略了输入输出设备,突出了计算机的核心部件。
5.1.2. 整体结构能够做加减运算CPU的整体结构如图5‑2所示。它是在加减法运算器的基础上改造而来的,比计算器要复杂一些,特别是增加了控制器,从而使这个机器的自动化程度比计算器有了本质的提升。
图5‑2 加减运算CPU结构
这个计算机包括可输入只读存储器EROM、地址寄存器MAR、程序计数器PC、指令寄存器IR和控制器CON,时钟直接由控制器CON给出。这个计算机的内部总线Bus由8条导线组成,指令寄存器IR、输出寄存器O、数据寄存器B、A和加减运算器ADD/SUB都是8位的,它们都和内部总线相连,通过总线交换数据;地址寄存器MAR和程序计数器PC都是4位的,直接和总线的低4位相连。这样内部总线既可以传输8位的数据,也可以传输4位的地址信号。输出寄存器O的输出直接连接发光二极管组,通过发光二极管组显示输出寄存器O的内容。图中以L开头的短线,代表寄存器的写数据控制端,称为L门;以E开头的短线代表寄存器的输出控制三态门,叫做E门。
5.1.3. 逻辑组成加减运算CPU的逻辑组成的五部分,分别是
(1) 运算器。它包括ADD/SUB、A、B。
(2) 存储器。它包括 MAR和EROM。
(3) 控制器。它包括 PC、IR、CON。
(4) 输入装置EROM的开关组。
(5) 输出寄存器O和发光二极管。
运算器和控制器过去一般统称为CPU,现在的CPU还包括cache(静态存储器)。
5.1.4. 设备功能这个原型CPU比加减法计算器增加了累加器、可输入只读存储器、程序计数器、指令寄存器和控制器。
累加器寄存器A不但可以存放运算器运算前的数据,而且用来存放每次运算的结果,在多次连续的加法运算中,寄存器A起到了累加的作用,因而把A叫累加器。它有L门、E门控制数据的输入输出,能与总线直接进行数据交换。它的另一个输出端与ADD/SUB的输入端数据线直接相连,这个输送没有E门的控制。
寄存器B是与寄存器A 配合使用的缓冲寄存器,它的输出端直接与ADD/SUB的另一个输入端相连,故可以把从总线接收的数据直接送到ADD/SUB的另一个输入端。寄存器B只是从总线上接收数据,而不需要将内容直接送到总线,故不用E门控制。
可输入只读存储器可事先输入数据的输入只读存储器EROM,既充当存储器,也充当输入装置。EROM共有16个存储单元,前端有地址译码器,通过4位的存放存储单元地址的寄存器MAR,确定正在使用的存储单元,并且EROM的E门能控制存储单元的数据向总线输出。
地址寄存器MAR通过L门从内部总线Bus接收地址数据,并将地址数据直接送到EROM的地址译码器,从而选中需要的存储单元。
程序计数器程序计数器PC的初始值是0,它的加1功能,可以使它连续地指向每一个存储单元。假如若干个指令是从0号存储单元开始存放的,那么开始时将PC的值送到MAR,就可以选中第一条指令,在执行指令的过程中使PC加1,那么在执行完一条指令之后,就又会将下一条指令执行,这样计算机就会不断地自动地运行下去。
指令寄存器可控缓冲寄存器IR是专门放置指令的,因而被称为指令寄存器。在指令放到IR中的时候,有指令译码器翻译指令编码,这样就能够知道这时执行的是什么指令,以及数据放在哪里等。指令寄存器IR从总线接收指令数据,能够将指令数据的高4位和低4位分开。如果它的高4位放置指令编码,低4位放置数据的地址,那么高4位直接送到控制器的指令译码器,低4位可以再通过内部总线送到MAR或PC。
控制器控制器CON是发出控制信号的地方,它有12条输出线,分别连接在各个设备的控制线上,它同时发出Clr和Clk控制信号,其中还包括电源开关等,其详细结构下面将专门讨论。
5.1.5. 计算机控制字完整计算机的基本动作是由它的所有控制线的值来决定的,计算机所有控制线排列所成的字,在计算机状态变化中起着决定性的作用,也就是说计算机的一切动作发生都由这个排列字指挥。
定义5‑1 除了Clr和Clk之外的全部控制线排列所成的一个字,叫计算机控制字。
这个加减运算CPU的计算机控制字是:
CpEpLmErLiEiLaEaSuEuLbLo
这个计算机控制字有12线,每一条线的取值不是0就是1,所以每条线又是一个逻辑变量,这些变量的值是一个12位的二进制数,它的有序变化,就决定着这个计算机的全部运动。
例如,CpEpLmErLiEiLaEaSuEuLbLo=100000000000,当Clk由0变到1的瞬间,计算机PC的值会加1,而CpEpLmErLiEiLaEaSuEuLbLo=011000000000,当Clk由0变到1的瞬间,程序计数器的值会通过总线传输到地址寄存器,通过MAR直接输送到连接的地址译码器,选中只读存储器EROM中由PC指示的存储单元。
5.2. 计算机功能设计5.2.1. 可实现功能分析计算机能够干什么事情,实现怎样的功能,这和计算机的结构直接相关。图5‑2的总线结构能够进行数据传送,所以可以让EROM存储的数据送到累加器A,以便从A分发到各处,比如将数据从A送到输出寄存器O显示输出。当然也可以选择让EROM存储的数据直接送到输出寄存器O显示输出,或者让EROM存储的数据直接送到寄存器B或寄存器IR等。
由于有加减法运算器,自然这个计算机具备加减法运算的功能。要实现EROM的数据能进行加法或减法运算,必须现将EROM的数据送到寄存器A和B中,这种能力这个计算机是完全具备的。
由于寄存器O、B、MAR都没有输出控制的E门,因而也就都没有向总线输出数据的功能,不能够将它们接收的数据再分发到总线上的其他设备。相反,PC和EROM没有从总线上接收数据的L门控制线,所以它们没有从总线接收数据的功能。
指令寄存器IR有输入输出控制线,所以可以从总线接收数据,也可以将数据送到总线。它的高4位直接送到了控制器CON,这样放在其中的数据,就能够将高4位和低4位分开,并且通过总线可以将低4位数据送到MAR或PC。虽然IR输出的数据是8位的,但MAR或PC只通过连线接收4位,不至于出现混乱。IR的值可以传输到寄存器A、B、O。
地址寄存器MAR能够从总线接收PC、A、IR、EROM送到总线上的低4位数据,并将这4位数据做为地址信号,送到EROM的地址译码器,选中存储单元。
程序计数器PC可以通过控制线Cp实现加1的功能,初始化控制线Clr会使它的初始值为0。
Clk时钟线连接在每个设备的时标线上,可以控制整个系统按着时间要求工作。
5.2.2. 指令系统设计计算机结构能够提供的功能并不是我们都需要的,根据实际需要可以将一些功能组织到一起,形成对我们有用的工作模式。这就是计算机的指令设计问题。
指令执行过程指令和数据都要存放在计算机的存储器中,执行指令的一般过程:
(1) 将程序计数器的内容送到地址寄存器,选中指令存储单元;
(2) 将存储器选中单元的内容送到指令寄存器进行译码和分析;
(3) 将程序计数器加1,准备取下一条指令;
(4) 根据译出的指令线和节拍线的变化,完成该指令的模式动作。
这其中(2)的实现在这个原型CPU中是IR的高4位和低4位的可分性。如果将指令写成“指令编码数据地址”的形式,那么就可以用4位的二进制编码表示指令,同时用4位的二进制数指出存储单元的地址。例如,“将某存储单元的内容送到累加器A”这个指令用二进制数0000来表示,那么具体的地址就可以写在这个编码的后面。这样将“将5号存储单元的内容送到累加器A”,就可以写成0000 0101。
用二进制数表示的指令编码,一般叫操作码,操作码后面写出的二进制数叫操作数。这种先写操作码后写操作数的形式就叫做指令格式。冯.诺依曼计算机中指令格式是实现程序执行的重要一环,正是由于指令两部分的合写和拆分,形成了计算机的各种基本动作,从而使指令功能的实现,能通过一连串变化的基本动作完成。
指令设计依据计算机的硬件构成(不包括控制器),来确定计算机能完成的基本任务,体现在计算机指令设计的过程当中。
定义5‑2 一台计算机所能够识别的全部指令叫这台机器的指令系统或指令集。
一台计算机的指令系统设计,既和计算机的硬件构成有直接关系,也和设计者要求及计算机能完成那些基本任务有关。因而会出现即使是相同的计算机结构也会有不同的指令系统的现象。计算机的指令设计是很有学问的,一般地应将那些最基本的任务设计成指令,也就是说通过这些基本任务的指令组合,可以完成更加复杂的任务。
根据需要,加减运算CPU的指令系统设计,具体如表5‑1所示。由于计算机能够完成的基本任务,会形成计算机的一种运行模式,成为一种功能,所以表中不标注基本任务,而是标注功能。表5‑1的助记符一栏体现了指令的格式,其中OUT、STP没有操作数部分,可以认为是操作数隐含的一种特殊情况。
表5‑1 指令系统设计
功 能 | 助记符 | 操作码 |
把某存储单元R的内容送到累加器A | LDA R | 0001 |
把某存储单元R的内容与累加器A的内容相加结果送A | ADD R | 0010 |
用累加器A的内容减去某存储单元R的内容结果送A | SUB R | 0011 |
将累加器A的内容送到输出寄存器O输出 | OUT | 1000 |
停机 | STP | 1111 |
指令功能的设计中,首先考虑如何实现加法或减法的运算。因为数据是放在EROM中的,因此要先将一个数送到累加器A,然后再将另一个数送到寄存器B与A中的数相加,这样就设计了指令LDA R和ADD R,自然SUB R也是这样考虑出来的。运算的结果可以直接送到寄存器O输出,但如果是连续计算,A要放中间结果,故而让累加器A的内容输出更加方便。
助记符表述的指令也是是由两部分组成的,前面是表示功能的指令码,指令码后面的部分是指令的辅助说明,辅助说明可以有多项,这里的辅助说明只有一项R,它表示存储器的地址。指令码和指令辅助说明组成的指令形式就是指令格式。指令格式的复杂度,取决于指令辅助说明的项目多少,一般地说,项目越多,指令的越复杂。用助记符表示的指令和计算机实际设计的指令是一一对应的,指令助记符在程序设计中称为汇编指令。
汇编指令组成的两部分,也分别叫操作码和操作数。计算机的指令可以带操作数,也可以不带操作数,但不能没用操作码。在进行指令处理时,总是要将操作码和操作数分开,由操作码来确定指令的一般功能,由操作数来指出具体的实施内容。
指令全程分析将多条指令从EROM的0号单元顺序存放,用程序计数器PC来指示将要执行的那条指令,并在执行指令的过程中让PC加1,这样就能重复地通过PC的指示执行全部的指令,这一过程是计算机自动执行程序的要点。根据本计算机的结构的特点,现在来分析每条指令的执行过程。指令的执行的整个过程叫指令全程。
LDA的指令全程LDA指令的执行过程如下:
(1)将程序计数器PC的值送到地址寄存器MAR;
(2)将EROM输出的内容送到指令寄存器IR;
(3)PC 加1;
(4)IR的低4位送到MAR;
(5)EROM输出的内容送到累加器A。
ADD的指令全程(1)将程序计数器PC的值送到地址寄存器MAR;
(2)将EROM输出的内容送到指令寄存器IR;
(3)PC 加1;
(4)IR的低4位送到MAR;
(5)EROM输出的内容送到数据寄存器B;
(6)A+B的结果送到累加器A。
SUB的指令全程(1)将程序计数器PC的值送到地址寄存器MAR;
(2)将EROM输出的内容送到指令寄存器IR;
(3)PC 加1;
(4)IR的低4位送到MAR;
(5)EROM输出的内容送到数据寄存器B;
(6)A-B的结果送到累加器A。
OUT的指令全程(1)将程序计数器PC的值送到地址寄存器MAR;
(2)将EROM输出的内容送到指令寄存器IR;
(3)PC 加1;
(4)A的内容送到输出寄存器O输出。
上面各指令的指令全程的每一步都对应着一个计算机的基本动作,由此可见计算机的基本动作是计算机能够完成各种任务的基础。
从LDA、ADD、SUB的指令全程步骤(4)可以看到,要取出在存储器中的数据,都要将指令寄存器IR中的指令操作数回送到地址寄存器MAR,这是访问存储器的通行作法。将指令操作码和操作数进行拆分,是计算机指令分析不可缺少的一步。
微指令驱动总线结构的计算机基本状态的变化,是由计算机控制字的值来确定的。这台计算机的控制字是CpEpLmErLiEiLaEaSuEuLbLo,共12位,指令全程的每一步都可以用一个控制字的值来指挥,因此把计算机控制字的一个值称为一条微指令。
微指令的集合称为微指令程序。例如LDA的指令全程用微指令写出是:
011000000000
000110000000
100000000000
001001000000
000100100000
指令的微指令程序一般称为例行程序。
指令例行程序中的微指令必须严格地按着一定的顺序出现,每次微指令出现就会使计算机完成一个基本动作,这就是微指令的执行过程。由于每一个指令所包含的微指令是固定的,指令的执行就会重复执行例行程序的微指令,加上微指令执行的时间往往是固定的,所以顺次执行的微指令时间被称为机器节拍。
显然例行程序的微指令是节拍和指令的函数,也就是说,指令一定,节拍一定,那么微指令也就确定了。再进一步分析,微指令是计算机控制字的一个值,微指令的每一位数都是对应控制线的一个值,因此控制线的值也是由节拍和指令来确定的。如果将每条控制线理解成逻辑变量,那么它们就都是指令和节拍的函数。
将这台加减运算CPU的每条指令的例行程序都罗列出来进行分析,可以明确地反映这种函数关系。为了方便分析,把全部指令的节拍凑成一样的6拍,多余的节拍用空操作微指令“000000000000”填充,表 5‑2所示的就是这种情况。
由表 5‑2可以看出指令的执行是通过计算机控制字的变化来实现的,而计算机控制字的变化会随着节拍和指令的不同而不同,计算机控制字的每一个逻辑变量都是机器节拍变量和指令变量的函数。
无论是从指令全程的分析还是表 5‑2都可以看到,每个指令的前3拍都是一样的,这3拍的计算机控制字只随节拍变化,与指令无关。这3拍仅是将指令从EROM中取出来,放到指令寄存器IR中,PC加1,所以被认定只是一个取出指令的过程,叫指令的取指周期。每个指令的取指周期以外的动作过程叫指令的执行周期。取指周期和执行周期合起来的过程就是指令周期。计算机之所以能够自动地执行指令,从而完成任务,和指令的取指周期只在节拍的驱动下进行动作有关。
加减运算CPU的指令取指周期占3个节拍,而指令执行周期最多也是3个节拍,所以指令周期是6个节拍。
表5‑2 指令和计算机控制字变化表
指令助记符 | 机器动作 | 节拍 | Cp | Ep | Lm | Er | Li | Ei | La | Ea | Su | Eu | Lb | Lo |
LDA R | PC→MAR | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
EROM→IR | 2 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
PC+1 | 3 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
IR→MAR | 4 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | |
EROM→A | 5 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | |
| 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
ADD R | PC→MAR | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
EROM→IR | 2 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
PC+1 | 3 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
IR→MAR | 4 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | |
EROM→B | 5 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | |
A+B→A | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | |
SUB R | PC→MAR | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
EROM→IR | 2 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
PC+1 | 3 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
IR→MAR | 4 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | |
EROM→B | 5 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | |
A-B→A | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | |
OUT | PC→MAR | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
EROM→IR | 2 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
PC+1 | 3 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
A→O | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | |
| 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
STP | PC→MAR | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
EROM→IR | 2 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
STOP | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
计算机的动作都是由微指令来指挥的,而微指令的产生又是由机器节拍和指令来决定的,因此计算机的动作和它们之间的逻辑关系密切相关。由机器节拍和指令变动产生微指令的逻辑电路是计算机控制的核心,这个核心逻辑电路称为计算机的控制矩阵。
5.3.1. 控制矩阵中的函数用线表示指令分析表 5‑2可以看出自变量就应该有11个,那就是节拍1、2、3、4、5、6,指令LDA、ADD、SUB、OUT、STP。为了方便书写,将节拍和指令都设置成一位的代码,各自的代码就如表 5‑3所示那样。STP指令的作用是停止计算机运行,它的作用不通过计算机控制字来完成,因此设计机控制矩阵不用设置STP的代码,这样自变量考虑10个就可以了。因变量就是每个设备的控制线,这里一共有12条。
表5‑3 节拍和指令代码
节拍名称 | 代码 | 变量名称 | 代码 |
第六拍 | A | LDA | G |
第五拍 | B | ADD | H |
第四拍 | C | SUB | I |
第三拍 | D | OUT | J |
第二拍 | E | STP |
|
第一拍 | F |
|
|
前面的分析多次说明要将指令的操作码和操作数放到指令寄存器IR中,其目的有两个。其一,将指令码转化成一条能够标志该指令执行的线;其二,将指令的操作码和操作数分离,以便进行相应的处理。
指令操作码可以通过译码器转化成各自的标志线。图5‑3是将指令寄存器的高4位引出线通过译码器译出指令线的逻辑电路。实际当中,只要哪一个指令的操作码进入指令寄存器IR,立即在的输出端就会有相应的指令线为1,表明执行的是这一条指令。
图5‑3 指令译码器
节拍器例行程序的6个节拍可以用一个6位的环行计数器的输出端表示。图5‑4中当Clr=1时输出端F=1,进入第一个节拍,以后每一次Clk=1都会使为1的输出端向左移动一位,从而顺次表示2、3、4、5、6拍。
图5‑4节拍器
控制矩阵真值表将这些自变量和因变量的值变化过程列成真值表,就得到表5‑4。根据逻辑变量运算式A+A=A知道,在真值表中相同的部分作用是相同的,所以表中每个指令的指周期的3个节拍就简写成一个。由于前3个节拍因变量的变化是与指令无关的,因而表中这部分指令变量的值用空白表示。表中1~3行是各指令的取指周期,4~6行是指令LDA的执行周期,7~9行是指令ADD的执行周期,10~11行是指令SUB的执行周期,13~15行是指令OUT的执行周期。
表5‑4 控制矩阵真值表
机器动作 | A | B | C | D | E | F | G | H | I | J | Cp | Ep | Lm | Er | L i | E i | La | Ea | Su | Eu | Lb | Lo |
PC→MAR | 0 | 0 | 0 | 0 | 0 | 1 |
|
|
|
| 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
EROM→IR | 0 | 0 | 0 | 0 | 1 | 0 |
|
|
|
| 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
PC+1 | 0 | 0 | 0 | 1 | 0 | 0 |
|
|
|
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
IR→MAR | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
EROM→A | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
无动作 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
IR→MAR | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
EROM→B | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
A+B→A | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
IR→MAR | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
EROM→B | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
A-B→A | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
A→O | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
无动作 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
无动作 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
根据表5‑4各行之间是或的关系,同行自变量的值是与的关系,应用因变量的逻辑函数求法,得
Cp=A'B'C'DE'F'
Ep=A'B'C'D'E'F
Lm=A'B'C'D'E'F+A'B'CD'E'F'(GH'I'J'+G'HI'J'+G'H' IJ')
Er =A'B'C'D'EF'+A'BC'D'E'F'(GH'I'J'+G'HI'J'+G'H' IJ' )
Li =A'B'C'D'EF'
Ei =A'B'CD'E'F' (GH'I'J'+G'HI'J'+G'H' IJ')
La=A'BC'D'E'F'GH'I'J'+AB'C'D'E'F'(G'HI'J'+G'H' IJ')
Ea=A'D'CE'F'G'H'I'J
Su=AB'C'D'E'F'G'H' IJ'
Eu=AB'C'D'E'F'(G'HI'J'+G'H' IJ')
Lb=A'BC'D'E'F'(G' HI'J'+G'H' IJ')
Lo=A'B'CD'E'F' G'H'I'J
在环形计数器中,因为E=1 必有 A=B=C=D=F=0 从而 A'B'C'D'EF'=1
而当E=0时,不论、A、B、C、D、F为何值都有 A'B'C'D'EF'=0
于是有
A'B'C'D'EF'=E
同理
A'B'C'D'E'F=F
A'B'C'DE'F'=D
A'B'CD'E'F'=C
A'BC'D'E'F'=B
AB'C'D'E'F'=A
对于一台计算机来说,各指令之间也是两两互相排斥的,故也有
GH'I'J'=G
G'HI'J'=H
G'H'IJ'=I
G'H'I'J=J
这样,上面的逻辑表达式可以化成
Cp=D
Ep=F
Lm=F+C(G+H+I)
Er =E+B(G+H+I)
Li =E
Ei =C(G+H+ I)
La=BG+A(H+ I)
Ea=CJ
Su=AI
Eu=A(H+I)
Lb=B(H+I)
Lo=CJ
5.3.2. 控制矩阵电路根据上面计算机控制字的12个因变量的函数,很容易画出这台加减运算CPU的控制矩阵电路图。图5‑5的上面6条线是节拍线,接下来的4条是指令线,下面的输出是计算机控制字的12条线。这种能够发出计算机控制字的电路,设计起来总是纵横交错的形式,看起来很像矩阵,因而称为计算机的控制矩阵。
加减运算CPU的控制矩阵相对是比较简单的,复杂计算机的纵横导线会成百上千,设计图会非常庞大。实际设计中可以将控制矩阵的设计分块进行,然后根据块间的逻辑关系进行增添。在不同的块之间控制线会出现重复,根据重复的控制线之间是逻辑或的关系,再大的控制矩阵也容易设计出来。
图5‑5 控制矩阵的电路
5.4. 控制器和整机工作过程
5.4.1. 控制器这台加减运算CPU的控制器在6个节拍中有序地发出微指令,从而完成每条指令的执行过程。整个控制器的电路如图5‑6所示,这里指令寄存器IR的高4位直接连接在指令译码器的输入端,而指令译码器的输出端就是4个指令的指令线。指令线和6位环行计数器的输出端,直接成为了控制矩阵的输入端。
图5‑6 控制器电路
5.4.2. 整机工作过程这台计算机的整机工作过程如下:
当使用的人合上电源开关之后,由图 5‑6可以看出瞬间有一个高电位使得触发器置位,于是接在这个触发器Q端的时钟脉冲振荡器马上开始工作,不断地发出高频的时钟脉冲。在启动开关合上同时,Clr端也瞬间为1,于是相应的设备被初始化,在时钟震荡之前形成程序计数器PC=0000,环形计数器的值为000001等。
(1)Clr是瞬间作用的,故当有效时钟脉冲到来的时候,机器的各种设备已经进入了正常工作状态。由于F=1,于是从控制矩阵发出的计算机控制字是 011000000000,即Ep=1,Lm=1。这样,当第1个时钟脉冲到来时,PC中的值0000送到了MAR,于是就选中了0000号单元。
(2)与此同时, Clk到来使环行计数器的值变成了000010,即E=1,于是第2个时钟脉冲到来之前,Er=1,Li=1。当第2个时钟脉冲到来之时,0000号单元的内容被送到了指令寄存器IR,这时IR将其高4位送到CON的指令译码器。
(3)与此同时,环形计数器的值变成了000100,即D=1,于是第3个时钟到来之前只有 Cp=1。当第三个时钟脉冲到来之时PC加1,第4个节拍变量C=1。
以上(1)~(3)是取指周期的工作,继后到来的时钟脉冲将要完成对取出的0000号单元的指令的执行工作,(4)~(6)进入执行周期。
(4)假如0号存储单元存储的指令是: LDA 1010,那么从第2个节拍之后,通过指令译码器的工作,LDA的指令线G就一直为1。它和节拍C合作使 Ei=1, Lm=1,当第4个时钟脉冲到来时,使第5个节拍线B=1,从而使Er=1,La=1。
(5)第5个时钟脉冲到来之前Er=1,La=1,当Clk由0变到1的瞬间,就将1010存储单元的内容送到累加器A了。与此同时节拍线A=1。
(6)在节拍变量A=1之后的第6个Clk=1到来之后,又会有节拍线F=1。
(1)~(6)的循环重复,可以不断地执行在存储器中顺序存放的指令。 如果指令寄存器IR中得到的指令代码是1111,那么指令译码器译出的高电位线直接送到启动停止触发器的R端,至使Q=0,于是就停止了时钟脉冲振荡器的震荡,也就使这台计算机停止了工作。
5.4.3. 时序一台计算机有许多部件组成,要使这些部件有条不紊地进行工作,就必须要它们按照一定的时间顺序动作,这就是计算机时序问题。计算机中信息的流动有先有后,如果传输的过程中颠倒了顺序,必然会出现错误的结果。因此计算机的设计分析中,将时序都放在一个很重要的位置考虑,尤其是在多条信息通路进行数据传送时,更要注意哪一路数据先到达,是否会错序。如果发生了时序的错误,那么或者设法加快较慢的一路传输速度,或者降低较快的一路传输速度,以便调整到正确的时间顺序。
主频与节拍计算机的时间顺序是由计算机的频率时钟来确定的。控制器中石英振荡器产生的震荡频率一般叫计算机的主频。计算机的主频表明计算机的CPU 运行速度,是计算机十分重要的参数。主频的一个振荡周期决定计算机的一个基本动作,因而称之为一个机器节拍。计算机的时序是用节拍来量度的。
为了研究方便,在总线结构的计算机系统中,又提出总线周期、指令周期、取指周期、执行周期等概念。
所谓的总线周期是指总线传输一个单位数据所需要的节拍数。设计的加减运算CPU,传送一个单位数据只要一个节拍,而有的计算机可能需要两个以上的节拍。
取指周期是从存储器中取出指令所需要的节拍数。加减运算CPU的取指周期是3个节拍。执行周期是执行取出的指令所需要的节拍数。加减运算CPU执行周期也是3个节拍。取指周期和执行周期组成了计算机的指令周期。加减运算CPU的指令周期是6个节拍。
时序图为了研究时序,人们常用图来表示,这种图叫时序图(见图 5‑7)。图中从上到下分别代表主频,取指周期,执行周期和指令周期。从图上可以看到取指周期占3个节拍,执行周期占3个节拍并且是在取指周期之后。指令周期占6个节拍。
一般的时序图都要反映出主要部件间在时间上的相互协作关系,因而一个计算机的时序图要比图5‑7复杂得多,可以从时序图上清楚地知道各个部件工作的先后顺序,这在计算机仿真设计中有十分重要的作用。有兴趣的读者可以参考相关资料,在此不详细描述。
图5‑7 时序
一台计算机的控制矩阵确定了,也就相当于确定了这台计算机的指令集。根据计算机的指令集,就可以进行程序设计。下面就以例子来说明利用这台加减运算CPU如何来进行程序设计。
5.5.1. 汇编源程序利用汇编指令进行程序设计,就叫做汇编程序设计。由于汇编指令是与具体的计算机直接相关的,因此实际使用的计算机汇编程序设计也比较复杂,当然这里给出的汇编程序设计就简单多了。为了方便,把数用方括号括起表示这个数所在的存储单元地址。
【例5‑1】 用汇编程序完成 3+2+1-4的计算。
依据加减运算CPU的指令系统,可以设计如下的程序:
LDA | [3] |
ADD | [2] |
ADD | [1] |
SUB | [4] |
OUT |
|
STP |
|
这个程序解释是很容易的。第1条指令是说将数3装入累加器A;第2条指令是把数3和2相加结果5放在A里面;第3条指令是说将1与A的内容5相加,结果6放在A里面;第4条指令是说将A的内容6减去4,并把结果2放在A中;第5条指令是说将A的内容2输出;第六条指令是说停止机器运行。
上面的程序可以说仅仅是逻辑上的设计,实际上这台计算机怎样执行程序还不清楚。怎样才能让计算机完成这项任务?这涉及到指令和数据在存储器中怎样存放的问题。
5.5.2. 存储器分配根据指令程序的特点,可以把存储器分为两个区域,一个是存放指令的区域,叫代码区,另一个存放要操作的数据的地方,叫数据区(见图5‑8)。根据这台计算机的结构特点,代码区一定要放在前面,从0000号存储单元开始。因为这台计算机一开机就去取0000号单元的数据,所以程序一定要从0000号单元开始存放。
由指令的格式知道,操作数是数据的地址,所以可以将数据放在代码区后面的任何位置,只要不和代码区重叠放置就可以。此题数据的起始地址是1011(2),顺序地存放了3、2、1和4,当然放在存储器中的都要是二进制数。
图5‑8 存储器分配
5.5.3. 编译
因为计算机只能识别二进制数,所以放入计算机存储器的指令和数据必须都是二进制数。用二进制数表示的计算机指令才能够被计算机识别,这种指令又叫机器指令。将汇编源程序翻译成可以被机器识别的二进制机器指令程序和数据的过程叫编译。把【例5‑1】中的汇编源程序变成二进制数放在存储器中,得到图5‑8所示的存储形式,可以看到存储器中除了二进制数之外,没有别的东西(图5‑8最右边的二进制数是地址编号)。
在将汇编指令翻译成机器指令的过程中,必须根据数据在存储器中的位置,确定指令的操作数,这要从前到后至少“扫描”两次。第一次,从前到后将操作码和数据翻译好,暂不确定操作数,并将这样的指令和数据在存储器中放好,确定出数据的地址。第二次,从前到后才能将每个指令的操作数确定。可见数据位置的确定,要求对数据的存放位置进行编排,所以整个翻译的过程是“边编排,边翻译”,因而将这一过程叫“编译”。
5.5.4. 程序执行由于这台加减运算CPU是手动输入的,因此在拨动开关时必须位置准确。程序和数据都输入存储器的相应单元后,就可以让计算机来运行这个程序了。
将【例5‑1】的具体的执行过程列成表,就是表5‑5所示的情形。
表5‑5 程序执行情况一览
节拍
指令 | 指令周期 | |||||
取指周期 | 执行周期 | |||||
F | E | D | C | B | A | |
00011011 LDA [3] | PC=0000 |
| PC=0001 |
|
|
|
Lm,Ep | Li,Er | Cp | Lm,Ei | La,Er |
| |
PC→MAR | ROM→IR | PC+1 | IR→MAR | ROM→A |
| |
00101100 ADD [2] | PC=0001 |
| PC=0010 |
|
|
|
Lm,Ep | Li,Er | Cp | Lm,Ei | Lb,Er | La,Eu | |
PC→MAR | ROM→IR | PC+1 | IR→MAR | ROM→B | A+B→A | |
00101101 ADD [1] | PC=0010 |
| PC=0011 |
|
|
|
Lm,Ep | Li,Er | Cp | Lm,Ei | Lb,Er | La,Eu | |
PC→MAR | ROM→IR | PC+1 | IR→MAR | ROM→B | A+B→A | |
00111110 SUB [4] | PC=0011 |
| PC=0100 |
|
|
|
Lm,Ep | Li,Er | Cp | Lm,Ei | Lb,Er | Su,La,Eu | |
PC→MAR | ROM→IR | PC+1 | IR→MAR | ROM→B | A-B→A | |
1000 OUT | PC=0100 |
| PC=0101 |
|
|
|
Lm,Ep | Li,Er | Cp | Ea,Lo |
|
| |
PC→MAR | ROM→IR | PC+1 | A→O |
|
| |
1111 STP | PC=0101 |
|
|
|
|
|
Lm,Ep | Li,Er |
|
|
|
| |
PC→MAR | ROM→IR |
|
|
|
|
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-21 22:42
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社