对CPU内部总线,主要是通过3位编码(标记为DC1),用来选择把哪8位数据发送到CPU内部总线IB上。可以向内部总线IB传送数据的信息来源包括:
ALU的输出结果,将ALU的输出送到内部总线,主要目的是用于把累加器的内容写进内存或I/O接口,即把ALU的输出经内部总线、经过双向3态门电路(74LS245)传送到外部数据总线OB(DB),而DB的每一位与内存的数据线、I/
O接口的数据线直接连接在一起。
程序状态字,由4位状态标志位寄存器的输出C、Z、V、S,及允许中断触发器(INTE)的输出和3位中断优先级P2、P1、P0信号总共8位信息组成。将这8位程序状态送到IB,也是为了将其写入内存。在响应中断后,用于通过PUSHF指令保存中断现场信息。
符号位扩展寄存器,是8位的全"0"或全"1"信息,这是8位的TEC-3机中的一个特殊问题,在计算相对转移指令的转移地址时,完成16位地址的高8位地址计算过程必然用到符号位扩展支持。前面已经提到,计算相对转移指令的转移地址,是通过把一个8位的补码(由汇编程序计算得到)与该转移指令本来的16位地址(一定为正数,故其原码与补码相同)相加来实现。此时,先用8位的补码与16位地址的低8位相加,这没有问题;但切不可忘记,计算高8位地址时,必须把8位补码的最高位(补码的符号位,可能为0或1)扩展到高8位的每一位上去参加相加,这是进行不同长度的两个整数补码数据相加运算器时必须完成的,通常被称为补码数的符号位扩展处理。具体实现办法,在计算低8位地址时,把8位补码的符号位扩展出8位并保存到一个8位的专用寄存器中,在计算高8位地址时,再把这一专用寄存器中内容与原16位地址的高8位相加。计算低、高各8位地址时,还有个C0的问题,前面已多次提到。
8位的数据手拨开关,用于把通过该开关所拨的内容,经过内部总线传送到计算机内相关部件中。
8位的中断向量,是16位的中断向量的低位部分,中断向量由3位的中断优先级拼接上确定的高13位数值得到,处理中断时,用于找到中断服务子程序的入口地址。
在任何时刻只能把一个数据来源送上总线。为了从上述5个数据来源中选取其一,可以设置3位码(标记为DC1),并通过译码器给出的译码信号打开不同的选择门线路来完成。在TEC-3计算机的实现中,具体规定如下。
DC1码 译码信号 操作说明
000 /SWTOIB 送开关内容到CPU内部总线
001 /RTOIB 送ALU输出到CPU内部总线
010 /INTA 送中断向量到CPU内部总线
011 /FTOIB 送状态到CPU内部总线
100 /STOIB 送扩展符号到CPU内部总线
101 NC 不操作
110 /EI 用于开中断指令,置中断允许触发器INTE
111 /DI 用于关中断指令,清中断允许触发器INTE
这里有2个问题需要特殊说明。
第一个,DC1有8个译码输出状态,把其中的2个,转义用于修改中断允许触发器的状态,为按照原来意义派不上用途的2个译码状态分配了新的控制功能。有关中断允许触发器,开中断指令,关中断指令等问题到讲解中断的章节中介绍。
第二个,对于向内部总线发送数据,虽然指定了DC1的8个译码输出状态中的一个为NC,但我们并没有使用它,因为都不向总线发送数据,就意味着总线"悬空",即总线每一位都处于高阻态,这样做是不好的,总线"悬空"使其很容易受到外界干扰而造成计算机的不可靠。在教学计算机的实现中是按下述思路解决这一问题的。当真的没有信息送到IB时,就把开关的内容送到IB,这只要使DC1为000码即可。但是在读内存或I/O接口时,被读出的数据需要经数据总线、双向3态门线路(74LS245)传送到IB,再送到计算机相应部件中,而此时的DC1用的还是000码(换成101码不就没问题了),会造成2路数据同时送到IB的冲突。为此,又设置了一个条件,DC1编码为000且又不是内存和I/O接口读操作时,才是送开关内容到内部总线IB,这可以到DC1的译码器那里解决,也可以用其他办法处理。
|
|