Contents

计算机组成(第二章)

数据与文字的表示方法

数据格式

分类

符号数据:非数字符号的表示(ASCII,汉字,图形等) 数值数据:数字数据的表示方式(定点,浮点)

计算机数字和字符的表示方法有利于数据的存储,加工(处理),传送

编码

用少量,简单的基本符号,选择合适的规则表示尽量多的信息,同时利于信息处理(速度,方便)

数值数据

计算机在数据,文字的表示方式时,应该考虑以下几个因素

  1. 表示的数据类型(符号,小数点,数值)
  2. 数值的范围
  3. 数值精度
  4. 存储,处理,传送的硬件代价

常用的表示方法

定点表示法

所有数据的小数点位置固定不变

理论上位置可以任意,但实际上将数据表示有两种方法(小数点位置固定—定点表示法/定点格式)

  1. 纯小数
  2. 纯整数

定点数表示

  1. 带符号数
  2. 不带符号数

定点纯整数

https://cdn.jsdelivr.net/gh/adan-ning/images/202403161314053.jpg

表示数的范围是 $0\leqslant|x|\leqslant 2^n-1$

定点表示法的特点

  1. 定点数表示数的范围受字长限制,表示数的范围有限
  2. 定点表示的精度有限
  3. 机器中,常用定点纯整数表示

浮点表示

小数点位置随阶码不同而浮动

格式

$N=R^E.M$

基数R,取固定的值,比如10.2等;指数E;尾数M;

机器中表示

https://cdn.jsdelivr.net/gh/adan-ning/images/202403161324679.jpg

IEEE754标准(规定了浮点数的表示规格,运算规则等)

  1. 规则规定了单精度(32)和双精度(64)的基本格式
  2. 规则中,尾数用原码,指数用移码(便于对阶和比较)

https://cdn.jsdelivr.net/gh/adan-ning/images/202403161328245.jpg

基数R=2,基数固定,采用隐含方式来表示它

32位的浮点数

  1. S是数的符号位,1位,在最高位,“0”表示正数,“1”表示负数。
  2. M是尾数,23位,在低位部分,采用纯小数表示
  3. E是阶码,8位,采用移码表示。移码比较大小方便
  4. 指数偏移,127

64位的浮点数

符号位1位,阶码域11位,尾数域52位,指数偏移值是1023.

因此规格化的64位浮点数x的真值为:

$x=(-1)^S\times(1.M)\times2^{E-1023}$

e=E-1023

一个规格化的32位浮点数x的真值表示为

$x=(-1)^S\times(1.M)\times2^{E-127}$

e=E-127

https://cdn.jsdelivr.net/gh/adan-ning/images/202403161346491.jpg

例题:

https://cdn.jsdelivr.net/gh/adan-ning/images/202403161354654.png

数的机器码表示

数的机器码表示

真值:一般书写的数

机器码:机器中表示的数,要解决在计算机内部数的正,负符号和小数点的运算问题

原码,反码,补码,移码

原码表示法

原码特点

将真值的正负号换成1和0,表示简单,易于同真值之间进行转换

实现乘除运算规则简单

进行加减运算十分麻烦,做减法无法求解正确结果……

反码表示法

定义

正数的表示与原,补码相同,负数的补码符号位为1,数值位是将原码的数值按位取反,就得到该数的反码表示

电路容易实现,触发器的输出有正负之分

补码表示法

