2.3 器件的组织与信息处理
我们已经介绍了计算机中使用的一些设备,也明白了它们的工作原理。要想让这些设备完成复杂一些的任务,必需要将它们组织在一起,通过相互之间的数据传递与处理来达到目的。总线结构是计算机核内一种最基本的互联形式。
2.3.1 总线结构
计算机核心部分的器件除了特殊的作用之外,一般都采用公共线路连接的方式,称为总线结构。总线结构方便数据在各个器件之间的流动。需要发送数据的器件只要将数据放到总线上,那些连接在总线上的器件只要需要,就可以直接从总线上接收,而无需考虑数据来自何方。
2.3.1.1.1 加减法计算器
图 2 14所示的是一个8位加减法计算器,这是一种典型的总线结构。A、B是连接在加减法运算器前端的数据寄存器,它们的输出端直接连接在加减法运算器的输入端。A、B的数据可以从总线上接收,分别由La、Lb控制线控制。
图 2 14 总线结构的计算器
O是一个直接与一组发光二极管相连的可控寄存器,O中的二进制数据直接使这组二极管发光(二进制数的某位是1,对应的二极管发光,为0就不发光),从而能够完成显示输出结果的任务。O的数据也是从总线接收,由Lo控制是否接收数据。
M是一个由手动开关组组织的只读寄存器,开关向上,该位值为1,开关向下,该位值为0。 M的数据输出由E门控制端Em来控制。M就是这个简单计算器的数据输入设备。
Clk是一个能够发出高电位的时钟,用它来做时标,两次Clk=1之间允许能够完成对M及Con的手工输入。实际上,这个计算器的时钟可以用一个带弹簧的按钮替代,当数据和控制字的值设定好之后,就敲击一下,让Clk的值瞬间为“1”。
Con也是手动开关组,同M一样开关向上,该位值为1,开关向下,该位值为0。它的输出不和总线连接,所以没有E门控制,输入数据是在两次Clk输出高电位之间手动完成的。由于Con的输出线连接各设备的控制线,决定控制线的信号,所以Con就是这个计算器的控制器。根据Con的输出线由左到右连接的各设备控制线来看,这个计算器的机器控制字是Em La Ea Eu Sub Lb Lo,控制字的长度有7位。
从逻辑上划分,这个计算器的输入设备是M,输出设备是O,控制器是Con和Clk,各寄存器是它的存储设备,加减法运算器是它的运算器。
2.3.1.1.2 加减法计算器的工作原理
这个计算器可以完成8位的二进制数的加减法运算。数据以手动的形式从M输入,再以手动的方式设定控制寄存器Con的Em La Ea Eu Sub Lb Lo值来完成控制。
习惯上将两个Clk=1之间的动作叫一个机器节拍。一个机器节拍可以完成一次基本的数据操作。这个计算器在每次数据传输之前必须准备好数据和设定好机器控制字。
【例 2 3】 用这个计算器计算10+32-16。
这个问题的解决的全过程,可以用表 2 1来说明。
表 2 1 计算器执行过程
顺序 动作 机器控制字 说明
1 将10输入到M 人工进行
2 将控制字输入Con 1100000 人工进行
3 Clk=1 1100000 M→A
4 将32输入到M 人工进行
5 将控制字输入Con 1000010 人工进行
6 Clk=1 1000010 M→B
7 将控制字输入Con 0101000 人工进行
8 Clk=1 0101000 10+32→A
9 将16输入到M 人工进行
10 将控制字输入Con 1000010 人工进行
11 Clk=1 1000010 M→B
12 将控制字输入Con 0101100 人工进行
13 Clk=1 0101100 42-16→A
14 输出 0010001 人工进行
15 Clk=1 0010001 A→O发光二极管现结果
2.3.1.1.3 重要启示
通过【例 2 3】可以看出机器的运行中“人机交互”的重要性。使用计算机必须完成下面两点:
第一,原始的数据必须由人来输入;
第二,人们必须将控制信号提供给计算机。
上面的这两项工作由于人的直接参与,而使计算器的运算速度慢了许多。怎样提高计算器的运算速度呢?很明显,减少人工的参与是重要的方法。减少计算机运行当中的人工参与是计算机设计需要探讨的重要问题,可以说计算机中的许多事情都要围绕这一问题展开,这一问题不仅复杂了计算机的结构,而且产生了重要的管理问题。
2.3.2 将功能动作编成指令
总结表 2 1的动作,不考虑人手动开关组和按钮的工作,机器动作可以分为“将数据送入某寄存器”,“加法运算,结果送A”,“减法运算,结果送A”,“将A的内容输出”等基本过程。那么10+32-16的运算就可以用这些基本过程写出:
(1)将10送到寄存器A;
(2)将32送到寄存器B;
(3)将加法运算结果送寄存器A;
(4)将16送送到寄存器B;
(5)将减法运算结果送寄存器A;
(6)将A的值送寄存器O输出。
将这些描述符号形式化:
(1) 10 → A;
(2) 32 → B;
(3) A+B → A;
(4) 16 → B;
(5) A-B → A;
(6) A → O。
由于数都是由M送到寄存器的,加减运算的结果都送A,输出只能是将A的值送O,所以送数过程只要指出送达的位置,加减法过程只要指出是加还是减,输出动作只要说出“输出”就明白了。因而上面符号形式也可以用下面的简单形式代替:
(1) sendA
(2) sendB
(3) add
(4) sendB
(5) sub
(6) out
或者:
(1) → A
(2) → B
(3) +
(4) → B
(5) -
(6) ←
这些表达方法我们都可以理解,但让机器能够“理解”,还必需转化成二进制数不可。例如将“sendA”用0000代替,“sendB”用0001代替,“add”用0010代替,“sub”用0011代替,“out”用0100代替,那么这6句话就可以完全用二进制数表达出来:
(1) 0000
(2) 0001
(3) 0010
(4) 0001
(5) 0011
(6) 0100
这五种表达方式都表明了让机器进行的动作过程都是一样的,所以称为“程序”,每一条就是一个指令。最后要用二进制数表示的原因,是因为二进制数可以用机器表达,所以这种二进制表示的指令又称为“机器指令”,得到的程序叫“机器指令程序”。
2.3.3 指令转变成机器的动作
从表 2 1可知,一些必要的数据输入工作需要人工进行,而另外的一些机器动作能由机器控制字的变化来指挥,这些控制字可不可以由指令的二进制编码得到?
将我们设计的指令与控制字对应起来看,那么每个指令都对应一些固定的机器控制字。
sendA:1100000
sendB:1000010
add: 0101000
sub: 0101100
out: 0010001
将每条指令当作自变量,每条控制线做因变量,那么就有:
Em = (sendA)+(sendB)
La = (sendA)+(add)+(sub)
Ea = out
Eu = (add)+(sub)
Sub = sub
Lb = sendB
Lo = out
显然只要用这些逻辑表达式作出电路,就可以根据指令的变化,得到相应的机器控制字,当clk=1时,机器就会产生相应数据传送的动作。
2.3.4 将指令编码转成指令信号和控制字
由于这里的指令编码都是用4位二进制数表示的,因此可以用4位译码器,将指令编码转换成指令线为1,来指出是哪一个指令,然后通过指令线得到各控制线的值。
如果用Verilog HDL语言描述,这个过程可以省略,就用case语句来直接从指令编码就能得到控制字。
主要描述:
input [3:0] bm; //指令编码
reg [6:0] kzhz; //机器控制字
…
case (bm)
0: kzhz <=7’b1100000;
1: kzhz <=7’b1000010;
2: kzhz <=7’b0101000;
3: kzhz <=7’b0101100;
4: kzhz <=7’b0010001;
endcase
将控制字寄存器的输出与每条控制线连接,就可以确定下一个clk=1时,计算器的下一个状态。
--- 待续 ---