重温全球第一颗FPGA的颠覆性设计
2020-09-17
来源:半导体行业观察
现场可编程门阵列(FPGA)可以实现任意数字逻辑:从微处理器到视频生成器或加密矿机,一应俱全。FPGA由许多逻辑模块组成,每个逻辑模块通常由触发器和逻辑功能以及连接逻辑模块的路由网络组成。FPGA的特殊之处在于它是可编程的硬件:您可以重新定义每个逻辑块及其之间的连接。这样的话,您就可以构建复杂的数字电路,而无需物理上连接各个门和触发器,也无需花费设计定制集成电路的费用。
FPGA是由Ross Freeman 发明的, 他于1984年共同创立了Xilinx ,并推出了首款FPGA XC2064。该FPGA比现代FPGA简单得多。它仅包含64个逻辑模块,而现代FPGA则为数千或数百万个逻辑模块,但它却是目前价值数十亿美元的FPGA行业的鼻祖。由于其重要性,XC2064位列芯片名人堂。我对Xilinx的XC2064进行了反向工程,并在此博客文章中解释了其内部电路以及“位流”(bitstream)如何对其进行编程。
如今,FPGA是用诸如Verilog或VHDL之类的硬件描述语言编程的,但是那时Xilinx提供了他们自己的开发软件,一个名为XACT的MS-DOS应用,该软件价格高达12,000美元。XACT的运行水平低于现代工具:用户定义每个逻辑块的功能(如下面的屏幕快照所示)以及逻辑块之间的连接。XACT对连接进行了路由,并生成了可以加载到FPGA中的比特流文件。
通过比特流(具有专有格式的比特序列)配置FPGA。如果您查看XC2064的比特流(如下所示),那是令人费解的混合模式,这些模式不规则地重复,并散布在比特流中。XACT中的函数定义与位流中的数据之间没有明确的联系。但是,研究FPGA的物理电路可以揭示比特流数据的结构,并且可以理解。
FPGA如何工作?
下图来自原始的FPGA专利,显示了FPGA的基本结构。在这个简化的FPGA中,有9个逻辑块(蓝色)和12个I / O引脚。互连网络将组件连接在一起。通过在互连上设置开关(对角线),逻辑块相互连接,并与I / O引脚连接。每个逻辑元件都可以使用所需的逻辑功能进行编程。结果是一个高度可编程的芯片,可以实现适用于可用电路的任何东西。
CLB:可配置逻辑块
上图显示了九个可配置逻辑块(Configurable Logic Block:CLB),而XC2064具有64个CLB。下图显示了每个CLB的结构。每个CLB具有四个输入(A,B,C,D)和两个输出(X和Y)。介于两者之间的是组合逻辑,可以使用任何所需的逻辑功能进行编程。CLB还包含一个触发器,允许FPGA实现计数器,移位寄存器,状态机和其他有状态电路。梯形是多路复用器,可以将其编程为通过其任何输入。多路复用器允许为特定任务配置CLB,为触发器控制和输出选择所需的信号。
您可能想知道组合逻辑如何实现任意逻辑功能,是否跟芯片一样在“与”门,“或”门,“异或”门等集合之间进行选择?不,他们其实是使用了一个称为查找表(LUT)的巧妙技巧,实际上是为函数保留了真值表。例如,三个变量的函数由其真值表中的8行定义。LUT由8位存储器以及用于选择正确值的多路复用器电路组成。通过将值存储在存储器的这8位中,可以实现任何3输入逻辑功能。
互连
FPGA的第二个关键部分是互连,可以对其进行编程以不同方式连接CLB。互连相当复杂,但是粗略的描述是每个CLB之间有几个水平和垂直线段。CLB互连点允许在水平线和垂直线之间建立连接,从而可以创建任意路径。更复杂的连接通过“交换矩阵”(switch matrices)完成。每个开关矩阵都有8个引脚,可以(几乎)任意方式将它们连接在一起。
下图显示了XC2064的互连结构,提供了到逻辑块(青色)和I / O引脚(黄色)的连接。该图显示了路由功能的特写。绿色框是8针开关矩阵,而小方块是可编程的互连点。
XC2064 FPGA具有一个8 x 8的CLB网格。每个CLB都有从AA到HH的字母名称。
互连可以将例如块DC的输出连接到块DE的输入,如下所示。红线表示路由路径,红色小方块表示已激活的路由点。离开模块DC后,信号由第一个路由点定向到8针开关(绿色),该信号将其引导到另外两个路由点和另一个8针开关。(未显示未使用的垂直和水平路径。)请注意,布线相当复杂;即使是这条短路径,也使用了四个路由点和两个开关。
下面的照片显示了XACT程序中的路由外观。黄线表示逻辑块之间的路由。随着添加更多的信号,挑战在于如何有效地路由而不使路径发生冲突。XACT软件包执行自动路由,但是也可以手动编辑路由。
实施
这篇文章的其余部分讨论了XC2064的内部电路,这些照片是根据照片进行反向工程的。
下图显示了XC2064芯片的布局。FPGA的主要部分是8×8的网格。每个图块包含一个逻辑块和相邻的路由电路。尽管FPGA图将逻辑块(CLB)显示为与围绕它们的路由不同的实体,但这并不是FPGA的实现方式。取而代之的是,每个逻辑块和相邻路由都实现为单个实体,即图块。(具体来说,图块包括每个CLB上方和左侧的路由。)
I / O模块围绕集成电路的边缘提供与外界的通信。它们连接到小的绿色方形焊盘,该焊盘连接到芯片的外部引脚。die被缓冲区(绿色)划分:两个垂直和两个水平。这些缓冲器可放大在电路中传播很长距离的信号,从而减少延迟。垂直移位寄存器(粉红色)和水平列选择电路(蓝色)用于将位流加载到芯片中,如下所述。
内部探索
下图显示了XC2064中单个图块的布局;芯片包含上述封装在一起的这些图块中的64个。每个图块约有40%被保持配置位的存储单元(绿色)占用。顶部三分之一(大约)通过两个 switch matrices和大量单独的routing switches处理互连路由。在其下方是逻辑块。逻辑块的关键部分是输入,触发器和查找表(LUT)的多路复用器。每个块通过垂直和水平布线连接到相邻的块,以实现互连,电源和接地。配置数据位被水平地馈送到存储单元,而垂直信号选择要加载的存储单元的特定列。
晶体管
FPGA由CMOS逻辑实现,该逻辑由NMOS和PMOS晶体管构建。晶体管在FPGA中具有两个主要作用。首先,可以将它们组合以形成逻辑门。其次,晶体管被用作信号通过的开关,例如以控制路由。在此作用下,该晶体管称为传输晶体管。
下图显示了MOS晶体管的基本结构。硅的两个区域掺杂有杂质以形成源极和漏极区域。在两者之间,栅极打开或关闭晶体管,控制源极和漏极之间的电流。栅极由一种称为多晶硅的特殊类型的硅制成,并通过一层薄的绝缘氧化物层与下面的硅隔开。在此之上,两层金属提供了连接电路的布线。
下面的die照片特写显示了在显微镜下晶体管的外观。多晶硅栅极是两个掺杂硅区域之间的蛇形线。圆圈是通孔,是硅和金属层之间的连接(此照片已将其删除)。
比特流和配置存储器
XC2064中的配置信息存储在配置存储单元中。FPGA的内存不是使用RAM块进行存储,而是以160×71的网格分布在整个芯片上,从而确保每个位都与其控制的电路相邻。
下图显示了如何将配置比特流加载到FPGA中。比特流被送入移位寄存器,该移位寄存器沿芯片中心(粉红色)向下移动。一旦将71位加载到移位寄存器中,列选择电路(蓝色)就会选择一个特定的存储器列,并将这些位并行加载到该列中。然后,接下来的71位被加载到移位寄存器中,并且左侧的下一列成为所选列。对FPGA的所有160列重复此过程,将整个位流加载到芯片中。
重要的一点是,比特流的分布与文件中的分布完全相同:比特流文件中的比特布局与芯片上的物理布局匹配。如下所示,每个位都存储在FPGA控制电路的旁边。因此,比特流文件格式直接由硬件电路的布局确定。
例如,当由于缓冲电路而在FPGA切片之间存在间隙时,相同的间隙会出现在位流中。比特流的内容不是围绕字段,数据表或配置块之类的软件概念来设计的。了解比特流取决于从硬件角度而非软件角度进行思考。
如下所示实现配置存储器的每一位。每个存储单元均包含两个以环路连接的反相器。该电路具有两个稳定状态,因此可以存储一个位:顶部反相器为1,底部反相器为0,反之亦然。为了写入该单元,左侧的传输晶体管被激活,使数据信号通过。数据线上的信号只会使逆变器过载,从而写入所需的位。(您也可以使用相同的路径从FPGA中读取配置数据。)Q和反相Q输出控制FPGA中所需的功能,例如关闭路由连接,为查找表提供位或控制输出。人字拖。(在大多数情况下,仅使用Q输出。)
下图显示了存储单元的物理布局。左图显示了八个存储单元,其中一个单元高亮显示。每条水平数据线馈入该行中的所有存储单元。每列选择行选择该列中的所有存储单元以进行写入。中间照片放大了一个存储单元的硅和多晶硅晶体管。
去除金属层以暴露下面的晶体管。金属层将晶体管连接在一起。圆圈是硅或多晶硅与金属之间的连接(通孔)。该示意图显示了五个晶体管的连接方式。原理图的物理布局与照片匹配。两对晶体管构成两个CMOS反相器,而左下方的传输晶体管提供对单元的访问。
查找表多路复用器
如前所述,FPGA通过使用查找表来实现任意逻辑功能。下图显示了如何在XC2064中实现查找表。左侧的八个值存储在八个存储单元中。四个多路复用器根据A 输入值选择每对值中的一个 。如果 A 为0,则选择最高值;如果 A为1,则选择最低值。接下来,较大的多路复用器根据B 和 选择四个值之一 C。在这种情况下,结果是所需的值 A XOR B XOR C。通过在查找表中放置不同的值,可以根据需要更改逻辑功能。
每个多路复用器均通过传输晶体管实现。根据控制信号,通过晶体管之一被激活,将该输入传递到输出。下图显示了LUT电路的一部分,对两个位进行了多路复用。右边是两个存储单元。每个位通过一个反相器放大,然后通过中间的多路复用器的传输晶体管,选择其中一位。
每个CLB包含一个触发器,允许FPGA实现锁存器,状态机和其他有状态电路。下图显示了触发器的(略有不同)实现。它使用主要/辅助设计。当时钟为低电平时,第一个多路复用器让数据进入主锁存器。当时钟变高时,多路复用器关闭第一个锁存器的环路,并保持该值。(该位通过“或”门,“与非”门和反相器两次反转,因此保持不变。)
同时,当时钟变高时,辅助锁存器的多路复用器从第一个锁存器接收该位(请注意,时钟已反转)。该值成为触发器的输出。当时钟变低时,次级的多路复用器关闭环路,从而锁存该位。因此,触发器是边缘敏感的,在时钟的上升沿锁存该值。置位和复位线强制触发器为高电平或低电平。
8针开关矩阵
交换矩阵是重要的路由元素。每个开关有八个“引脚”(每侧两个),可以将几乎任何引脚组合连接在一起。与单个路由节点相比,这使信号可以更灵活地转向,拆分或交叉。下图显示了四个CLB(青色)之间的路由网络的一部分。开关矩阵(绿色)可以与右侧连接的任意组合连接。
请注意,每个引脚可以连接到其他7个引脚中的5个。例如,针脚1可以连接到针脚3,但不能连接到针脚2或4。这使矩阵几乎变成了交叉开关,具有20个电位连接,而不是28个。
开关矩阵由一排传输晶体管实现,该传输晶体管由上方和下方的存储单元控制。晶体管的两侧是可以通过该晶体管连接的两个开关矩阵引脚。因此,每个开关矩阵具有20个相关联的控制位。
每个图块两个矩阵产生每个图块40个控制位的矩阵。下图显示了其中一个存储单元,该存储单元连接到下面的传输晶体管的长弯曲栅极。该晶体管控制引脚5和引脚1之间的连接。
因此,与该存储单元相对应的位流中的位控制引脚5和引脚1之间的开关连接。同样,其他存储单元及其相关晶体管控制其他开关连接。请注意,这些连接的顺序不遵循特定的模式。因此,位流位和开关引脚之间的映射是随机的。
输入路由
CLB的输入在位流中使用不同的编码方案,这由硬件实现方式解释。在下图中,八个圆圈的节点是CLB框DD的潜在输入。最多只能将一个节点配置为输入,因为将两个信号连接到同一输入将使它们短路。
使用多路复用器选择所需的输入。一个简单的解决方案是使用8路多路复用器,其中3个控制位选择8个信号之一。另一个简单的解决方案是使用8个通过晶体管,每个晶体管都有自己的控制信号,其中一个选择所需的信号。但是,FPGA使用一种混合方法,该方法避免了第一种方法的解码硬件,但使用了5个控制信号,而不是第二种方法所需的8个控制信号。
上面的示意图显示了FPGA中使用的两级多路复用器方法。在第一阶段,控制信号之一被激活。第二阶段从顶部或底部选择信号作为输出。例如,假设控制信号 B/F 发送到第一级,“ ABCD”发送到第二级;输入B是唯一将传递到输出的B。因此,选择八个输入之一需要在比特流中使用5位,并使用5个存储单元。
结论
XC2064使用各种高度优化的电路来实现其逻辑块和路由。该电路需要紧凑的布局,以适合芯片。即使这样,XC2064还是一个非常大的芯片,比当时的微处理器还大,因此一开始很难制造,而且要花费数百美元。与现代FPGA相比,XC2064的单元数量非常少,但是即使如此,它也引发了革命性的新产品线。
了解XC2064比特流的关键是两个概念。首先,FPGA由64个块组成,这些块是将逻辑块和路由结合在一起的重复块。尽管FPGA被描述为具有被路由包围的逻辑块,但这并不是实现它们的方式。
第二个概念是,比特流中没有抽象。它直接映射到FPGA的二维布局。因此,只有考虑FPGA的物理布局,比特流才有意义。