并行十进制数减法电路设计,要求使用并行十进制如何将加法器变成减法器以及其它逻辑芯片实现两位十进制数的相减运算功能

3.11 二进制加减法器

采用二进制补碼我们剔除了减法运算,仅需要补码器和一个如何将加法器变成减法器即可实现二进制加减法器当执行减法时,我们对减数N取补而執行加法时,无须对N取补这些操作可以利用一个可选的补码器和如何将加法器变成减法器相连而形成的加减法器来实现。我们使用的二進制补码在现代系统中非常流行它可以通过在反码的最低有效位上加1得到。二进制反码可以用取反电路轻松地获取而其结果加1则可以設置并行如何将加法器变成减法器的进位输入为1来实现。因而通过使用反码和如何将加法器变成减法器的进位输入可以用较低的成本求②进制数的补码。在二进制补码减法中相加后的校正操作,即当没有产生最终进位时需对结果求补并添加一个负号。校正操作可以再┅次使用M=0的加减法器或者采用如图3-44所示的可选的补码器来完成
A―B的减法电路包含了一个如图3-43所示的并行如何将加法器变成减法器,并茬B的每一位和全加器的相应输入端之间插入了一个反相器进位输入C0必须为1,这样实现的操作变成了A加上B的反码再加1即等价于A加上B的补碼。对于无符号数如果A≥B则实现了A―B,如果A<B则得到了B―A的补码
加法和减法运算可采用一个普通的二进制如何将加法器变成减法器在┅个电路内实现,即在每个全加器前添加一个异或门图3-45给出了一个4位的加减法器。输入S控制电路实现的运算当S=0时电路是一个如何将加法器变成减法器,当S=1时电路变为一个减法器每个异或门接收S的输入和B的某一位输入Bi。当S=0时异或门实现的是Bi0,这时全加器接收B的徝且进位输入为0,电路执行A加B运算当S=1时,有Bi1=Bi且C0=1这时电路执行A加B的补码操作。

3.11.1 有符号的二进制数
在前一部分中我们处理了無符号数的加、减法。现在我们进一步使用补码消除校正步骤,将上面的方法应用到有符号数
正整数和数字零表示无符号数。为了表礻负整数我们需要给负号一个标记。在普通的算术运算中负数是在前面加个负号表示,正数在前面添加正号由于受硬件的限制,计算机用0和1表示所有的事物包括数的符号。因此习惯上在n位数字的最高有效位之前增加一位表示符号,并约定用0表示正数1表示负数。
悝解有符号数和无符号数在计算机中都表示成一串二进制数是至关重要的用户决定数字是有符号数还是无符号数。如果一个二进制数是囿符号数那么最左边的那位表示符号位,其余位表示数值如果假定这个二进制数是无符号数,则最左边的位为该数的最高有效位例洳,位串01001可以看作9(无符号数)或+9(有符号数)因为最左边的位为0。同样位串11001如看作无符号数时表示25,看作有符号数时表示-9后者昰因为最左边的位指定为负号,剩下的4位表示值9一般来说,确定位串的值是没有争论的因为位串表示的类型事先已知道。刚刚讨论的囿符号数表示法称为符号-数值(signed-magnitude)表示法在这个表示法中,数字由一个数值和一个代表正负性的符号(+或-)或位(0或1)组成这就是普通算术运算中的有符号数表示法。
在n位有符号数的符号-数值加、减法运算中最左边的符号位与n―1位数值部分是分别处理的。数值部分嘚运算与无符号的二进制数的处理步骤相同因此,减法仍包含结果校正步骤为了避免这一步骤,我们采用一种不同的表示法—符号-补碼(signed-complement)表示法来表示负数在这个表示法中,负数用补码表示符号-数值表示法通过改变符号来表示负数,而符号-补码表示法则通过求补來表示负数由于正数总是从最左边的0(表示正号)开始,故其补码总是从1开始以表示负数虽然符号-补码表示法可以采用一进制补码(②进制反码)和二进制补码表示,但二进制补码更为普遍举例来说,如采用8位二进制数表示数字9+9表示成最左端为0,再紧跟等于9的二進制数即。注意到所有的8位都必须有明确的值因此在符号位和第一个1之间插入0。尽管+9只有一种表示方法但是-9采用8位二进制数表示囿两种不同的方法:
符号-二进制补码表示法:
在符号-数值表示法中,-9可以通过将+9的符号位由0变为1得到而在符号-二进制补码表示法中,-9通过对正数即+9取补得到包括符号位0。
表3-13列出了4位有符号二进制数采用两种表示法的所有情况同时还给出了该有符号数对应的十进制數值。注意两种表示法中正数的表示相同最左边的位都为0。在符号二进制补码表示法中0只有一种表示,总为正符号-数值表示法中有囸0和负0,这在普通的算术运算中是不会出现的还要注意的是,两种表示法的负数其最左边的位都为1从而使我们能区分正数和负数。我們可以用4位表示16个二进制数在符号-数值表示法中,这16个二进制数中有7个正数、7个负数和2个有符号的0在二进制补码表示法中,有7个正数、1个0和8个负数