补码是在“模”和“同余”的概念下导出的(“模"是指一个计量单位的计量系统的计量范围,即产生“溢出”的量。)

定义

正数的补码就是正数本身,负数的补码是原负数加上模。

计算机运算受字长限制,属于有模运算

  1. 定点小数$x_0x_1x_2……x_n$溢出量为2,以2为模(周期)
  2. 定点整数$x_0x_1x_2……x_n$溢出量为$2^{n+1}$,以$2{n+1}$为模(周期)

定点小数$x_0x_1x_2……x_n$

$[x]_补=\begin{cases}x,1>x\geq-1\2+x,0\geq x \geq -1\end{cases}$

$符号\begin{cases}0,正数\1,负数\end{cases}$

补码性质

  1. 高位表示正负
  2. 正数补码,尾数与原码相同
  3. 范围$-2^n\sim2^n-1$(定点正数)
  4. 无正负0之分

变形补码(双符号补码)

为了防止溢出而设定

结论

若运算结果超出了计算机所能表示的数值范围,则只保留它的小于模的低n位的数值,超过n位的高位部分就自动舍弃了。

移码表示法(用在阶码中)

定点整数定义:$[x]_移=2^n+x$ ($2^n>x\geq-2^n$)

00000000~11111111($-2^n\sim 2^n-1$)

例:

https://cdn.jsdelivr.net/gh/adan-ning/images/202403181459115.jpg https://cdn.jsdelivr.net/gh/adan-ning/images/202403181500904.jpg

特点

移码和补码尾数相同,符号位相反

范围

$-2^n\sim 2^n-1$

例:以定点整数为例,用数轴形式说明原码,反码,补码表示范围和可能的数码组合情况

https://cdn.jsdelivr.net/gh/adan-ning/images/202403181505085.jpg

例:将十进制真值(-127,-1,0,+1,+127)列表表示成二进制数及原码,反码,补码,移码值(要求8位)

https://cdn.jsdelivr.net/gh/adan-ning/images/202403181508187.jpg

字符和字符串(非数值)的表示方法

  1. 符号数据:字符信息用数据表示,如ASCII等

    常见的ASCII码用七位二进制表示一个字符,它包括10个十进制数字(0~9),52个英文大写和小写字母(a ~ z,A~Z),34个专用符号和32个控制符号,共计128个字符

  2. 字符表示方法ASCII:用一个字节表示,低7位用来编码(128),最高位位校验位

  3. 字符串的存放方法:向量存放法

    在存储器中占用一片连续的空间,每个字节存放一个字符代码,字符串的所有元素(字符)在物理上是相邻的。

奇偶校验概念

奇偶校验码是一种最简单的数据校验码,它的码距等于2,可以检测出一位错误(或奇数位错误),但不能确定出错的位置,也不能检测出偶数位错误

码距:将两个码字逐位进行对比,具有不同的位的个数,例如01和10,码距为2

奇偶校验实现方法是:有若干为有效信息(如一个字节),再加上一个二进制位(校验位)组成检验码

https://cdn.jsdelivr.net/gh/adan-ning/images/202403181555330.jpg

CRC循环冗余校验

循环冗余校验码

  1. 与奇偶校验码一样只能检错不能纠错
  2. 应用于数据通信领域和磁介质存储系统中
  3. 利用多项式校验

步骤:

  1. K=信息码的长度,R=生成多项式最高次幂->校验码位数N=K+R
  2. 生成多项式$G(x)=ax3+bx2+cx1+dx0$,对应二进制码abcd,即为模2除法的除数
  3. 信息码左移R位,利用模2除法(上商规则:最高位为1则商1,最高位为0则商0,减法规则:对应位上相同,结果为0,不同,结果为1),产生余数,将余数补在信息码后形成CRC码,余数某位是1,则该位出错。

定点加法,减法运算

补码加减法

公式:$[x+y]_补=[x]_补+[y]_补$

补码减法:

为了将减法转变为加法,需证明公式:$[x-y]_补=[x]_补+[-y]_补$

证明:

https://cdn.jsdelivr.net/gh/adan-ning/images/202403181618706.jpg

$[X]_补+[Y]_补=[X+Y]_补$证明

假设|x|<1,|y|<1,|x+y|<1

现在分四种情况来证明

https://cdn.jsdelivr.net/gh/adan-ning/images/202403181621019.jpg

https://cdn.jsdelivr.net/gh/adan-ning/images/202403181622273.jpg

使用补码加减法求解下列题目

https://cdn.jsdelivr.net/gh/adan-ning/images/202403181624485.jpg

溢出的检测

检测方法

  1. 双符号位法(参与加减运算的数采用变形补码表示)

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403181627201.jpg

  2. 单符号位法

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403181628915.jpg

基本的加法器

半加器

$H_i=A_i\bigoplus B_i$

不考虑进位

https://cdn.jsdelivr.net/gh/adan-ning/images/202403181633937.jpg

全加器

考虑低位进位$C_{i-1}$和向高位的进位$C_i$

https://cdn.jsdelivr.net/gh/adan-ning/images/202403181638889.jpg

各种逻辑的图形符号

https://cdn.jsdelivr.net/gh/adan-ning/images/202403181635960.jpg

串行加法器

  1. 将n个全加器相连可得n位加法器,但其加法时间较长。这是因为其位间进位是串行传送的,本位全加和$F_i$必须等低位进位$C_{i-1}$来到后才能进行,加法时间与位数有关

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403181643897.jpg

  2. 只有改变进位逐位传送的路径,才能提高加法器工作速度

  3. 解决办法之一是采用“超前进位产生电路”来同时形成各位进位,从而实现快速加法,我们称这种加法器为超前进位加法器

定点乘法运算

乘法实现方法

  1. 在现有的加法和减法器的基础上增加适当的以为线路及控制逻辑可以实现
  2. 用LSI和VLSI工艺实现专用的乘法器
  3. 编制子程序(单片机等低端机器)

原理

  1. https://cdn.jsdelivr.net/gh/adan-ning/images/202403231029533.png

  2. 尾数乘法如下:

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403181655551.jpg

定点原码乘法原理

  1. n位乘n位积可能为2n位

  2. 乘积的最后是所有部分积之和,有n个数相加,而FA只有两个输入端

    所以需要改造

    1. 方法一:硬件实现方法(串行的“加法和移位”),硬件结构简单,速度太慢(时间延迟太长)
    2. 方法二:不带符号位的阵列乘法器

由手工计算到机器运算

  1. 由手工计算到机器运算,需要解决3个问题:
    1. 符号如何让处理
    2. 多个部分积如何相加
    3. 为保持两次部分积之间的位权对应关系,会导致加法器位数的增加,能否在不增加位数的情况下保持位权对应?
  2. 由于解决方式的不同,形成了两种主要的乘法器结构
    1. 采用常规的加法器来实现
      1. 将n位乘法转换为n次累加和移位,每次处理1位
      2. 为避免加法器位数的扩充,可以把手工计算时的新部分积“左移->累加”改为机器运算的原部分积“累加->右移”
    2. 采用阵列乘法器实现
      1. 利用中大规模集成电路把多项部分积同时相加,这样结构的乘法器称为阵列乘法器

原码一位乘法

原码一位乘法是从手算演变而来的,即用两个操作数的绝对值相乘,乘积的符号为两操作数符号的异或值(同号为正,异号为负)

乘积P=|X|$\times$|Y|

符号$P_s=X_s\bigoplus Y_s$

式中:$P_s$为乘积的符号,$X_s$和$Y_s$为被乘数和乘数的符号

规则

  1. 参加运算的操作数取其绝对值
  2. 令乘数的最低位为判断位,若为"1”,加被乘数,若为“0”,不加被乘数(加0);
  3. 累加后的部分积以及乘数右移一位
  4. 重复n次(2)和(3)
  5. 符号位单独处理,同号为正,异号为负。

基本过程

每次将一位乘数所对应的部分积与原部分积的累加和相加并移位

设置寄存器:

A:存放部分累加和,乘积高位,格式为双符号位

B:存放被乘数,格式为双符号位

C:存放乘数,乘积低位,格式为无符号位

设置初值:

A=00.0000

B=|X|=00.1101

C=|Y|= .1011

操作步骤

https://cdn.jsdelivr.net/gh/adan-ning/images/202403181725983.jpg

算法流程

https://cdn.jsdelivr.net/gh/adan-ning/images/202403181726929.jpg

原码一位乘法的硬件实现

  1. A,B为n+2位,C为n位,加法器为n+2位,异或门
  2. A,C寄存器级连在一起,具有右移功能。每次移位时,A的最低位进入C的最高位,而C的最低位被丢掉。最后,A的内容为乘积的高位部分,C的内容为乘积的低位部分
  3. C的最低位作为控制信号,控制运算器加被乘数还是加0;

https://cdn.jsdelivr.net/gh/adan-ning/images/202403231112073.png

说明

  1. 原码乘法虽然容易实现,但一般计算机中数据多以补码表示。若仍用原码做乘法,需要进行码制转换,反倒不方便而且又影响速度。

  2. 因为补码符号位直接参加运算,所以补码乘法不能简单地套用原码乘法的算法。实现补码乘法有2种方法。

  3. 一种方法为校正法,使用较少,只给出算式:

    $[X \times Y]_补=[X]_补 \times (O.X_1X_2…X_n)-[X_补] \times Y_0$

  4. 另一种更好的方法为比较法,该算法是英国人Booth夫妇提出,所以也称为Booth法。该算法无需校正,控制较为简单。以下主要讨论比较法。

补码一位乘法

算法分析

$X_补 = X_0.X_1X_2….._n$

  1. Y为正:$Y_补 = 0.Y_1Y_2….Y_n$

    $(XY)_补 = X_补(0.Y_1Y_2….Y_n)$

  2. Y为负:$Y_补=1.Y_1Y_2….Y_n$

    $(XY)_补 = X_补(0.Y_1Y_2…..Y_n)+(-X)_补$

  3. Y符号任意:

    $(XY)_补 = X_补(0.Y_1Y_2…..Y_n)+(-X)_补Y_0$(符号位$Y_0$)

比较法(BOOTH乘法)

递推公式

$[Z_0]_补 = 0$

$[Z_1]_补 = 2^{-1}{[Z_0]_补+(Y_n+1-Y_n)[X_补]}$

$[Z_2]_补 = 2^{-1}{[Z_1]补+(Y_n-Y{n-1})[X_补]}$

.

..

$[Z_n]_补 = 2^{-1}{[Z_n-1]_补+(Y_2-Y_1)[X_补]}$

$\therefore [X \times Y]_补 = [Z_n]_补 +(Y_1-Y_s)[X_补]$

式中,$[Z_0]$为初始部分积,$[Z_1]_补$~$[Z_n]_补$依次为各次求得的累加并右移之后的部分积

BOOTH乘法规则

  1. 参与运算的数用补码表示
  2. 符号为参加运算
  3. 乘数最低位后面增加一位附加位$Y_{n+1}$其初值为0
  4. 由于每求一次部分积要右移一位,所以乘数的最低两位$Y_n$、$Y_{n+1}$的值决定了每次应执行的操作;
  5. 移位按补码右移规则进行
  6. 共需做n+1次累加,n次移位,第n+1次不移位

比较法算法

https://cdn.jsdelivr.net/gh/adan-ning/images/202403231321873.png

运算实例

X=-0.1101,Y=-0.1011.求$(XY)_补$

初值:A=00.0000,B=$X_补$=11.0011,

-B=$(-X)_补$=00.1101,C=$Y_补$=1.0101

https://cdn.jsdelivr.net/gh/adan-ning/images/202403231324051.png

https://cdn.jsdelivr.net/gh/adan-ning/images/202403231325161.png

  1. A,B取双符号位,符号参加运算
  2. C取单符号位,符号参加移位,以决定最后是否修正

补码一位乘法的硬件实现

  1. A,B,C为n+2位,加法器为n+2位

    与或门有n+2个

  2. 各器件的作用与原码一位乘法相同。控制方式上有所不同,即由C寄存器的最低两位来控制加、减被乘数或加0操作。

https://cdn.jsdelivr.net/gh/adan-ning/images/202403231503055.png

阵列乘法器

不带符号的阵列乘法器

https://cdn.jsdelivr.net/gh/adan-ning/images/202403231505074.png

https://cdn.jsdelivr.net/gh/adan-ning/images/202403231506773.png

带符号位的阵列乘法器

求补电路

原理:算前求补—乘法器—算后求补,见下图

https://cdn.jsdelivr.net/gh/adan-ning/images/202403231508318.png

小结

  1. E=0时,输入和输出相等

  2. E=1时,则从数最右端往左边扫描,直到第一个1的时候,该位和右边各位保持不变$0 \bigoplus A = A$,左边各数值位按位取反$1 \bigoplus A = \ 乛A$

  3. 可以用符号作为E的输入

    原:1.11110,补:1.00010(不变,左边数值位取反)

  4. 时间延迟分析:转换n+1位带符号的时间延迟为$t=n2T+5T$,其中n2T为或门延迟时间,5T为最高位与门和异或门的时延。

带符号位的阵列乘法器(间接法)

https://cdn.jsdelivr.net/gh/adan-ning/images/202403231517748.png

定点除法运算

除法—>若干余数与除数加减,移位

例:$0.10110 \div 0.11111$

https://cdn.jsdelivr.net/gh/adan-ning/images/202403231519915.png

实现出发的关键:比较余数,除数绝对值大小,以决定上商

  1. 除法运算是乘法运算的逆运算。乘法通过加-右移实现,不难想到机器除法运算是通过减-左移实现的。
  2. 机器实现除法运算有两个先决条件(纯小数)
    1. 除数不等于0,否则商为无穷大
    2. 被除数要小余除数,否则商会溢出

原码恢复余数法

  1. 算法

    比较两数大小可用减法试探

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403231523651.png

  2. 实例

    X=-0.10110,Y=0.11111,求X/Y,给出商Q和余数R

    设置:A:被除数,余数,B:除数。C:商

    初值:

    $A=|X|=00.10110$

    $B=|Y|=00.11111$,$-B=11.00001$

    $C=|Q|=0.00000$

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403231526336.png

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403231527882.png

  3. 说明

    1. A,B双符号位。X,Y绝对值,|X|小于|Y|
    2. 运算结束后,余数乘以$2^{-n}$,与被除数同号

原码不恢复余数法(加减交替法)

  1. 算法分析

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403231532286.png

  2. 算法

    $r_{i+1}=2r_i+(1-2Q_i)Y$

    $r_i$为正,则$Q_i$为1,第i+1步作$2r_i-Y$

    $r_i$为负,则$Q_i$为0,第i+1步作$2r_i+Y$

  3. 实例

    X=0.10110,Y=-0.11111,求X/Y,给出商Q和余数R

    初值:

    A=|X|=00.10110

    B=|Y|=00.11111,-B=11.00001

    C=|Q|=0.00000

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403231537229.png

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403231537161.png

  4. 运算规则

    1. A,B取双符号位,X,Y取绝对值运算,|X|<|Y|
    2. 根据余数的政府决定商值及下一步操作
    3. 求n位商,作n步操作;若第n步余数为负,则第n+1步恢复余数,不移位

原码不恢复余数法的硬件实现

  1. A、B寄存器,n+2位,C寄存器,n+1位,加法器,n+2位 ,与或门,n+2个
  2. A、C寄存器级连在一起,具有左移一位功能。每次移位时,C的最高位进入A的最低位,而C的最低位用来保存每次运算得到的商。A的初值为被除数,最后变为余数,C的内容为除法得到的商。
  3. 在运算过程中,由余数的符号决定商值和下一步操作,即控制运算器加除数还是减除数。

https://cdn.jsdelivr.net/gh/adan-ning/images/202403231542540.png

阵列除法器

同乘法一样,为提高除法的运算速度,可采用阵列除法器。以下介绍两个正数的不恢复余数阵列除法器。

  1. 可控加减单元CAS是构成阵列除法器的基本单元。由一个全加器和一个异或门组成。如图所示

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403231544077.png

  2. 可控加减单元CAS有四个输入端和四个输出端。

    当控制线P=0时,$Y_i \bigoplus P =Y_i$,全加器完成$Y_i+X_i$

    当控制线P=1时,$Y_i \bigoplus P =\stackrel{-} Y_i$,全加器完成$ \stackrel{-} Y_i+X_i$

原理

https://cdn.jsdelivr.net/gh/adan-ning/images/202403231547461.png

  1. 被除数X各位沿竖直线送到CAS,除数Y沿斜线送到CAS。做加法还是做减法,由控制线P决定。由于是两正数相除,除法阵列第一行应执行减法操作,所以该行控制端P=1,同时将P作为该行末端的进位输入,从而完成减法运算。
  2. 如果够减,有进位,商为1,下行做减法。如果不够减,无进位,商为0,下行做加法。其它行工作同上,得出商和余数。

定点运算器的组成

算术逻辑运算部件ALU

  1. 计算机的主要功能是对数据进行各种加工和处理,包括加、减、乘、除这些基本的算术运算,与、或、非这些基本的逻辑运算,以及由此构成的其它复杂的运算。运算器则是实现这些运算的主要部件。
  2. 无论多么复杂的运算,最终都要分解为加法运算来实现。其中,减法运算通过补码转化为加法来实现 ;乘、除运算可以转换为加减运算、移位操作来实现。加法和移位是计算机中最基本的两种运算操作。
  3. 可见,**加法器又是运算器的核心部件。**在加法器的基础上增加移位功能,并通过选择输入控制条件,就可以实现所有的运算。

全加器

  1. 全加器(FA)是最基本的运算单元,由它构成加法器。
  2. 全加器有**三个输入量:**操作数$A_i$、$B_i$、以及低位传来的进位信号$C_{i-1}$ 。
  3. 全加器有**两个输出量:**本位和$S_i$、以及向高位的进位信号$C_i$。

https://cdn.jsdelivr.net/gh/adan-ning/images/202403251440419.png

根据真值表得:

Si=Ai⊕Bi⊕Ci-1 Ci=AiBi+(Ai⊕Bi)Ci-1

Si : 本位和 Ci : 向高位的进位

https://cdn.jsdelivr.net/gh/adan-ning/images/202403251442029.png

一个全加器只完成一位加法

全加器构成加法器

  1. 全加器并不存储信息,可用门电路来实现。用全加器能够方便地构成加法器。加法器分为串行加法器并行加法器
  2. 串行加法器只有一个全加器,数据逐位串行送入加法器进行计算。由于运算速度慢,一般不用。
  3. 并行加法器则由若干个这样的全加器构成,各位数据同时运算。并行加法器的位数与操作数的位数相等。并行加法器的最长运算时间主要取决于进位信号的传递时间。例如:11…11和00…01相加,最低位产生的进位将逐位影响到最高位.
  4. 由此可见,提高并行加法器速度的关键尽量加快进位产生和传递的速度。

进位产生与传递

  1. 进位链的概念:

    并行加法器中的每一个全加器都有一个从低位送来的进位输入和一个传送给高位的进位输出。我们把构成进位信号产生和传递的逻辑网络称为进位链。

  2. 进位链上每一位的进位表达式为:

    $C_i=A_iB_i+(A_i⊕B_i)C_{i-1}$ (注意是逻辑关系)

    设 Gi=AiBi ,称为进位产生函数 Pi=Ai⊕Bi ,称为进位传递函数

    ∴ 进位表达式 Ci=Gi+PiCi-1

并行加法器的串行进位

  1. 把n个全加器串联起来,就可以实现两个n位数的相加。这种加法器称为串行进位的并行加法器,串行进位又叫**行波进位。 **

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403251459350.png

并行加法器的并行进位

  1. 改进串行进位方式的基本思路是各进位同时形成,避免各进位之间的依赖关系。现在来分析一下进位关系。

  2. 只要满足下述两条件中任一个,就可形成C1:

    (1)X1,Y1均为“1”; (2)X1,Y1任一个为“1”,且进位C0为“1”。由此,可写得

    C1的表达式为C1=X1Y1+(X1⊕Y1)C0

  3. 只要满足下述两条件中任一个,就可形成C2:

    (1)X2,Y2均为“1”; (2)X2,Y2任一为“1”,且X1,Y1均为“1”; (3)X2,Y2任一为“1”,同时X1,Y1任一为“1”,且C0为

    “1”。由此可得C2表达式为

    C2=X2Y2+(X2⊕Y2)X1Y1+(X2⊕Y2)(X1⊕Y1)C0

https://cdn.jsdelivr.net/gh/adan-ning/images/202403251508637.png

以上进位输出只与$G_i$、$P_i$以及最低进位$C_0$有关,而且不依赖于其低位进位$C_{i-1}$的输入,因此各级进位可以同时产生,形成并行进位。

并行进位的特点

  1. 并行进位的特点是各级进位信号同时形成,与字长无关,提高了整体运算速度 。并行进位又叫先行进位
  2. 最长延迟时间仅为2ty。
  3. 随着加法器位数的增加,Ci的逻辑表达式会变得越来越长,输入变量会越来越多,电路结构也会变得越来越复杂,导致电路实现也越来越困难
  4. 并行进位方式需继续改进,才能有实用价值。这就是下面要介绍的分组进位方式

单级先行进位

https://cdn.jsdelivr.net/gh/adan-ning/images/202403251515189.png

  1. 以16位加法器为例,将其分为4组,每组4位。

  2. 在组内,按照并行进位函数直接产生C1~C4,这些进位可同时得到。实现这种进位逻辑的电路称为4位先行进位电路(CLA),如74181ALU。

  3. 利用这种4位一组的CLA电路和4位全加器可以构成4位CLA加法器。注意,4位CLA加法器包含了两部分逻辑:4位全加器和4位一组的先行进位链,这个组内的进位为一级进位。

  4. 在组间,每个组的进位输入是前一个组的进位输出,而每个组的进位输出是下一个组的进位输入。

  5. 上述组内并行、组间串行的进位方式也称为单级先行进位方式,原理如下图所示。

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403251517260.png

多级先行进位

  1. 组内进位信号能同时产生、组间进位信号也能同时产生,由此可以构成多级并行进位逻辑。16位2级先行进位加法器如图所示。

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403251519150.png

  2. 为说明问题,我们不妨仍以16位加法器为例,仍然4位一组,分成4个小组,先就第一小组的进位输出函数C4做一下分析:

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403251520035.png

  3. G1称为组进位产生函数,P1称为组进位传递函数;这两个函数类似于进位产生函数G和进位传递函数P.

  4. 四个组内的最高进位C16、C12、C8、C4可以分别表示为:

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403251522438.png

例:某加法器最低位为第1位,采用串行进位方式。写出进位信号C3的逻辑式(操作数Ai、Bi、初始进位C0)。

https://cdn.jsdelivr.net/gh/adan-ning/images/202403251522804.png

例2:某加法器采用组内并行、组间并行的进位链,四位一组。写出进位信号C6的的逻辑式(操作数Ai、Bi、初始进位C0)。

https://cdn.jsdelivr.net/gh/adan-ning/images/202403251523893.png

多功能算术逻辑部件ALU

  1. 参加运算的两个数$A_i、B_i$和低位进位Ci-1先不进行全加,先把两个输入$A_i、B_i$和四个控制参数$S_0、S_1、S_2、S_3$进行组合,形成函数$X_i和Y_i$,
  2. 然后再将$X_i、Y_i$和低位进位$C_{i-1}$通过全加器进行全加。
  3. 这样一来,控制参数不同,得到的组合函数也不同,从而实现多种算术和逻辑运算。

算术逻辑部件ALU

  1. 算术逻辑部件ALU大体上有三部分组成

    1. 全加器
    2. 进位链
    3. 输入选择器
  2. 下面以ALU的一位逻辑为例,原理性地说明算术、逻辑功能是如何实现的。

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403251554276.png

    https://cdn.jsdelivr.net/gh/adan-ning/images/202403251554007.png

    通过不同的输入选择,实现不同的功能,这进一步说明:数据是在传送过程实现运算、并得到处理的。多位ALU的实现思路完全一样

运算器的组织

  1. 运算器主要由算逻部件ALU、寄存器、多路转换器、内部数据总线组成。
  2. 在运算器内部,各功能模块之间的连接大都采用总线结构,称为运算器的内部总线,ALU和各寄存器都挂在上面。
  3. 运算器大体上有如下三种结构:单总线结构、双总线结构和三总线总线结构。
单总线结构的运算器

https://cdn.jsdelivr.net/gh/adan-ning/images/202403251556032.png

双总线结构的运算器

https://cdn.jsdelivr.net/gh/adan-ning/images/202403251557747.png

  1. 两个操作数可以同时到达ALU进行运算,且马上可以得到运算结果,输出端需要设置一个缓冲寄存器 ;完成一次运算需要2步 。
  2. 特殊寄存器分成两组,它们分别与一条总线交换数据。通用寄存器中的数据就可以进入到任一组特殊寄存器中去,从而使数据传送更为灵活。
三总线结构的运算器

https://cdn.jsdelivr.net/gh/adan-ning/images/202403251558483.png

两条总线同时供给操作数,输出与第三条总线相连;完成一次运算需要1步。特点是操作速度快,控制相对复杂一些

浮点运算方法和浮点运算器

浮点加法、减法运算

  1. 浮点加减运算

    设有两个浮点数x和y,它们分别为

    $x=2^{Ex}·M_x$

    $y=2^{Ey}·M_y$

    其中$E_x$和$E_y$分别为数x和y的阶码,$M_x$和$M_y$为数x和y的尾数。两浮点数进行加法和减法的运算规则是

    $x±y=(M_x2^{Ex-Ey}±M_y)2^{Ey}$,

      设$E_x<=E_y$

  2. 浮点运算步骤如下:

    1. 0 操作数的检查,看有无简化操作的可能;
    2. 比较阶码大小并完成对阶(小阶向大阶对齐);
    3. 尾数进行加或减运算;
    4. 结果规格化并进行舍入处理

https://cdn.jsdelivr.net/gh/adan-ning/images/202404011946605.png

例:

设$x=2^2×0.11011011,y=-2^4×0.10101100$

  1. 0操作数检查(非0)

  2. 对阶:阶码对齐后才能加减。规则是阶码小的向阶码大的数对齐;

    若△E=0,表示两数阶码相等,即Ex=Ey;

    若△E>0,表示Ex>Ey;

    若△E<0,表示Ex<Ey。

    当Ex≠Ey 时,要通过尾数的移动以改变Ex或Ey,使之相等

    原则:小阶向大阶

    设△E>0,表示Ex>Ey,则移动y的尾数,My右移△E位

    阶差=Ex-Ey=00 010- 00 100 =11 110

    即阶差为-2,Mx右移两位,Ex加2

    x=00100 , 0.00110110(11)

  3. 尾数相加

    00.00110110(11)+11.01010100=11.10001010(11)

  4. 结果规格化

    1. 在浮点加减运算时,尾数求和的结果也可以得到01.ф…ф或10.ф…ф,即两符号位不等,此时将运算结果右移以实现规格化表示,称为向右规格化。

      规则:尾数右移1位,阶码加1

    2. 结果是00.0..01…..或11.1…10…时,则向左规格化

      规则:尾数左移1位,阶码减1,直到规格化

      右规,阶码加1,左规,阶码减1

      刚才例子左规为11.00010101(10),阶码减1为00011

  5. 舍入处理(对阶和向右规格化时)

    1. 就近舍入(0舍1入):类似”四舍五入”,丢弃的最高位为1,进1
    2. 朝0舍入:截尾
    3. 朝+∞舍入:正数多余位不全为”0”,进1;负数,截尾
    4. 朝-∞ 舍入:负数多余位不全为”0”,进1;正数,截尾
  6. 溢出判断和处理

    1. 阶码上溢,一般将其认为是+∞和-∞ 。
    2. 阶码下溢,则数值为0
    3. 尾数上溢,两个同符号位的数相加。处理方法是尾数右移,阶码 加1
    4. 尾数下溢。尾数右移时,最低位从最右端流出。要进行舍入处理 。

课堂练习:x=0.110121 y=-0.101023

尾数和阶符都采用补码表示,都采用双符号位表示法。求x+y

[x]浮=0001,00.1101 [y]浮=0011,11.0110 阶差=1110 即为-2 Mx应当右移2位, [x]浮=0011,00.0011(01) 尾数和为11.1001(01) 左规11.0010(10),阶码减1为0010 舍入(就近舍入)11.0011 丢弃10 x+y=-0.1101*210

浮点乘法和除法运算

  1. 设有两个浮点数x和y:

    $x=2^{Ex}·M_x $    

    $y=2^{Ey}·M_y$

  2. 乘除运算分为四步

    1. 0操作数检查
    2. 阶码加减操作(无需对阶)
    3. 尾数乘除操作
    4. 结果规格化和舍入处理

    浮点数的阶码运算(移码的运算规则)

    $[X]_移+[Y]_移=2^n+[X+Y]_移$

    https://cdn.jsdelivr.net/gh/adan-ning/images/202404012023984.png

  3. 移码采用双符号位,为了对溢出进行判断

    01 为正 00 为负

    10 上溢 11 下溢

    x=+011,y=+110,求[$x+y]_移 和 [x-y]_移$,并判断是否溢出

    $[x]_移=01 011, [y]_补=00 110, [-y]_补=11 010$

    $[x+y]_移=[x]_移+[y]_补=10 001$, 结果上溢。

    $[x-y]_移=[x]_移+[-y]_补=00 101$, 结果正确,为-3。

  4. 尾数处理

    1. 截断
    2. 舍入
      1. 尾数用原码表示时
        1. 只要尾数最低为1或者移出位中有1数值位,使最低位置1
        2. 0舍1入
      2. 尾数用补码表示时
        1. 丢失的位全为0,不必舍入。
        2. 丢失的最高位为0,以后各位不全为0时;或者最高为1,以后各位全为0时,不必舍入
        3. 丢失的最高位为1,以后各位不全为0时,则在尾数的最低位入1的修正操作

例:

设有浮点数x=2-5×0.0110011, y=23×(-0.1110010),阶码用4位移码表示,尾数(含符号位)用8位补码表示。求[x×y]浮。要求用补码完成尾数乘法运算,运算结果尾数保留高8位(含符号位),并用尾数低位字长值处理舍入操作。

解:

移码采用双符号位,尾数补码采用单符号位,则有

$[Mx]_补=0.0110011, [My]_补=1.0001110,$

$[Ey]_移=01 011, [Ey]_补=00 011, [Ex]_移=00 011,$

$[x]_浮=00 011, 0.0110011, [y]_浮=01 011, 1.0001110$

  1. 判断操作是否为”0”,求阶码和

    $[Ex+Ey]_移=[Ex]_移+[Ey]_补=00 011+00 011=00 110,$

    值为移码形式-2。

  2. 尾数乘法运算可采用补码阵列乘法器实现,即有

    $[Mx]_补×[My]_补=[0.0110011]_补×[1.0001110]_补 =[1.1010010,1001010]_补$

  3. 规格化处理

    乘积的尾数符号位与最高数值位符号相同,不是规格化的数,需要左规,阶码变为00 101(-3),

    尾数变为 1.0100101,0010100。

  4. 舍入处理

    尾数为负数,取尾数高位字长,按舍入规则,舍去低位字长,故尾数为1.0100101 。

    最终相乘结果为

    $[x×y]_浮=00 101,1.0100101$

    其真值为

    $x×y=2^{-3}×(-0.1011011)$

  5. 实现的逻辑框图

    https://cdn.jsdelivr.net/gh/adan-ning/images/202404012057816.png

  6. 浮点运算器实例

    1. CPU之外的浮点运算器(数学协处理器)如80287
      1. 完成浮点运算功能,不能单用。
      2. 可以和80386或80286异步并行工作
      3. 高性能的80位字长的内部结构。有8个80位字长以堆栈方式管理的寄存器组。
      4. 浮点数格式完全符合IEEE标准
    2. CPU之内的浮点运算器(486DX以上)

本 章 小 结

  1. 一个定点数由符号位和数值域两部分组成。按小数点位置不同,定点数有纯小数和纯整数两种表示方法。
  2. IEEE754标准,一个浮点数由符号位S、阶码E、尾数M三个域组成。其中阶码E的值等于指数的真值e加上一个固定偏移值。
  3. 为了使计算机能直接处理十进制形式的数据,采用两种表示形式:(1)字符串形式,主要用在非数值计算的应用领域;(2)压缩的十进制数串形式,用于直接完成十进制数的算术运算。
  4. 数的真值变成机器码时有四种表示方法:原码表示法,反码表示法,补码表示法,移码表示法。其中移码主要用于表示浮点数的阶码E,以利于比较两个指数的大小和对阶操作
  5. 字符信息属于符号数据,是处理非数值领域的问题。国际上采用的字符系统是七单位的ASCII码。直接使用西文标准键盘输入汉字,进行处理,并显示打印汉字,是一项重大成就。为此要解决汉字的输入编码、汉字内码、字模码等三种不同用途的编码
  6. 为运算器构造的简单性,运算方法中算术运算通常采用补码加、减法,原码乘除法或补码乘除法。为了运算器的高速性和控制的简单性,采用了先行进位、阵列乘除法、流水线等并行技术措施。运算方法和运算器是本章的重点