计算机组成.计算机在计算啥.运算与ALU

article/2025/9/24 8:11:53
  • 一身冷汗
  • 原本打算在iPad上写下一篇“处理器”。上一次用iPad写的这篇在打开浏览器后还保存着,我就直接删掉重写了。结果把原本的我的这篇给覆盖了……
  • 幸亏我有备份……
  • 不过格式还是得再MarkDown上重新调整……心好累

  • 突然发现在iPad的网页上也可以写博客哎,,这样就不用背着厚重的笔记本了
  • 写了两句就发现,在输入状态下文本编辑窗口只能保持在最高,,,这样就被虚拟键盘挡住了,,,体验-1
  • 再写两句发现又好了,,,体验+1

  • 我所认为的计算机的运算,无非就是“算数”,除了传统的加减乘除外,在二进制的表示下,还有逻辑运算与移位运算。

  • 而计算机真正的魅力在于,可以算得很快,所以承受得住我们去对每一个运算所赋予的详细含义,在各种含义下的运算互相碰撞着,也就干成了各种各样的事情。
  • 移位运算实际上是一种受限的乘除,即只能扩大缩小一定的倍数。
    • 比如1000右移一位成0100也就缩小了2倍,再移一位成0010又缩小了2倍,相对于最初缩小了4倍。
    • 那我想缩小三倍怎么办?这就是乘法和除法要做的事,其很大程度上依赖了移位运算。

定点数的运算

  • 二进制的特点是,只有1和0,也就可以把“1”对应为“逻辑真”,“0”对应为“逻辑假”
  • 真真假假与或非,假假真真门电路
  • 简单的认识一下的话,计算机内把每一位也就是每个bit用一个电位体现,当这个电位有电表示1,没电表示0
  • 所以说计算机为什么非要采用二进制而不用十进制或其他进制呢?
    • 这是因为数据中的每一位需要用一位表示的话,一个电位要表示0到9的十种状态,就要有十个电压等级,这无疑是很复杂的。
    • 而且一位表示的信息越多,其处理起来也越复杂,而二进制只有1和0,处理起来极为简单,当二进制保存的位也多,其处理的复杂在于多个位之间的联系。

门电路

  • 门电路干啥的?
    • 还记得1和0是用“有电”和“没电”来表示的吗,而门电路就是来根据有电和没电的状态来对1和0进行运算
  • 什么是运算?
    • 我说1+1=2,实际上是输入了两个值,分别是1和1,告诉说对着两个数的运算是“+”,那么我就可以得到一个输出的结果2
  • 每种门电路本身就对应了一种运算形式,最简单的门电路就是与“AND”、或“OR”、非“NOT”
    • 一般一个门电路有两根电线作为输入,有一根电线作为输出
    • 与AND:只有输入的两根电线都有电,输出的电线才有电
    • 或OR:只有输入的两根电线都没电,输出的电线才没电
    • 非NOT:只有一个输入电线,输入有电则输出没电,输入没电则输出有电
    • 有电、没电、电线都是我臆想的,实现的方法我猜大概是串并联开关啥的吧,,,作为理解尚可,而具体能否这样实现我不知道了,,,有时间打算研究一下数字电路

与或非

  • 注意,非门中真正起作用的是那个小圈圈,表示取反,常与其他门电路结合表示各种更为复杂的电路

其他门电路


逻辑运算

  • 逻辑非
    • 也就是取反,1变0,0变1 由“非门”电路实现
  • 逻辑加
    • 就是“或”,1+1=1,1+0=1,0+1=1,0+0=0。 由“或门”电路实现
  • 逻辑乘
    • 就是“与”,1·1=1,1·0=0·1=0·0=0。 由“与门”电路实现
  • 逻辑异或
    • “XOR”,其规则是1 XOR 1 = 0 XOR 0 = 0 ,1 XOR 0 = 0 XOR 1 = 1
    • 解释1:相同输出0,不同输出1。只适合两个数的时候。
    • 解释2:参与运算的1的个数为偶数输出0,为奇数输出1。 适合多个数进行XOR运算时候,比如1 XOR 0 XOR 1 = 0。
    • 异或运算有很多很好的特性,没法讲,活久见

移位运算

  • 移位运算就是按位平移,有的位会移到外面,那么就丢弃,有的位会空出来 ,那么就补0,这个绝对的“补0”是对于原码而言的。
  • 还是4 bit为例,二进制数“1000”
    • 每位起个名字,最高位w3为1,依次w2为0,w1为0,w0为0
    • 右移一位,就是让w0取w1的值,w1取w2的值,w2取w3的值,w3没地方取,就补0,变成了“0100”,视觉上就是“右移了一位”
    • 机器总是需要一个符号位来表示有符号数,而显然符号位在移位的时候并不参与,那么
  • 对于有符号数的移位操作,我们叫“算数移位”
  • 对于无符号数的移位操作,我们叫“逻辑移位”
  • 其实无论算数移位还是逻辑移位,都是一种移位的规则,只不过只有对于各自的操作数才有意义。 显然符号位的移位并没有什么意义,,,,,,当然如果有什么特殊的手法可以让符号位的移动产生重要的意义,那么当然是可以移动的。

  • 算术移位

    • 基本规则:符号位不变,移位的空位补0
    • 细则1:对于正数,无论机器内使用原码、反码还是补码表示,其都是原码的形式,因正数的原码反码补码是同样的表示,所以空位补0
    • 细则2:对于负数,原码下空位补0,反码空位补1,补码左移补0,右移补1
    • 有个表格会好理解一些,依旧是4bit,最高位符号位
