3.6 算术逻辑单元
ALU包含在所有的处理器中,且不仅可以进行整数运算,还可以进行位逻辑函数运算,例如按位与、按位或。ALU可以用在整数运算和逻辑指令的执行中。
?例3-7? 设计一个n位、包含7种函数的ALU,使其可以完成加法、减法、增一、减一和按位与、按位或和按位非运算。3位函数码F = f2?f1?f0用于选择ALU操作,如表3-4所示。在运行算术操作(F = 0、1、2或3)时,ALU也可以输出溢出信号ovf。F = 7不用于这个设计中,当选择操作时,ALU可以运行一个未知操作。稍后将讨论详细的位并行和位串行设计。
图3-15展示了ALU高层框图。当F指定了一个算术操作时,输入值A和B以及结果值R都表示为2的补码数。信号ovf为1时,表示运算有溢出。下一节将详细讨论位并行和位串行ALU的设计步骤。
3.6.1 设计部分:位并行
当n很大时,ALU会被考虑为大型组合电路。用之前讨论的自顶向下位并行设计方法,ALU的功能首先被分为算术和逻辑操作。4个算术操作加法、减法、增一和减一被组合成ALU数据通路中的一个算术模块,如图3-16所示。三个按位逻辑操作将用与门、或门和非门实现。8位4-1的MUX选择输出W、X、Y和Z中的一个作为ALU的输出。
在ALU数据通路中,A和B输入都与算术模块和三个位逻辑模块连接。这些模块同时对输入A和B进行运算并产生结果,但是只有一个被选择作为ALU的最终输出。这样,当F指定一个逻辑操作时,算术模块仍然可以根据A和B实时的值产生ov_flag信号值。然而,在某些实例中,溢出信号可以被屏蔽且不被ALU当作有效值输出。这个过程通过屏蔽模块完成。
数据通路还包含将ALU函数码F翻译成ALU数据通路中的中间信号s0、s1、s2、m和msk的映射模块。当所有模块都被设计和连接完成之后,ALU的设计过程就完成了。
数据通路中的4-1 MUX选择由算术和其他三个位逻辑模块的输出中的一个。当F指定一个逻辑操作(F = 4到6)时,屏蔽模块将ovf置为0(无效);否则,ovf将会被置为ov_flag的值,作为算术模块的一个输出。
如果需要,自顶向下设计方法连续地应用到所有数据通路上的大型模块中,分为更小的电路模块,直到最底层电路模块足够小且只需要很少的输入实现为止。第2章中介绍的设计技术被用于设计每一个小型电路模块。位逻辑模块用n个2输入的与门、n个2输入的或门和n个非门组成。这三个模块分别生成n位值X = xn-1…x0,Y = yn - 1…y0和Z = zn - 1…z0,如图所示,这里第i位被如下式子定义:
作为一个例子,图3-17展示了4位按位与逻辑的电路图。当A = a3a2a1a0 = (1011)2且B =
b3b2b1b0 = (1101)2时,X = x3x2x1x0 = (1001)2由x0 = a0•b0 = 1•1 = 1,x1 = a1•b1 = 0•1 = 0等。其他位逻辑模块也是类似的设计。
小型多路选择电路的设计在第2章中有过讨论。ALU需要一个n位4-1的多路选择器,可采用如下方法中的一种进行设计:
1)用n个1位4-1 MUX设计
2)用n位2-1 MUX设计。一个n位2-1 MUX用n个1位2-1 MUX设计,如图3-18所示。
选择2具有优势,其可以扩展到设计n位k - 1 MUX且不用考虑任何扇入和扇出问题。表3-5展示了n位4-1 MUX的最小真值表。当其值为0的时候,信号s1选择W或X中的一个,如果s1值为1,选择Y或Z中的一个。另一方面,当其值为0时,信号s0选择W或Y中的一个,为1时,选择Z或X中的一个。这样,我们就可以将这个过程用于将3个2-1 MUX设计和实现4-1 MUX,对于n位,如图3-19所示。例如,用s1s0表示数值为2的2位数时(即s1 = 1且s0=0),2-1 MUX正确地选择了两个可能的输入候选W和Y,且最底端的2-1 MUX正确地选择了Y作为最后的输出。这个过程如图所示。
通常,先前的方法一共需要log2k层的2-1 MUX实现。公式(3-15)用于估计用2-1 MUX设计K-1 MUX的传输延迟。
例如,8-1 MUX需要三层2-1 MUX,且64-1 MUX需要6层2-1 MUX。如果使用不同的MUX组合,层的数量和总计延迟可以减少。例如,一个8-1 MUX也使用2-1 MUX和4-1 MUX的组合进行设计。在这个例子中,一个4-1 MUX可以设计成与或(SOP)或者或与(POS)电路以便使传输延迟最小。
算术模块的输入是两个n位2的补码数值A和B和两个控制信号m和s2,当n = 8时如图3-20所示。算术模块有两个输出:一个n位2的补码W和一个(高电平)溢出信号ov_flag。表3-6列出了m和s2与对应算术模块操作模式的值。如果其值为0,信号m选择加法或者增一操作,如果值为1,选择减法或者减一操作。s2信号控制2-1 MUX,当进行加法或者减法运算时,选择B,当进行增一或者减一运算时,选择8位数值(00000001)2。当W溢出时,信号ov_flag置为有效。
屏蔽模块的真值表和电路图如图3-21所示。当msk = 1时,模块输出ovf = 0,屏蔽掉从算术模块中产生的ov_flag信号;当msk = 0时,输出ovf = ov_flag。
表3-7展示了映射模块的真值表。表中的控制信号,除了msk,可以视为无关项(d)。例如,当F指定一个逻辑操作(例如F = 4~6)时,算术模块的输出W不会被MUX选中作为输出。然而,信号ov_flag必须屏蔽,使得ALU不输出ovf信号。映射模块的真值表如图3-22所示。
此外,因为F = 7没有定义,所以所有控制信号,除了msk,在F = 7时都可以视为无关项。然而,因为图3-22中的映射电路生成s2 = 0,s1 = 1,s0 = 0,m = 1,且当F = 1时,msk = 1,这些信号值对应到按位或操作,ALU会在当F = 5或7时进行按位或操作。
3.6.2 设计部分:位串行
位串行设计,与位并行设计相反,需要输入数据位分到各个电路片中,对于位串行ALU设计来说,每一个ALU片都将操作输入的某一小部分数据,但执行所有ALU的功能。例如,图3-23展示了用n片1位ALU设计的位串行ALU。表3-8为1位ALU片的真值表。对于没有在表中出现的输入,r和co信号被认为是0。此外,为了使得增一和减一正确运行,进位输入信号c-1必须为1。这就要求当ALU函数码F为2(增一)或3(减一)时,图中的增一/减一模块生成c-1 = 1,即c-1 = 2?f1。
因为当F = 7时,ALU不会进行任何操作,所以对应的表项被设为无关项。真值表太大,所以不能用手动的方式进行化简。用Espresso方法输出的质主蕴含将稍后列出。虽然没有特定的函数去定义当F = 7时的情况,当F = 7时,1位ALU片输出为1。注意到输出0xFF也能被8位2的补码表示为- 1。表3-9展示了当F = 7输出为- 1时的位串行ALU操作的最终列表。
1位ALU片的质主蕴含:
通常当字长不是标准字长的时候,位串行设计是有好处的(例如,位串行加密硬件所用的256位或1024位操作数),或者其等价的位并行设计需要更多的硬件去实现相同的逻辑。