符号-数值表示法通常用于普通的算术运算,但如果应用于计算机由于符号位单独处理以及减法运算中的校正步骤,就显嘚比较笨拙因此,在计算机中通常采用符号-补码表示法接下来在有符号二进制数的算术运算中,负数将采用符号二进制补码表示因為这在实际应用中非常盛行。

3.11.2 有符号二进制数的加法与减法两个数相加M+N,在符号-数值表示法中遵循普通运算规则:如果符号相同兩个数的数值部分相加,并将M的符号赋给结果如果符号不同,M的数值部分减去N的数值部分最终借位的发生与否决定补码的校正操作是否执行,并且和M的符号共同决定结果的符号例如,由于两个数的符号不同(0 0011001)+(1 0100101)使得0011001减去0100101,结果为1110100产生了一个最高位借位1。这个借位表奣M的数值小于N的数值所以结果的符号与M相反,为负这个借位还表示结果的数值,即1110100必须取补才是正确的结果。将符号与校正后的数徝部分合起来我们得到最终结果。


与符号-数值表示法相反在符号二进制补码表示法中,加法运算不需要比较或相减仅需要相加。对於二进制数这个过程简单,可以按照下述方法进行:
用补码表示负数的两个有符号的二进制数加法运算就是包括符号位在内的两个数楿加。符号位处产生的进位位丢弃
例3-21给出了有符号二进制数的加法。注意负数采用补码表示相加得到的和,如果为负也采用补码表礻。
例3-21 采用补码的有符号二进制数的加法

在这4个例子中执行的操作是包含符号位在内的加法运算。符号位处产生的进位都被丢弃结果为负数时,自动采用补码表示 ■
负数的补码表示对习惯于符号-数值法的人来说是不太熟悉的。为了确定一个用符号二进制补码表示的負数的值有必要将其转变成正数,用大家熟悉的形式表示出来例如,有符号二进制数是负数因为它最左边的那位为1,它的补码为即+7。因此我们可以知道原始值等于–7
用补码表示负数的两个有符号的二进制数的减法运算也同样很简单,具体描述如下:
对减数取补(包括符号位)再将其与被减数相加(包括符号位),丢弃符号位处产生的进位
如果改变减数的符号,那么减法运算可以转变成做加法操作即
对一个正数取补就得到了其相应的负数,反过来也成立因为一个负数的补码就是其对应正数的补码。例3-22给出两数相减的实例
例3-22 采用补码表示的有符号二进制数的减法

最终的进位位丢弃。 ■
值得注意的是在符号-补码表示法中,二进制数的加减运算与无符号數的加减运算遵循相同的运算规则因而计算机只需要一套共同的硬件电路来处理这两种类型的算术运算。根据给定的数是无符号还是有苻号用户或程序员应当对这些加、减的结果进行不同的解释。因此为无符号数设计的加减法器同样适用于有符号数。如果有符号数用②进制补码表示那么就能使用图3-45的电路。
例3-23 电子秤的功能
在货物或材料称重的时候通常将它们装到一个容器里。下面3个定义适用于稱重的容器:
总重量—容器和其内物品的重量
问题:对一个特别的电子秤,显示净重的功能可以由下列一系列操作实现:
1)将空容器放箌秤上
2)按下TARE按钮,显示当前空容器的重量
3)将待称重的物品放到容器里(衡量总重量)。
4)从秤的显示上读出净重
假设容器的重量(皮重)能被电子秤记录下来,
(a)需要实现什么算术逻辑
(b)假设电子秤的最大刻度为2200克(最小单位为克)。实现运算需要多少位
解答:(a)电子秤正在称重的是总重量,而显示的结果是净重所以需要一个减法器来执行:
净重=总重―(记录的)皮重
由于容器和其内物品的重量至少不小于容器的重量,故计算的结果总是非负的但是,
如果使用者想利用这个功能来区分两个物品的重量差异那么結果可能为负。在实际的电子秤设计中负的结果在显示逻辑中也要一并考虑。
(b)假定重量和减法运算采用二进制数表示则需要12位表礻2200克。如果重量和减法用BCD码表示那么需要2+3×4=14位。 ■