数值原码补码补码左移1位左移后值补码右移1位右移后值
2001000100100400011
-2101011101100-41111-1
  • 还有一点,就是移位的固有影响

    • 本质上是乘、除的二进制简化形式,左移一位即乘2,右移一位即除2
    • 而操作的数又是整数,那么在不断乘2(左移)的时候很可能会超过其上限而造成结果出错,而在不断除2(右移)的时候很可能有会因为原数为奇数而不能正确的得出其原值*0.5的值,表现就是取整,造成精度损失
    • 从移位的角度来看,移位的时候必然会舍弃一位,而舍弃的一位若含有原数的信息,就会造成错误。
    • 至于原码反码补码分别在左移右移时丢弃1还是0的时候才会出错,,,不再细究,,,
  • 逻辑移位

    • 基本规则是,无论左移右移,空位补0 无论移丢0还是1,都不影响结果的正确性和精度 没意思,不写了

加减

  • 由于计算机引入了补码,目的就是为了统一了正负数的运算,所以加减乘除也就要在补码下讲,当然在原码下也同样可讲,,,

  • 对于两个数值X,Y(我是说数值哦)

    • 加法:[X + Y]补 = [X]补 + [Y]补 (mod 2^n)
    • 减法:[X - Y]补 = [X]补 + [-Y]补 (mod 2^n)
    • 之所以要mod2^n,是因为原本长度为n位,运算之后可能会有进位导致长度变长,而实际上计算机是没有办法保存多出来的那一位(尽管可以采取某种特殊的手段来保存)所以就舍弃掉了。
    • 对于减法的 [-Y]补 ,其求法为 [Y]补 的每位(包括符号位)取反后+1,即[-Y]补 = [Y]补 +1。当Y为正数时,-Y为负数,负数的补码也就是对应正数的取反后+1,符合我们所知的转换规则。而这条规则同样适用于Y为负数的时候。
    • 惯例列表
X值[X]补加法Y值[Y]补结果值[结果]补
20010+1000130011
-11111+2001010001
X值[X]补减法Y值[-Y]补结果值[结果]补
30011-1111120010
20010--1000130011

乘除

  • 早期的计算机一般只有加法器和移位电路,乘法的实现依赖于加法和移位。
  • 我们知道移位就是一种受限的乘法,左移一位相当于乘2,左移两位相当于乘4。那么乘法就是解决中间乘3的问题。很简单可以想到,乘3就等于原数乘2+原数本身,也就是一次移位和一次加法来实现。
  • 那么这种思路可不可以形成一种公式来指导任意的乘法运算呢? 当然是有的

