《逻辑与计算机设计基础(原书第5版)》——3.12 其他的算术功能模块-阿里云开发者社区

开发者社区> 华章出版社> 正文
登录阅读全文

《逻辑与计算机设计基础(原书第5版)》——3.12 其他的算术功能模块

简介: 本节书摘来自华章计算机《逻辑与计算机设计基础(原书第5版)》一书中的第3章,第3.12节,作者:(美)M.莫里斯·马诺(M. Morris Mano)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.12 其他的算术功能模块

+、―、×、÷以外的算术运算也很重要,如递增、递减、乘和除一个常数、大于比较、小于比较等,每一种运算都可采用一位运算单元迭代实现多位操作。但在本节我们将不采用迭代电路实现,而是对基本功能块进行压缩来实现。压缩技术是从一个基本电路(如二进制加法器或乘法器)出发,通过将已有的电路转换成有用的、较简单的电路来简化设计,从而代替直接设计电路本身。
3.12.1 压缩
对于已经设计好的功能块,通过将其输入端的值固定、传递和取反,即可实现新的功能。我们可以在已有的电路或函数表达式上采用相同的技术实现新的功能块,针对特定应用将已有电路简化成一个简单电路,我们称这个过程为压缩(contraction)。压缩的目的是采用以前的设计结果来完成逻辑电路或功能模块的设计。设计者可通过压缩来设计需要的电路,而逻辑综合工具采用压缩技术通过对原始电路的输入值固定、传递或者取反来得到目标电路。对于上述两种情况,压缩技术也能应用到电路未使用的输出端,以简化原始电路而获得目标电路。首先,我们举个布尔表达式的例子来说明压缩技术。
例3-28 全加器输出表达式的压缩
待设计电路Add1采用一位加法Ai+1+Ci生成和Si与进位Ci+1。它是全加器Ai+Bi+Ci的一个特殊情况Bi=1。因此新电路的表达式可以由全加器的输出表达式得到。
image

假设Add1电路通过压缩4位行波进位加法器中的每个全加器来实现,则执行的计算是S=A+1111+C0,而不是S=A+B+C0。在二进制补码表示中,这个计算是S=A―1+C0。如果C0=0,电路实现的是递减(decrement)操作S=A―1,可以考虑采用比4位加法器或减法器更为简单的逻辑实现。 ■
压缩可应用于表达式,如以上所述,或通过控制基本功能块的输入直接作用于该模块的电路图上。为了成功地应用压缩技术,所期望的功能必须能通过作用电路的输入由初始电路得到。接下来我们将考虑对未用的输出采用压缩技术。
置电路的输出为未知值×,意味着该输出端未被使用。因此该输出门和其他仅驱动该输出门的门电路可移去。对一个或多个输出为×的表达式进行压缩的规则如下:
1)删除电路输出为×的所有表达式。
2)如果一个中间变量没有出现在其他剩余的表达式中,则删除该变量表达式。
3)如果一个输入变量没有出现在其他剩余的表达式中,则删除该输入。
4)重复2)、3)步,直至不存在任何删除。
一个或多个输出为×的逻辑图进行压缩的规则如下:
1)从输出开始,删除输出为×的所有门,并置它们的输入为×。
2)如果一个门驱动的所有输入都为×,则删除这个门并置其输入为×。
3)如果一个外部输入驱动的所有输入都为×,则删除该外部输入。
4)重复2)、3)步,直至不存在任何删除。
在下面的小节中将就递增运算介绍逻辑图的压缩。
3.12.2 递增
递增(incrementing)意味着对一个算术变量加一个固定的值,通常这个固定值为1。一个n位递增器(incrementer)执行A+1操作,它可以由一个执行A+B且B=0…01的二进制加法器实现。我们来设计n=3的递增器,它足以说明递增器的逻辑,从而可根据该逻辑电路构建n位递增器。
图3-52a为一个3位的加法器,其输入固定以实现A+1运算,最高位的进位输出C3固定为×。操作数B=001且进位输入C0=0,从而实现A+001+0运算。还可使B=000,进位输入C0=1。
由于输入值固定,因此对加法器单元有3种不同的压缩情况:
1)右边的最低有效位单元的B0=1且C0=0。
2)中间单元的B1=0。
3)左边的最高有效位单元的B2=0且C3=×。
对于右边的单元,门1的输出变成A0,故它可用一个反相器取代。门2的输出变为A0,故它可用一根连接A0的线代替。门3的输入为A0和0,可以用一根连线替代,连接A0与输出S0。门4的输出为0,故其可以用值0替代。将该0和由门2输出到门5的A0共同驱动门5,门5可以用连接A0与C1的连线代替。最终电路见图3-52b的右边单元。