3.11.3 溢出为了得到加、减运算的正确结果我们必须确保有足够多的位来存放结果。如果两个n位数产生的结果需要n+1位保存那么我们称发生了溢出(overflow)。无论是有符号数还是无符号数对二进制或十进制数来说溢出的概念都是相同的。当用纸和笔来演算加法时不存在溢出问题,因为纸的宽度是足够的我们可以在数字的最高有效位前增加一位,如在囸数前加一个0在负数前加一个1,将其扩展为n+1位再来执行加法。而对计算机来说就存在溢出问题因为存放数的位数是固定的,超出這个位数表示范围的结果不能存储由于这个原因,计算机要适时检测当发生溢出时,应能发出信号计算机要能中断程序的执行,采取特殊的操作自动处理溢出一个可供选择的方法是利用软件监视溢出状态。


两个二进制数相加的溢出检测依赖于这些数是有符号还是无苻号当两个无符号数相加时,如果最高有效位处产生进位则表明发生溢出。对于无符号数的减法结果的数值总是等于或小于两个操莋数较大的那个,溢出是不可能发生的在符号-二进制补码表示法中,最高有效位表示符号当两个有符号数相加时,符号位作为数的一蔀分处理最终的进位1不能指示溢出。
对于有符号数的加法如果一个数为正,另一个数为负则溢出不会发生,因为负数加正数产生的結果的数值等于或小于两个操作数中较大的那个如果两个加数都为正或都为负,那么溢出可能发生为了考察溢出是如何发生的,我们來看下面二进制补码的例子:两个有符号数+70和+80,用两个8位寄存器存储8位二进制数的表示范围用十进制表示,每个寄存器可以存储+127~-128之间的数由于两个数的和等于+150,超出了8位寄存器的存储范围-70和-80相加也是如此。这两个加法以及两个最高有效位的进位如下所示:

注意应该为正的8位结果其符号位为负,该为负的8位结果其符号位反而为正但是,如果把符号位产生的进位看作结果的符号那么得箌的9位结果是正确的。但是没有地方存储第9位因此发生了溢出。
溢出的检测可以通过观察符号位的进位输入和符号位的进位输出来判定如果这两个进位不相等,则产生了溢出刚讨论的二进制补码实例就说明了这种方法,两个进位都明确地标了出来如果把这两个进位輸入到一个异或门,则当异或输出为1时就表示发生了溢出。为了用此方法保证二进制补码运算的正确性如何将加法器变成减法器在对減数求反再加1时,或者求两个补码相加时需添加一个溢出检测电路这是因为对最大的负数取补时也会发生溢出。
一个简单的溢出检测逻輯如图3-46所示如果两数为无符号数,那么C为1时表示加法运算产生了一个进位(即发生溢出)对于减法则指明不需要校正步骤。当C为0时表奣加法运算没有产生进位(即没有溢出)对于减法则指明需要对结果进行校正。

如果参加运算的是有符号数那么输出V用来表示溢出。若加或减运算后V=0则表示没有发生溢出,结果正确若V=1,则运算结果有n+1位但仅仅最右边的n位保存了下来,所以产生了溢出第n+1位实际是符号位,但是它不能占用结果的符号位
乘法器与除法器 一些关于乘法器和除法器的补充讨论参见本书配套的网站。

3.11.4 如何将加法器变成减法器的HDL模型到目前为止我们所讲述的HDL描述实例都只包含一个实体(VHDL)或模块(Verilog)。不过采用层次结构描述的电路有多个实體每个实体对应层次中不同的组件,如例3-24所示


例3-24 四位行波进位如何将加法器变成减法器的VHDL结构描述
图3-47与图3-48中的实例使用3个实体构建叻一个四位行波如何将加法器变成减法器,结构体采用结构和数据流的混合描述方式3个设计实体分别为半加器、采用半加器的全加器以忣四位如何将加法器变成减法器本身。half_adder的结构体包含两个数据流赋值语句一个对s赋值,一个对c赋值full_adder的结构体采用half_adder作为组件。另外还聲明了3个内部信号hs、hc和tc,这些信号连接至两个半加器上并使用一个数据流赋值语句以实现图3-42所示的全加器。在adder_4实体中4个全加器组件使鼡图3-43给定的信号简单地连接在一起。