原码一位乘法

  • 先在原码下考虑,补码的话其实会有些不同。注意原码表示的乘数下,结果也应该是用原码表示
  • 先以我自己琢磨的定点整数为例,约定一下按每一位来表示的整数我写在[ ]里面,并用空格间隔开每位。
    • 则A=[a3 a2 a1 a0] B=[b3 b2 b1 b0]
    • A*B的每一位用c来表示,则c3 = a3 XOR b3,即符号位可以由两个乘数的符号位直接得出(异或运算)从而符号位可以不用参与实际的运算过程
      • [c2 c1 c0]
      • = [a2 a1 a0] * [b2 b1 b0]
      • = [a2 a1 a0] * ( [b2 0 0] + [0 b1 0] + [0 0 b0] )
      • = [a2 a1 a0] * [0 0 b0] + [a2 a1 a0] * [0 b1 0] + [a2 a1 a0] * [b2 0 0]
      • = [a2 a1 a0] * b0 * 2^0+ [a2 a1 a0] * b1 * 2^1 + [a2 a1 a0] * b2 * 2^2
    • 注意到:
      • b2 b1 b0实际上就是B的每一位,而且只能是1或0
      • 如果是0,则对应项就不必运算
      • b0所在项需要乘2^0,也就是不需要左移
      • b1所在项需要乘2^1,也就是左移一位,也就是在前一项的基础上左移一位
      • b2所在项需要乘2^2,也就是左移二位,也就是在前一项的基础上左移一位
      • 至此其实已经相当明了了,就是根据乘数B的每一位,对乘数A进行左移并加上之前的值,我们把之前的值作为部分积的概念引入
        • 取部分积 Z0 = 0,A的绝对值记为|A|
        • Z1 = |A| * b0 * 2^0
        • Z2 = |A| * b1 * 2^1 + Z1
        • Z3 = |A| * b2 * 2^2 + Z2
        • 但是这样还有个不足之处,那就是我每次进行的移位位数是递增的,而这很容易改进,从公式就可以简单的入手
      • 原式
      • = [a2 a1 a0] * b0 * 2^0+ [a2 a1 a0] * b1 * 2^1 + [a2 a1 a0] * b2 * 2^2
      • = [a2 a1 a0] * b0 + 2 * ( [a2 a1 a0] * b1 + 2 * [a2 a1 a0] * b2 )
      • 取部分积 Z0 = |A| * b2
      • Z1 = Z0 * 2 + |A| * b1
      • Z2 = Z1 * 2 + |A| * b0
      • 语言描述下就是:
        • 1、部分积取 |A| * b2
        • 2、部分积左移一位
        • 3、部分积 += |A| * b1
        • 4、部分积左移一位
        • 5、部分积 += |A| * b0 得到结果
  • 再以书上所讲的定点小数为例
  • 设A=[a3 . a2 a1 a0],B=[b3 . b2 b1 b0],
    • a3和b3表示符号位
    • 真正的纯小数部分为 0. a2 a1 a0 的形式
    • 乘积的符号依旧由 a3 XOR b3 算得
      • A * B
      • = [0. a2 a1 a0] * [0. b2 b1 b0]
      • = [0. a2 a1 a0] * ( [0. b2 0 0] + [0. 0 b1 0] + [0. 0 0 b0] )
      • = [0. a2 a1 a0] * b2 * 2^-1 + [0. a2 a1 a0] * b1 * 2^-2 + [0. a2 a1 a0] * b0 * 2^-3
      • = [0.a2 a1 a0] * b2 * 2^-1 + 2^-2 * ( [0. a2 a1 a0] * b1 + [0. a2 a1 a0] * b0 * 2^-1 )
      • = 2^-1 * ( [0. a2 a1 a0] * b2 + 2^-1 * ( [0. a2 a1 a0] * b1 + [0. a2 a1 a0] * b0 * 2^-1 ) )
      • = 2^-1 * ( |A| * b2 + 2^-1 * ( |A| * b1 + 2^-1 * |A| * b0 ) )
        取部分积Z0 = |A| * b0 Z1 = 2^-1 * Z0 = Z0 右移一位 Z2 = Z1 + |A| * b1 Z3 = 2^-1 * Z2 = Z2 右移一位 Z4 = Z3 + |A| * b2 Z5 = 2^-1 * Z4 = Z4 右移一位
        • 语言描述
          • 部分积取 |A| * b0
          • 部分积右移一位
          • 部分积 += |A| * b1
          • 部分积右移一位
          • 部分积 += |A| * b2
          • 部分积右移一位
        • 注意到 b0 b1 b2 的含义,它们是乘数 B 的每一位,而且值只能是1和0。反映到过程中讲就是,如果 B 中有一位为1,那就要在“相应的两次右移之间”部分积加上一次 |A|,如果该位为 0,部分积就可以连续右移。
  • 小结:
    • 定点整数左移,定点小数右移 乘法被分解成“加上原数和移位一位”的多次重复
    • 结合硬件的布局也许会更容易理解。
    • 一下是定点小数的硬件布局

原码一位乘法


补码一位乘法

  • 补码一位乘法又称为校正法,原因就是有了原码一位乘法的基础,补码一位乘法只需稍作分析和校正即可转换为原码一位乘法来运算
  • 以定点小数为例,并给出一张帮助理解的编码表
编码一般意义下的值视为补码下的值视为原码下的值
0.00000
0.010.250.250.25
0.100.50.50.5
0.110.750.750.75
1.001-1-0
1.011.25-0.75-0.25
1.101.5-0.5-0.5
1.111.75-0.25-0.75
  • 取两个乘数 X 和 Y均为小数 ,这里用X和Y表示一般意义下的编码。
    • 所谓的一般意义就是不用符号位来保存符号,而是直接用“+”和“-”,就像我们正常写十进制的数字的时候,正12就写成“12”,负11就写成“-11”。
      |数值 |一般编码 |原码 |补码|
      |0.25 |+0.01 |0.01 | 0.01|
      |-0.25 |-0.01 |1.01 |1.11|

模运算

  • 在这里我们再讲一下模运算
  • 给定一个正整数p,任意一个整数n,一定存在等式n=k?p+r 满足k为整数,r为整数且 0 <= r < p
  • 我们称k为商,r为余数
    • 所谓的模运算,也就是n mod p=r 这种形式,编程里用 % 运算符来表示模运算,即 n % p=r
  • 模运算规律,只介绍我们用到的两条和我额外添加的辅助理解的简单规则
    • 一、(a + b)%p = (a%p + b%p) %p
    • 二、(a * b)%p = (a%p * b%p)%p
    • 三、a%p = (p + a)%p
    • 四、a>0时,由上一条,(-a)%p = (p-a)%p,即一个负数模p可以等价转换成一个正数模p,而这两个数的绝对值之和为p

