从逻辑上讲,大家都知道计算机是由运算器、控制器、存储器、输入设备和输出设备组成的。这仅仅是一个极其概括的认识,是非专业的理解。对于想要设计CPU的人来说,这种粗浅的理解显然是差距太大了。即使是最简单的计算机CPU结构,也远不是“运算器和控制器统称CPU”的那种概念,而实际应该理解成:计算机的CPU是由控制单位、运算单位和存储单位构成的。什么是控制单位、运算单位和存储单位?在图 3-1中我们用三种颜色粗略地给出了一个简单的CPU结构,从左向右分别是控制单位、运算单位和存储单位。
控制单位有指令寄存器ir,还有控制逻辑control等。运算单位有运算器alu和它的前端寄存器A、B及各种运算控制逻辑。存储单位包含的器件较多,有程序存储器irom与程序计数器pc,数据存储器dram和地址寄存器mar,还有累加器da和输出寄存器out等。它们表示的仅是一个非常简单的CPU结构。这种结构将设备通过公共线路相互关联,公共使用的线路在我国一般称为总线。多个设备连接的公共线路中导线通常都会有多条,有时候人们也将多条导线组成的线路也叫总线。这种将多股线称为总线的叫法是一种习惯,实际上很容易区别。
用总线进行连接各种设备的结构称为总线结构。总线结构是计算机设计的一种基本结构,在相当长的时间内是计算机结构设计的标准。总线结构数据传递方式是广播式的。在总线上连接的设备,不能同时有2个,或者多于2个的设备向总线输送数据,这样会造成数据混乱。反过来,一个设备发送到总线上的数据,所有连接在总线上的其他设备都可以同时接收。
图 3-1中这个简单的计算机CPU用一个只读存储器irom放置程序,指令地址由寄存器pc指示。由于pc是专门指示指令地址的,习惯上人们称之为程序计数器。可进行读写的存储器dram是专门放置数据的,因而称为数据存储器。dram的存储单元地址由寄存器mar来指示,mar叫地址寄存器。独立的寄存器da用来临时存放数据,特别是存放一些指令执行的中间运算结果,人们一般称之为累加器。寄存器out用来保持输出数据,被称为输出寄存器。ALU是运算器,ALU一般可以进行算术运算和逻辑运等多种运算,A、B是它的前端寄存器,用以保持参与运算的数据。ALU实行运算时,参加运算的数据必须是稳定的,所以要有前端寄存器来保证数据的稳定性。
从逻辑上讲,irom、dram是这个计算机的存储器,它们和临时存放数据的mar、da、out和pc等寄存器构成了这个计算机的存储单位。存储单位是保存程序和数据的地方,长时间保存的数据要放在存储器当中,临时性保存的数据一般放在寄存器中。寄存器中的数据读写速度快,而对存储器中的数据进行读写,相对来说就慢一些。
ALU负责数据计算。各种运算的设备是不一样的,所以ALU的内部也很复杂。比如有算数加减法运算器,乘除法运算器、逻辑运算器、浮点数运算器和其他操作设备等。
控制单位最主要的是控制器,它当中最主要的有控制矩阵、时钟振荡器和节拍器等,指令寄存器是它进行指令分析时,保存指令的临时设备。人们不进行设计研究的时候,就把指令寄存器也放到控制器当中,而不单独提到它。以往的设计很少考虑程序转移的变化,所以将累加器、程序计数器等存储设备放到了控制单位一边,并将它们统称为控制器。本书将它们划归到存储单位一边,是考虑到程序快速转移的问题。这种划分看似简单,但却引发了计算机程序运行转换的革命性变化。这是我十几年前研究程序执行“死锁”想出的办法。这种划分,引出了多处理器CPU的动态变化问题。从前很多计算机设计都将运算器的前端寄存器A和B之一做为累加器,这样很方便使用前面指令运算结果。可世间的事情往往是有一利必有一弊,这种设计并不方便程序转移到其他处理器上执行,对多处理器同处一机的并行程序执行方式,还是将累加器独立出来会更好。有关这方面的问题,我们将在动态计算机的章节中阐述。
将累加器和程序计数器放入存储单位,可以使程序的指令之间变化在控制器和运算器上不留数据,这种情况我们称为指令间处理器无关。CPU的处理器是控制单位和运算单位的统称,又叫指令执行单位或处理器,用PU(Performance Unit)来记。CPU中去除PU,剩下来的部分就是存储单位,我们用MU(Memory Unit)来记。这样一来,计算机的CPU就是PU+MU组成的。
公共总线BUS是由多条导线组成的,导线的数量一般不少于运算器或寄存器的位数。现在流行的设计,都将总线导线的数量和运算器的位数一致,当实际用不到那么多导线时,就让部分导线临时闲置。