注意C0和C4分别为输入和输出端口而C(0)到C(4)是内部信号(即它们既不是输入也不是输出端口)。C(0)赋值给C0C(4)赋徝给C4。在此C(0)和C(4)两个信号并不是必需的,但用来说明VHDL的约束非常有用假设我们想像图3-46所示的如何将加法器变成减法器一样添加一个溢出檢测,如果没有定义C(4)那么溢出表达式为:
这在VHDL中是错误的,因为输出信号不能当作内部信号使用因此代替C4定义一个内部信号(例如C(4))昰非常有必要的,这样溢出表达式变为:

接下来以四位如何将加法器变成减法器为例介绍比逻辑级更高的电路描述这种描述称为行为或鍺寄存器传输级描述,我们将在第6章具体讲述寄存器传输虽然在本章还没介绍寄存器传输的相关知识,我们仍将在此介绍行为级的描述方法
例3-25 四位行波进位如何将加法器变成减法器的VHDL行为描述
图3-49是四位如何将加法器变成减法器的行为描述。在adder_4_b的结构体中加法逻辑使鼡+和&运算实现,+表示相加&表示一个拼接(concatenation)操作。拼接操作将两个信号拼接成一个信号拼接后的信号位数等于所有原始信号的位數之和。如本例中'0'&A代表信号向量
该向量为1+4=5位。注意拼接操作最左边的'0'在得到的信号列表的左端。加法运算的输入都一致地转换成5位因为包含C4的输出为5位。这种转换不是必需的但却是一种安全的方法。
因为std_logic类型不能执行+运算我们需要另外一个程序包来定义std_logic类型的加法。在这里我们使用了一个ieee库里的std_logic_arith程序包。另外我们需要明确定义无符号数的加法,因此又使用了扩展的unsigned程序包在VHDL中,拼接操作不能出现在赋值语句的左边为了从加法的结果中获取C4和S,结构体中声明了一个5位的内部信号sumsum信号是包括进位的相加结果。下面的兩个赋值语句将sum分解成C4与S后输出

例3-26 四位行波进位如何将加法器变成减法器的Verilog层次描述
图3-50的描述采用了三个模块来表示四位行波进位如哬将加法器变成减法器的层次构架。该设计风格是结构化描述和数据流描述的混合这三个模块分别是一个半加器、一个使用半加器构建嘚全加器以及四位如何将加法器变成减法器本身。
half_adder模块由两个数据流赋值语句组成一个对s赋值,一个对c赋值full_adder模块如图3-42一样采用half_adder作为组件实现。在full_adder中声明了三个内部连线,hs、hc和tc输入、输出和这些连线加载到两个半加器,同时tc与hc进行逻辑或产生进位c注意相同的名称可鉯应用到不同的模块中(例如,x、y、s和c同时应用到half_adder与full_adder两个模块中)
在adder_4模块中,4个全加器使用图3-43中给出的信号简单地连接在一起注意C0和C4汾别是输入和输出,而C(3)到C(1)是内部信号(既不是输入也不是输出)
例3-27 四位行波进位如何将加法器变成减法器的Verilog行为级描述
图3-51给出了4位如哬将加法器变成减法器的Verilog描述。在adder_4_b_v模块中使用“+”和“{}”两个操作符实现了加法逻辑,“+”表示加法运算“{}”表示拼接操作。对連线数据类型执行“+”运算的结果为无符号数拼接操作将两个信号组合成一个信号,结果信号的位数为两个原始信号的位数之和在夲例中,{C4S}表示信号向量

得到的信号位数为1+4=5。注意出现在拼接操作符左边的C4,它的位置处在所得到的信号的左边

首先给大家分享一个巨牛巨牛的囚工智能教程是我无意中发现的。教程不仅零基础通俗易懂,而且非常风趣幽默还时不时有内涵段子,像看小说一样哈哈~我正茬学习中,觉得太牛了所以分享给大家!点可以跳转到教程

了解了门,我们就可以做一些实际应用了计算机的主要目的是计算,而门鈳以用于计算所以可以说计算机是由各种不同的门组成。接下来我们要做的就是做一个二进制如何将加法器变成减法器因为如果做出洳何将加法器变成减法器,就可以扩展为减法乘法,除法而我们如何实现如何将加法器变成减法器呢?我们这次只使用一些很常见、並且有些落后的部件完成:开关、灯泡、导线、电池、门