正文

  • [X]补 = x0.x1x2x3…xN-1,[Y]补 = y0.y1y2y3…yN-1
  • 当 X 的符号任意,Y为正数的时候
    • [Y]补 = 0.y1y2y3…yN-1 = Y
    • [X]补 = x0.x1x2x3…xN-1 = 2+X = 2^N +X (mod 2)
      • 解释一下
      • 这里等号“=”的意义是“编码后长得相同”
        • 当Y为正数的时候,Y的一般意义下的编码形式和Y的补码形式相同,显然易见。
        • X为任意数,即可正可负。但是X是定点小数,不考虑符号的话一般意义下表示的数字范围是[0,2),所以对于一个数值X,其加上2后的编码一样,因为“2”本身已经超过了编码的能力,即使加上了也无法被编码,具体的表现形式就是截断。外在表现之一就是模运算的运算规律三。
        • 如X的值为0.25,编码为000.01000,按表格中存储的位来截断之后的编码就是0.01 X+2的值为2.25,编码为010.01000,截断后仍是0.01。
      • 进一步分析,如果X为负数怎么办。
        • 依旧是举例说明。
        • X的值为 -0.25 ,
        • 根据表格 X的补码形式是 “1.11”
        • X+2的值为1.75,一般编码的形式是“1.11”
        • 也就是说,冥冥之中,有一种特殊的方法规律可以把我们一般意义下的编码和补码统一起来,简单的+2并取模就可以转换。
        • 这个规律就是:对于任意小数 N,有 [N]补 = 2 + N (mod 2),而这个规律恰又对应上了模运算的规律三,而且其实有种内在的数学联系。
    • 进一步的进行数学分析
      • [X]补 * [Y]补
      • = [X]补 * Y
      • = (2^N + X) * Y (mod 2)
      • = ( 2^N * Y (mod 2) + X * Y ( mod 2) ) (mod 2)
      • = ( 2 (mod 2) + X * Y (mod 2) ) (mod 2)
      • = ( 2 + X * Y) ( mod 2)
      • = [X * Y]补
      • 注意到中间加粗部分的转换,即”2^N * Y (mod 2) = 2 (mod 2)”
        • 2^N * Y 也就是对Y进行左移,还记得 Y 是 0.y1y2y3…yN-1吗,如果左移N-1位的话,也就变成了 y1 y2 y3 … yN-1.000…0,这本身是一个大于等于1的数(注意到Y是一个正数),所以“原式 = 2 * 一个大等于1的整数 (mod 2) ”也就等于“2 (mod 2)”。其实二者在mod 2的意义下就都是0了嘛。
        • 之所以转换成2,而不是其他同样是全0的编码,是为了对应上文的规律,从而得出 [X * Y]补 这个最终结果
        • 所以最终的结论就是:[X * Y]补 = [X]补 * Y
    • 疑问?从推导过程中可以发现,在最后两步的等式中,即(2+X?Y) (mod 2)=[X?Y]补
    • 对前者运用模运算的规律的话就可以直接去掉2,从而变成了 (X?Y) (mod 2) = [X?Y]补 了啊,这很奇怪啊。。。
      • 其实这样的推导很对,确实可以得出这个结果,而且这个结果也确实是对的。
      • 这里X和Y的意义是“一般编码”下的形式,分类讨论一下的话
        • X为正,Y本为正,则式子显然成立
        • X为负,Y为正,则 X * Y 其实是一个负值,但这还不是最终的结果,最终[X * Y]补所对应的是 (X * Y)(mod 2),也就是身为负值的 X * Y模2之后的结果。要知道模运算的结果r总是一个大于等于0的数,所以最终[X * Y]补的编码形式其实也就是和 (2+X*Y)的编码形式相同。
        • 但我们最终需要的是直接使用[X]补和[Y]补来运算得到[X*Y]补。所以我们留下了“2”,不仅仅是因为这样做是正确的(见上条的分类讨论),同时也是因为我们这样可以转换成我们需要的形式。
    • 再说一遍我们的推导结论:[X * Y]补 = [X]补 * Y
    • 这个结论意味着什么呢?意味着我们最终需要得到的X*Y的补码形式可以直接由X的补码和Y的补码(因为此时Y为正所以[Y]补=Y)形式直接参与运算得到。
    • 具体的运算步骤和原码的拆分一模一样,简单讲一下
      • [X * Y]补 = [X]补 * 0. y1 y2 y3 … yN-1
      • 取部分积Z0 = 0,我们最终要得到的结果是[Zn-1]补
        • [Z0]补 = 0
        • [Z1]补 = 2^-1 * (yN-1 * [X]补 + [Z0]补)
        • [Z2]补 = 2^-1 * (yN-2 * [X]补 + [Z1]补)
        • ……
        • [Zn-1]补 = 2^-1 * (y1 * [X]补 + [Zn-2]补) = [X * Y]
  • 当X的符号任意,Y为负数的时候
    • 我不打算推导了,,,真累
    • 结论:[X * Y]补 = [X]补 * 0.y1 y2 y3 … yN-1 +[-X]补
    • 最后需要加上的 [-X]补
    • 也就是补码一位乘法的校正值,可见校正只需要在Y为负的情况下才需要
  • 所以实际在运算的时候,只有一个乘数是以真正的补码的形式参与了运算,而Y则需要在判断了符号之后去掉符号位变成正数来参与运算,Y的符号位做额外判断是为了判断最后是否需要加上[-X]补来进行校正
  • 那有没有两个乘数都以补码的形式直接参与运算,最后得出正确的补码形式呢?额符靠丝