image

对中间单元,置B1=0,运用同样的技术可得
image

压缩后的电路如图3-52b的中间单元所示。
对于左边单元,它的B2=0,C3=×,先考虑×的传播效应可以更快地得到结果。由于门E的输出为×,所以可以将其移去,它的两个输入端置为×。由于门B和门C驱动的所有门的输入都为×,因而它们也可移去,并且置其输入端为×。门A和门D不能移去,因为它们都驱动了一个输入不为×的门。由于×0=×,故门A变成了一根连线。最终电路见图3-52b的左边单元。
对于一个位数n>3的递增器,在位置0处使用最低有效位递增单元,位置1~n―2处使用中间典型单元,位置n―1处使用最高有效位单元。在这个例子中,位置0(原书有误—译者注)处最右边的单元被压缩,但是,如果需要,它可以用位置1(原书有误—译者注)处的单元替代,该单元的B0=1且C0=1。同样的,输出C3可以生成,但不被使用。在这两种情况中,都以牺牲逻辑成本与功耗来保证所有的单元是相同的。
3.12.3 递减
递减是指一个算术变量加一个固定的负数—通常,这个固定值为-1。在例3-28中已经设计了一个递减器。另一种方法是:递减器可以采用一个加减法器作为初始电路,置B=0…01,同时置S为1选择减法操作。从加减法器出发,我们也可以采用压缩技术设计递增器和递减器,让输入B固定为0…01,S设为变量,当S=0时电路为递增器,S=1时为递减器。在这种情况下,结果电路在各位处是复杂全加器的一个单元。
3.12.4 常数乘法
图3-53a表示一个3位乘数、4位被乘数的乘法器,其中乘数为常量(乘法器的设计详见配套网站上乘法器与除法器的补充说明)。常量加载到乘数输入端产生以下结果:如果乘数特定位的值为1,那么被乘数提供给加法器;如果乘数特定位的值为0,那么0加载至加法器,这时这个加法器可删除,通过连线产生右边的输入,再在输出上加一个进位0。在这两种情况下,与门可以移去。在图3-53a中,乘数设定为101。电路压缩的最终结果是:将B的两个最低有效位传送给输出C1和C0,在B端加上B的两个最高有效位,再将结果左移两位以产生C2到C6的输出。
一个重要的特殊情况是常数为2i(例如,乘数为2i×B)。在这种情况下,乘数仅有一个1,电路的所有逻辑都被剔除,最后只剩下一些连线。由于乘数第i位的值为1,相乘的结果是在B后跟i个0。功能块简化为移位运算和值固定为0的组合。这个模块的功能是左移i位,移出的位用0填充。零填充(zero fill)指在一个操作数(如B)的右边(或左边)添加若干个0。移位是数字和非数字数据中的一个很重要的操作。乘数为22(即左移两位)的乘法的压缩结果如图3-53b所示。
3.12.5 常数除法
我们对常数除法的讨论将局限于除以2的幂次方(如二进制2i)。因为乘以2i的结果是在被乘数的右边添加i个0,以此类推,除以2i的结果是移去被除数的i个最低有效位。剩余的位即为商,而丢弃的位为余数。这个模块的功能是右移i位,同左移一样,右移也是一个非常重要的操作。图3-53c给出了除以2i(即右移两位)的功能块示意图。
3.12.6 零填充与符号扩展
零填充,如前面常数乘法所定义的,用于增加操作数的位数。例如,假定字节01101011是有16个输入的电路的输入信号。为了满足电路输入引脚的要求,一种可能产生16位输入的方法是在其左边添加8个0,生成0000000001101011,另一种方法是在其右边添加8个0,得到0110101100000000。前一种方法适合于诸如加法或减法操作,后一种方法用于生成低精度的16位乘法结果,其中该字节表示实际结果的高8位,而结果的低位被丢弃。
相对于零填充,符号扩展(sign extension)用来增加用补码表示的有符号数的位数。位增加在左边,为扩展数的符号(正数为0,负数为1)。字节01101011的十进制值为107,扩展为16位,变成0000000001101011。字节10010101为补码表示,表示十进制数-107,扩展为16位后变成1111111110010101。使用符号扩展的原因是为了保护有符号数的补码表示。例如,如果10010101用0扩展,那么其表示的数值将变得很大,此外,最左边的位本应该为表示负数的符号1,这样扩展在二进制补码表示中是不正确的。

image

十进制数的运算 十进制数的算术功能模块以及电路实现的补充说明详见本书的配套网站。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: