浮点数对于科学编程非常有用,但微处理器只直接支持整数。1虽然早在20世纪50年代和60年代,浮点在大型机中就很常见,但直到1980年,英特尔才为微型计算机引入了8087浮点协处理器。2将此芯片添加到IBMPC等微型计算机上,浮点运算的速度最高可达100倍,这对AutoCAD、电子表格或飞行模拟器等应用程序来说是一个巨大的好处。3缺点是8087芯片的价格高达数百美元。4.。
实现浮点运算很困难,所以它们的计算速度很快、很准确。溢出、舍入、超越运算和大量边缘情况都可能会出现问题。在8087之前,每个制造商都有自己不兼容的浮点临时实现。然而,英特尔聘请了数值分析专家威廉·卡汉(William Kahan)根据严格的原则设计精确的浮点。5结果是8087的浮点体系结构。这成为几乎所有现代计算机使用的IEEE754标准,所以我认为8087是有史以来设计的最有影响力的芯片之一。
Intel8087浮点单元芯片的裸片,标有主要功能块。模具尺寸为5 mm×6 mm。变速箱的轮廓用红色标出。单击查看大图。
为了探索8087是如何工作的,我打开了一块8087芯片,用显微镜拍摄了硅晶片的照片。8087包含40,000个晶体管,将芯片制造推向了极限;相比之下,与之配套的8086微处理器只有29,000个晶体管。为了使芯片成为可能,英特尔开发了新技术。在这篇文章中,我重点介绍了高速二进制移位器(上面的红色轮廓)。移位器占据了芯片面积的很大一部分,所以最小化它的面积对于制造高速二进制移位器是至关重要的。在这篇文章中,我重点介绍了高速二进制移位器(上面的红色轮廓)。移位器占据了芯片面积的很大一部分,所以最小化它的面积对于制造高速二进制移位器至关重要。
浮点数由分数(也称为有效数或尾数)、指数和符号位组成。(这些以二进制表示,但对于以10为基数的类比,数字6.02×10 23的分数为6.02,指数为23。)处理分数的电路位于芯片照片的底部。从左到右,分数电路由常量ROM、移位器(高亮显示)、加法器/减法器和寄存器堆栈组成。在其上方,微码引擎和ROM控制芯片。
移位器的作用是向左或向右移位二进制数,这是一项在浮点运算中具有几个关键作用的任务。当两个浮点数相加或相减时,必须将数字移位以使二进制点对齐。(二进制点类似于小数点,但对于二进制数。)8087的先验指令是围绕移位和加法运算构建的,使用一种称为CORDIC的算法。移位器还用于从16位块汇编浮点数。8个。
由于移位对性能如此重要,8087使用桶形移位器,它可以在单个步骤中将一个数字移位任意位数。6英特尔采用两级移位器设计,在保持其大小可控的同时仍提供高性能。第一级将值移位0至7位,而第二级将值移位0至7字节。两级合计可将值移位0至63位。
我将首先描述位移位器,它执行0到7位位置的移位。下图概述了位移位器的结构,显示了5个输入和输出;全移位器支持68位。其概念是通过激活特定的列,输入移位所需的量,每个圆圈表示一个晶体管,它可以充当输入线和输出线之间的开关。例如,图中显示了移位选择线3被激活,打开相关联的晶体管(绿色)。高亮显示的输入20(橙色)指向输出23(蓝色)。类似地,其他输入连接到相应的输出,产生移位3。通过激活不同的移位选择线,输入将在0和7位之间移位不同的量。例如,通过激活不同的移位选择线,输入将在0和7位之间被移位不同的量。例如,通过激活不同的移位选择线,输入将在0和7位之间被移位不同的量。例如,被高亮显示的输入20(橙色)被引导到输出23(蓝色)。通过激活不同的移位选择线,输入将被移位0和7位之间的不同的量
位移位器的结构。通过激励移位选择线,输入连接到具有所需位移位的输出。
为了解释移位器的内部结构,我将从描述8087芯片中使用的NMOS晶体管开始。晶体管是通过在硅衬底上掺杂杂质区域来创建具有不同电气特性的扩散区域来构建的。晶体管可以被认为是一个开关,控制源极和漏极两个区域之间的电流流动。晶体管由栅极激活,栅极由一种名为多晶硅的特殊类型的硅构成,位于衬底硅的上方。向栅极施加电压使电流在源极和漏极之间流动,否则电流就会被阻塞。晶体管由顶部的金属层布线连接在一起,形成一个复杂的集成电路。
下面的照片显示了8087中的一个晶体管,如显微镜下所示。它的结构与上图相符,尽管它的形状更复杂。源极、栅极和漏极都在照片之外继续,连接到其他晶体管。此外,金属层中的布线通过圆形通孔连接到硅上。(在这张照片中,金属层用酸去除了。)。
缩小后,下图显示了芯片上实现的移位器的一部分。这张照片中约有48个晶体管,与上图类似。橙色和黄色的对角线对应于其中一个输入:橙色区域显示通过硅连接的晶体管,而黄色线条显示金属层中的连接。(金属层用于跳过多晶硅选择线。)绿色突出显示的是移位3的多晶硅线。在中心,这条多晶硅栅极线接通晶体管,连接多晶硅选择线。将高亮显示的输入移位三个位置。(其他非高亮显示的输入也进行类似的移位。)因此,此电路实现了本节开头描述的移位器。照片显示了68个输入中的6个,因此完整的移位器要高得多。
位移位器的硅电路特写。如图所示,一个信号的路径由移位三控制(绿色)控制。
字节移位器将其输入移位8位的倍数,而不是1位。它的设计类似于位移位器,不同之处在于每一个输入连接到每八个输出。例如,输入20连接到输出20、28、36,依此类推,按字节移位。因此,对角线连接陡峭且紧密排列,每台交换机之间有8条线路。在下图中,选择了四次移位的线路,并突出显示了从输入0到输出32的连接。请注意,图的右半部分缺少导线,因为从输入0以外移位的任何位都会变为零。例如,当向左移位4字节时,低位31及以下变为零。
下面的芯片照片显示了位移位器和字节移位器的一部分。这张照片被缩小以显示整体结构;单个晶体管几乎看不见。位移位器的区域密密麻麻地堆满了晶体管,但是字节移位器主要由布线组成,中间有几列晶体管。9还要注意,字节移位器的顶部部分是空的,向底部填充了更多的布线。布线布局不像上图中那样有序,但其布置是为了获得最高效率。
到目前为止,位移位器和字节移位器只在一个方向上移位。然而,位需要双向移位。8087移位器的关键创新之一是它的双向设计:数据可以反向通过移位器来进行相反方向的位移位。这是可能的,因为移位器是由通过晶体管而不是逻辑门构成的。传递晶体管逻辑将晶体管用作传递或阻止信号的开关,因此信号可以在任一方向上传播。(相反,常规逻辑门,如NOR门,具有特定的输入和输出。)
移位器左侧和右侧的特殊驱动电路允许移位器双向操作。为了从左到右发送数据,左侧驱动器从分数总线读取数据并将其发送到移位器。右侧驱动器电路接收移位后的数据,将其临时锁存,然后将其写回分数总线。为了反向发送数据,驱动器电路颠倒角色:右侧驱动器将数据从分数总线发送到移位器,而左侧电路接收移位后的数据。10个。
我将描述的最后一个特征是控制移位器的电路。有三个不同的来源控制要移位的位置。首先,微码引擎可以直接指定数字。第二,数字可以来自循环计数器;这是CORDIC先验算法的一部分。最后,数字可以来自前导零计数器;这允许通过移位消除前导零来归一化数字。这些来源中的每一个都提供6位移位数字;6个多路复用器。12个。
接下来,解码器激活八条位移位线中的一条和八条字节移位线中的一条,以控制移位器中的适当通过晶体管。(每个解码器接受3位输入并激活8条输出线中的一条。)因为每条解码器线控制移位器中的一大列通过晶体管,所以解码器使用相对较大的功率晶体管。13在底部,16条控制线退出电路。
8087是一款功能丰富的复杂芯片。然而,通过仔细检查芯片,可以理解8087的电路。这篇博客文章描述了8087的快速桶形移位器,一次最多能移位63位。14英特尔获得了这种创新的可编程双向移位器的专利。
移位器只是使8087计算浮点运算的速度比8086处理器快得多的功能之一。8087一次操作80位,而不是16位。8087有80位宽的寄存器,减少了计算期间的内存访问。8087将超越操作的常量存储在ROM中,也避免了内存访问。8087中的硬件检查NaN、下溢、上溢等,避免代码中的缓慢检查。8087的硬件使多个。我不知道这些因素的相对贡献,但它们结合在一起,极大地提高了浮点性能,最高可达100倍。
浮点硬件的好处如此之大,以至于英特尔从1989年的80486开始将浮点单元集成到处理器中,现在大多数处理器都包括浮点单元,购买单独的浮点协处理器的费用已经成为过去。
去除金属层的8087模具照片。颜色是由于剩余的一些氧化层造成的。单击查看大图。
有关8087的更多信息,请参阅我的其他文章:从8087中提取ROM常量、每晶体管2位ROM和衬底偏置生成器。我在Twitter上发布了我最新的博客文章,请关注me@kensheriff以阅读后续文章。我还有一个RSS订阅源。
即使没有浮点硬件,早期的微型计算机也可以执行浮点运算。这些运算会被分解成许多整数运算,根据需要处理指数和分数。换句话说,浮点支持并没有使浮点运算成为可能,它只是使浮点运算变得更快。(另一种表示非整数的方式是定点数,它在小数之后有固定的位数。定点数比浮点数简单,但不能表示大范围的浮点数。
8087不是第一个浮点芯片。美国国家半导体公司在1977年引入了MM57109数字计算器单元(也就是真名)。它本质上是一个重新打包的12位科学计算器芯片,对二进制编码的十进制值进行运算,数值以反向波兰语表示。这个芯片速度慢得离谱;例如,正切可以代替一秒。AMD在1978年推出了他们的浮点芯片AM9511(详细说明)。这款芯片支持32位浮点数,正切最多需要1.4毫秒。(英特尔最终从AMD获得AM9511的授权,并将其作为8231出售。)相比之下,10-MHz8087可以在54微秒内实现正切,运算在80位浮点数上。因此,8087';
最初的IBM PC(1981)在其主板上有一个空插槽,用于添加8087协处理器。这对AutoCAD等应用程序是一个巨大的好处。大的空插槽在8088微处理器上方的左上角可见。支持8087的应用程序列表在此。
我找不到8087的原价,但它很贵。起初,由于8087的时序不稳定,英特尔只出售8087与8088的配对和测试。到1982年,英特尔将8087的价格降至230美元,相当于当前美元约500美元。与如今的开源世界相比,客户还要支付软件支持费用似乎很奇怪:使用带有BASIC语言的8087还要多花150美元,而英特尔的8087开发库是1,250美元。--↩。
8087的设计者评论了卡汉教授提供的指导:我们没有做得像他想要的那样好,但我们做得比他预期的要好。卡汉后来因为他在浮点方面的工作而获得了图灵奖。-↩。
处理器通常包括各种移位指令,包括将位从字的一端移位到另一端的旋转操作.8087只执行直接移位,不执行旋转.-↩。
移位器处理8087';的64位小数,还有三个额外的位用于舍入精度,因此它支持67位。除非我算错了,否则移位器在最重要的位置还有一个额外的位,使它变得68位宽。-↩。
乘法和除法大量使用移位;乘法使用移位和加法,而除法使用移位和减法。但是,8087不使用通用移位器进行这些操作,而是有专门的移位器为这些操作进行优化。-↩
为了尽可能紧密地包装布线,移位器交替使用扩散硅导线和多晶硅导线。在下面的照片中,扩散硅线是粉红色的,而多晶硅是黄色的。8087是用英特尔的HMOS III工艺制造的,多晶硅需要4µm的间距和5µm的扩散间距,这可能是因为光刻实践的分辨率。但是,扩散线和多晶硅线之间的间距可以是。
字节移位器中的布线由交替的紧密堆积的硅线和多晶硅线组成。两边的大矩形是由垂直多晶硅线控制的晶体管对。
驱动器电路有一些微妙之处。不是直接将数据发送到移位器,而是分两步传输比特。首先,移位器线路预充电到高电平。换言之,移位器线路是低有效的,低电压代表1。由于任何未使用的输出保持其高电压(0位),0位被自动移位到低位位置。我认为预充电技术对于NMOS电路也是更好的匹配,其更好地将信号拉低而不是拉高,因此对线路进行预充电有助于提高性能。我认为预充电技术对于NMOS电路来说也是更好的匹配,NMOS电路在拉低信号方面比拉高信号更好,所以预充电有助于提高性能。我认为预充电技术对于NMOS电路来说也是更好的匹配,NMOS电路在拉低信号方面比拉高信号更好,所以预充电线路有助于性能,特别是考虑到移位器和分数总线之间的相对较高的容量。移位器和分数总线之间的锁存器防止了不需要的循环,移位的数据立即回流到移位器并被重新移位。-↩。
此脚注将阐明物理移位与逻辑移位的区别。在芯片上,小数电路的最高有效位位于底部。通过移位器从左到右将数据物理下移。这相当于二进制数的左移,将位移到更高的位置。在相反的方向上,通过移位器的数据从右到左执行数据的右移。↩。
左/右方向也需要从三个移位源中选择一个,但我还没有找到用于该移位源的电路。-↩。
每个译码器本质上由八个或非门组成:七个门将被拉低,只有所有输入为低的门才是高的。但是,它并不是作为一个简单的逻辑门来实现的。相反,所有输出都预充电为高电平,然后将七个不需要的输出拉低。这种动态预充电逻辑仍在现代电路中使用;请参阅同步预充电逻辑一书。多路复用器也是用预充电逻辑实现的。-↩。
直到1985年的80386,英特尔的x86处理器才包括桶式移位器,它提供了64位桶式移位器。在此之前,8086及其后代每次移位一位,因此许多位位置的移位速度要慢得多。--↩