布斯算法“Booth算法”

  • [X]补 = x0.x1x2x3…xN-1
  • [Y]补 = y0.y1y2y3…yN-1
  • 按照校正法的结论[X*Y]补 =[X]补 * 0.y1y2y3…yN-1 +y0 * [-X]补
  • 由于在mod 2的意义下,[-X]补 = -[X]补 (mod 2)
    • 证明:证明太晦涩,我可以举例来解释一下
    • 取X=0.25,则-X = -0.25。后面几行都是二进制的形式
    • 查表:[X]补 = 0.01 ; [-X]补 = 1.11
      • -[X]补 = -0.01
      • -0.01 (mod 2)
      • = (10.00 - 0.01) (mod 2)
      • = 1.11 (mod 2) = 1.11
    • 所以有[-X]补 = -[X]补 (mod 2)
    • 简单说来就是,mod 2意义下,负值总要通过加2来转化为正值,之后再谈编码形式 所以最终就有如下的形式
  • [X * Y]补
    • = [X]补 * (0.y1y2y3…yN-1)- y0 * [X]补
    • = [X]补 * (-y0 + y1 * 2^-1 + y2 * 2^-2 + … + yN-1 * 2^-(N-1) )
    • = [X]补 * [ (y1 - y0) + (y2 - y1) * 2^-1 + … + (yN-1 - yN-2) * 2^-(N-2) + (0 - yN-1) * 2^-(N-1) ]
    • = [X]补 * [ (y1 - y0) + (y2 - y1) * 2^-1 + … + (yN-1 - yN-2) * 2^-(N-2) + (yN - yN-1) * 2^-(N-1) ] 式中”yN = 0”
  • 如此再结合部分积
    • 取部分积Z0 = 0
    • Z1 = 2^-1 * {Z0 + (yN - yN-1) * [X]补 }
    • Z2 = 2^-1 * {Z1 + (yN-1 - yN-2) * [X]补 }
    • ……
    • ZN-1 = 2^-1 * { ZN-2 + (y2 - y1) * [X]补 }
    • ZN = ZN-1 + (y1 - y0) * [X]补 = [X * Y]补
  • [X]补直接参与了运算,y0也参与了运算也就意味着Y也是以补码的形式[Y]补直接参与了运算
  • 特点
    • 首先是X和Y均是以补码的形态[X]补和[Y]补参与了运算
    • 结果是[X*Y]补
    • 运算期间的逻辑变得复杂了,原先只需要看Y的对应位是1和0,而现在每一步需要用到Y的两位之间的差,见下面的表格
    • 最后一步是不需要乘2^-1,也就是不需要右移
yi-1yiyi - yi-1操作
000加上0,然后右移一位
011加上[X]补,然后右移一位
10-1加上[-X]补,然后右移一位
110加上0,然后右移一位

除法运算

  • 因为考试不考,,,所以先不细写了,,简要讲一下我对除法的理解
  • 想象一下十进制下手算除法的过程,总是要去凑出每一位,使其与除数相乘的结果刚好不大于下面的被除数。
  • 每次凑数的时候都需要乘乘看到底是不是刚好不大于被除数。
  • 那么在二进制下也是凑的吗?不,这可是神奇的二进制
  • 因为二进制只有0和1,所以假如在二进制下模仿十进制除法的姿态,我们去凑数的时候也只有0和1两种选择
    • 如果0是正确的结果,这也就意味着除数大于被除数
    • 如果1是正确的结果,这也就意味着除数小于被除数
    • 也就是说,在二进制下,我们不需要凑数,只需要比较一下除数和被除数那个大,就可以知道当前数位上是填0还是填1了。
    • 比较好比啊,只需要两个数减一减就知道谁大谁小了。
    • 再配合上移位操作,除法也就被完美的用减法和移位实现了。
    • 嗯。神奇的二进制。
  • 具体的方法有
    • 原码恢复余数除法
      • 核心思想就是:每次在做减法看谁大谁小来决定填1还是0的时候,我们并不知道到底谁大谁小。
      • 看谁大谁小,就需要看减完的余数是正还是负
      • 如果余数为负,就说明我们减过头了,自然是填0,但是我们还需要再把余数恢复过来,也就是所谓的“恢复余数”
    • 原码加减交替除法
      • 核心思想就是:改进了原码恢复余数除法,不需要恢复余数。
      • 本质上我们不需要死板的看余数的正负才能判断谁大谁小,
        在余数为负的时候,我们可以通过加上除数而不是恢复余数后再去除数,一样可以判断谁打谁小来进一步判断填1还是0
      • 余数为正的时候自然就是减去除数
      • 所谓加减交替