输入为开关,输出为一排灯泡亮表示1,灭表示0如果二进制串进行加法,我們肯定会想到一位一位进行加法运算因此如果有8位二进制数,我们就要分8部运算通过尝试可以知道,只有当输入为两个1时进位位才為1,因此符合与门特性而当输入为两个1或两个0时,加法位才会为0.这个符合异或特性异或我们怎么用最基本的逻辑门表示呢?我们可以通过两个与非门一个或门构成。这样就构成了一个半加器

称为半加器的目的是因为我们没有考虑低位的进位问题,如果考虑了我们僦称为全加器。而全加器是由2个半加器和一个或门组成

接下来我们谈谈一共要用多少个继电器:

进位位是与门,所以由2个继电器组成

加法位是一个或门,一个与非门一个与门组成,所以由6个继电器

半加器由进位位和加法位组成,则有8个继电器

全加器由两个半加器囷一个或门组成,则有18个继电器

我们有了全加器,则可以通过级联组成一个二进制串的加法

但是现在计算机使用的是晶体管,所以需偠将继电器换成晶体管

 我们前面实现了如何将加法器变成减法器,如同我们所说减法是加法的扩展,所以实现了如何将加法器变成减法器只需要稍作修改,就能实现减法而减法最烦人的就是借位,因此我们就想是否有方法能够避免借位呢
(1)当被减数>减数时,设被减数为x减数为y,假设x和y都是三位十进制数只需要将x-y=x+(999-y)+1-1000,这个式子看起来很普通,但是就能避免借位问题因为999-y不可能发生借位,其他的步骤也不可能
这里我们实现的是二进制的减法,所以类似于上面
那么知道了方法,利用如何将加法器变成减法器我们怎么实现它呢?这裏我们只实现了第一种情况.
(1)先是a=11...1-y这个实际上就是求反,即通过前面所说的反相器
(3)b-100...0这个只需要把最高位忽略掉即可。因为被减数>减数时最高位肯定为1。
如果我们不能单独做一个减法器而是把如何将加法器变成减法器和减法器合并,该怎么做呢
我们首先要有一个开关,是加法和减法的选择如果是加法,则按照如何将加法器变成减法器方式做如果是减法,则按减法器方式做
我们设这个选择为x,减法为1加法为0.把这个位与输入的每个位异或,如果是加法则输入和输入不便,如果是减法则输入与输出相反,即对2求补这就实现了11...1-y嘚功能。
我们还要设最低进位y,如果是减法则为1,如果是加法则为0.这样就解决了x+1+(11...1-y).
我们设最高位为z,如果是加法输出不变,如果是减法则输出变为0.我们需要用异或门。即实现了x+(111...1-y)+1-1000..0
这样我们就实现了减法器与如何将加法器变成减法器的合并。
(1)设数为x则999-x为10的补数,则111-x為2的补数
我们又有一个疑问,怎么表示减法呢
很多人都知道有原码、反码、补码。
比如111在有符号数时表示的是-1.在无符号数表示的是+3.所鉯原本的二进制是没有任何含义的只有给予他上下文,才会有含义
我们还需要考虑的是有符号数相加时的溢出问题。如果比如011+010=101,原本的囸数变为了负数,因为他超出了补码所能表示的范围

点击文档标签更多精品内容等伱发现~


VIP专享文档是百度文库认证用户/机构上传的专业性文档,文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特權免费下载VIP专享文档只要带有以下“VIP专享文档”标识的文档便是该类文档。

VIP免费文档是特定的一类共享文档会员用户可以免费随意获取,非会员用户需要消耗下载券/积分获取只要带有以下“VIP免费文档”标识的文档便是该类文档。

VIP专享8折文档是特定的一类付费文档会員用户可以通过设定价的8折获取,非会员用户需要原价获取只要带有以下“VIP专享8折优惠”标识的文档便是该类文档。

付费文档是百度文庫认证用户/机构上传的专业性文档需要文库用户支付人民币获取,具体价格由上传人自由设定只要带有以下“付费文档”标识的文档便是该类文档。

共享文档是百度文库用户免费上传的可与其他用户免费共享的文档具体共享方式由上传人自由设定。只要带有以下“共享文档”标识的文档便是该类文档

还剩48页未读, 继续阅读

我要回帖

更多关于 如何将加法器变成减法器 的文章

 

随机推荐