ALU

  • 算术逻辑单元(arithmetic and logic unit)
  • 组成:
    • 内部组成:
    • 加法器AU
    • 逻辑运算器
    • 移位器
    • 求补器
  • 外部组成:
    • 两个输入缓冲器A和B
    • 输出缓冲器SUM
    • 进位标志CF、溢出标志OF、符号标志SF、零标志ZF

ALU


加法器

  • 加法器比较好讲,也比较简单
  • 所以大概这就是被选入教材的原因

串行加法器

  • 考虑我们手算加法的时候,总是
    • 先个位相加,选出结果和进位
    • 再十位相加并加上进位,再算出结果和进位
    • ……
  • 这个就是一个链式的过程,每一位(除了第一位)之外其结果的得出都依赖于前一位的进位,并且该位运算完的进位需要提供给下一位才能得出下一位的结果和进位,下一位的进位再……
  • 基本逻辑单元:全加器FA(Full Adder)

FA

  • 介绍
    • 两个本位加数 Ai 和 Bi
    • 低位进位 Ci-1
    • 本位和 Si
    • 向高位的进位 Ci
    • Si = Ai XOR Bi XOR Ci-1
    • Ci = Ai·Bi + (Ai+Bi)·Ci-1(逻辑加OR 与 逻辑乘AND)
    • 记Gi=Ai·Bi称为本位进位
    • 记Pi=Ai+Bi称为传递条件,Pi·Ci-1称为传递进位
    • 可见:Ci = Gi + Pi·Ci-1
  • 多个FA串接起来,就组成了串行加法器

并行加法器

  • 我们看到,每一位之间的依赖关系,是“进位值Ci”
  • 如果我们能提前知道了每一位的 Ci,那么位之间的依赖关系也就不复存在了,也就可以并行进行了,就是同时算所有的数位

  • 有办法吗?有的

  • 以四位CRA(Carry Ripple Adder)为例

    • C0 = 0
    • C1 = G1 + P1·C0
    • C2 = G2 + P2·C1
    • C3 = G3 + P3·C2
    • C4 = G4 + P4·C3
  • 进一步变换可得到
    • C0 = 0
    • C1 = G1 + P1·C0
    • C2 = G2 + P2·G1 + P2·P1·C0
    • C3 = G3 + P3·G2 + P3·P2·G1 + P3·P2·P1·C0
    • C4 = G4 + P4·G3 + P4·P3·G2 + P4·P3·P2·G1 + P4·P3·P2·P1·C0
  • 容易看出,虽然逻辑复杂了很多,但是Ci只和G、P、C0有关,而不依赖于Ci-1,而G、P有只和各自的Ai、Bi有关
  • 这也就意味着,我们一开始就知道的Ai、Bi和C0=0,足以求出C1、C2、C3、C4。这样不就是“提前把所有的Ci”求出来了嘛
  • 我们就设计了这样的逻辑电路,输入是G1、P1、G2、P2、G3、P3、G4、P4、C0,依照公式设计好电路,输出是C1、C2、C3、C4,分别输入到对应的全加器FA中。
  • 这就是先行进位加法(Carry Look Ahead, CLA)链,也叫超前进位链

CLA

  • 四个FA和一个CLA就可以组成一个四位的先行进位加法器,SN74181就是这样一种ALU芯片

SN74181

  • 至此也就了解了基本的并行思想 然而多个SN74181之间仍然需要串行,,嗯哼,我猜你想到了什么。没错,可以用同样方法来对多个SN74181进行并行化
    • D1 = G4 + P4·G3 + P4·P3·G2 + P4·P3·P2·G1
    • T1 = P4·P3·P2·P1

    • C4 = D1 + T1·C0
    • C8 = D2 + T2·D1 + T2·T1·C0
    • C12 = D3 + T3·D2 + T3·T2·D1 + T3·T2·T1·C0
    • C16 = D4 + T4·D3 + T4·T3·D2 + T4·T3·T2·D1 + T4·T3·T2·T1·C0
  • 和之前很是对称的形式,只不过D和T是由G和P来生成 ,而G和P是直接由A和B来生成。实际上实现的逻辑电路完全一样,但是
    • 前者CLA提前生成的是FA之间的进位信号,我们称之为组内信号
    • 而此时提前生成的是SN74181之间的进位信号 ,称为组间信号
    • 我们称此时实现的逻辑电路为成组先行进位(Block Carry Look Ahead,BCLA)链 SN74182就是一个BCLA部件。
  • 注意和SN74181的含义并不对称
  • 等等我就不画图了,基本思路知道就好,按理可以无限的并行下去,但问题是
    • 1)我们不一定需要那么多位的运算
    • 2)虽然是模块化 设计但避免不了复杂度的提高,不过这种越往上并行所需要的部件就越少,就部件数量来说并不会增加很多。

浮点数运算

  • 这个就很简单

加减

  • 按部就班的来,不过我想你也应该有思路
    • 1、对阶:使两个操作数 阶码相同
    • 2、尾数求和:对尾数进行加减运算
    • 3、规格化:规格化运算的结果
    • 4、舍入:为保证精度,考虑尾数右移的时候丢失的数值是否需要舍入(相当于十进制下的四舍五入)
    • 5、溢出判断:上溢下溢还是没溢出
  • 列举一下舍入的策略
    • 截断法:直接舍弃丢失的数值
    • 0舍1入法:丢失0就直接丢弃,丢失1就置最低位为1(对原码所言)。补码下自然应是“1舍0入”了)
    • 恒置1法:也叫“冯·诺依曼舍入法”,无论丢失0或1,永远置最低位为1。简单但是误差大
    • 查表舍入法:用ROM存一张表,以尾数的最低K位和丢失的最高位作为地址,查找出的数值来代替尾数的最低K位。提前设计好。由于读取ROM要比直接进行加法快,所以速度快。但又增加了硬件。

乘除

  • 自己想象怎么算。嗯,很简单吧。
    • 1、阶码相加、减
    • 2、尾数相乘、除
    • 3、规格化
    • 4、舍入处理
    • 5、溢出判断

http://chatgpt.dhexx.cn/article/lrAdGe7o.shtml

相关文章

云平台常见风险

0x00 前言 云技术&#xff08;Cloud technology&#xff09;基于云计算商业模式应用的网络技术、信息技术、整合技术、管理平台技术、应用技术等的总称&#xff0c;可以组成资源池&#xff0c;按需所用&#xff0c;灵活便利。云计算技术将变成重要支撑。技术网络系统的后台服务…

OneNET云平台设备数据管理工具

联系电话&#xff1a;15712339322 1 产品介绍 终端设备上报数据到OneNET云平台&#xff0c;除了云平台可以提供的可视化web页面外&#xff0c;还可以通过定制数据管理工具的方式对云数据进行展示。在该版本中提供对最细粒度的数据样本展示。基于最细粒度的基础上&#xff0c;…

混合云平台打破数据壁垒

导读数字经济时代&#xff0c;作为塑造企业未来竞争力的关键&#xff0c;数据的价值正受到越来越多企业的关注。与传统生产要素相比&#xff0c;数据作为新型生产要素&#xff0c;具有更强的可复制性、更易共享、且可无限增长和供给&#xff0c;使突破有限自然资源供给对经济增…

云平台包含的基本特征介绍

1&#xff09;按需自助服务。消费者无需同服务提供商交互就可以自动地得到自助的计算资源能力&#xff0c;如服务器的时间、网络存储等&#xff08;资源的自助服务&#xff09;。 2&#xff09;无所不在的网络访问。借助于不同的客户端来通过标准的应用对网络访问的可用能力。…

新大陆云平台使用笔记

云平台API使用 1.登陆 1.1 登陆调用api 1.2返回JSON值2.查询单个项目 2.1 api 2.2查询单个项目返回JSON值 3.模糊查询项目 3.1 模糊查询项目api 3.2 模糊查询返回JSON 4.查询项目所有设备的传感器 4.1查询所有设备的传感器api 4.2查询项目所有设备的传感器返回JSON 5.批量查询…

初试阿里云平台

-----初试阿里云平台------ 目录 -----初试阿里云平台------ 一、什么是阿里云平台与阿里云Serverless技术 二、日常部署 三、个人心得 一、什么是阿里云平台与阿里云Serverless技术 云开发平台是面向开发者打造的一站式、全云端的开发平台&#xff0c;打开浏览器就可以开发…

使用ESP8266数据上onenet云平台

大家好&#xff0c;今天给大家带来的是使用esp8266将单片机的数据上传至onenet云平台。首先说说&#xff0c;为什么要上云呢&#xff1f;将数据上传至云平台可以更好的观察到数据的变化&#xff0c;也可以通过云平台命令下发从而更方便管理。当然我们也可以使用安卓、微信小程序…

搭建云平台(一) 云平台基础服务部署

最近因课程要求&#xff0c;自己动手搭了一个OpenStack云平台&#xff0c;我将整个过程分了六篇博客。我使用了两个CentOS的虚拟机&#xff0c;一个作为计算节点&#xff0c;一个作为控制节点&#xff0c;整体过程比较繁杂&#xff0c;有心人可以细心看一看 1、修改各主机名&a…

电力运维云平台

快控电力运维云平台通过对变电站/配电室/光伏电站/储能电站等各类电力能源现场加装智能数据采集通讯网关&#xff0c;将现场各类电气设备的运行数据和状态实时传输到云平台&#xff0c;实现对现场的24小时实时在线监控诊断&#xff0c;有效的保障了电力供应的安全可靠。同时平台…

什么是云平台,云平台主要能干什么?

各大厂商解释不一&#xff0c;云计算的书里写的更是云里雾里&#xff0c;但是如果你实际用过现在各大云平台提供商所提供的云计算平台以后&#xff0c;你就可以明白的得出结论&#xff0c;云平台就是高级版本的虚拟主机。 云平台可比虚拟主机高级多了&#xff0c;怎么会是虚拟…

免费大数据分析云平台有哪些

昨天&#xff08;5月28号&#xff09;由社科文献出版社初版的《大数据蓝皮书&#xff1a;中国大数据发展报告No.2》正式发布了。以“数化万物 智在融合”为主题的中国国际大数据产业博览会也京举行中。基本可以预见&#xff0c;在接下来的一段时期内关于大数据应用开发又将进入…

从用户真实需求出发,星环数据云平台 TDC 2.5 版本发布

2021 年是数字化转型关键的一年&#xff0c;据工信部消息显示&#xff0c;截止 2020 年&#xff0c;全国制造业数字化普及率为 69.8%&#xff0c;趋势一片向好。与此同时&#xff0c;埃森哲&#xff08;Accenture&#xff09;的一份研究报告显示&#xff0c;80%的中国企业正在进…

【案例】基于星环科技数据云平台TDC为富国基金建设万能的数据湖

星环科技作为企业级大数据基础软件开发商&#xff0c;通过发挥基础软件硬实力已经成功助力金融、政府、能源、交通、制造业等多个行业的客户实现了数字化转型&#xff0c;积累了丰富的成功经验。【行业案例】旨在定期分享星环科技最新案例成果&#xff0c;为各行各业企业数字化…

【观察】星环科技重构数据云平台,持续释放数据红利和价值

申耀的科技观察 读懂科技&#xff0c;赢取未来&#xff01; 众所周知&#xff0c;如今的世界正在以加速度进入到智能时代&#xff0c;特别是随着各项业务的云化深入以及万物互联&#xff0c;数据处理能力的进一步提升&#xff0c;智能算法一次又一次的突破&#xff0c;以及云计…

基于MQTT的工业物联网数据云平台

-快速开发工业4.0和物联网应用系统的MQTT数据云平台 【应用背景】 伴随世界范围内“工业4.0”革命及“再工业化”战略的兴起&#xff0c;结合“中国制造2025”及“两化融合”战略&#xff0c;新一代信息技术与制造业深度融合&#xff0c;正在引发影响深远的产业变革&#xff…

云平台知识简介

一. 云平台定义 “云是将服务器虚拟化&#xff0c;形成虚拟资源池&#xff0c;相比于以前的物理机更加节省资源成本&#xff0c;便于管理。云是计算、存储、网路资源池化的概念。我们每天使用的搜索引擎、邮箱、网盘&#xff0c;就是很标准的云&#xff0c;而这大多都是免费的…

自然环境资源数据集分享——资源环境数据云平台

由于工作需要&#xff0c;最近我在搜集自然环境下的公开文字图片数据集。在网页搜索时&#xff0c;偶然发现一个关于资源环境方向的数据平台&#xff0c;也就是今天要说的资源环境数据云平台。平台是由中国科学院地理科学与资源研究所和中国科学院资源环境科学数据中心一起运营…

新一代云数据平台架构演进之路

导读 本文是由浙江数新网络有限公司为我们带来的《新一代云数据平台架构演进之路》的技术分享。 本次分享分为四个部分&#xff1a; 1. 大数据发展回顾 2. 云数据平台演进趋势 3. 云数据平台技术架构 4. 云数据平台实践案例 分享嘉宾&#xff5c;原攀峰 数新网络 CTO 编辑整理&…

聊聊云原生数据平台

本文作者&#xff1a;字节&#xff0c;观远数据首席科学家。主导多个AI项目在世界500强的应用落地&#xff0c;多次斩获智能零售方向Hackathon冠军。曾就职于微策略&#xff0c;阿里云&#xff0c;拥有十多年的行业经验。 在之前的文章中&#xff0c;我们介绍过云原生机器学习平…

第四代数据平台技术:数据云平台

当前社会已经进入一个企业数据高速膨胀的时代&#xff0c;近几年&#xff0c;每年全球的数据规模平均以40%的速度增长。在云计算、大数据技术并驾齐驱发展几年后&#xff0c;两个技术逐渐融合&#xff0c;数据平台的技术在云计算的助力下&#xff0c;能够支持更复杂的业务发展需…