现场可编程门阵列(FPGA)可以实现任意的数字逻辑,从微处理器到视频发生器或密码矿。FPGA由许多逻辑块组成,每个逻辑块通常由一个触发器和一个逻辑功能以及连接这些逻辑块的路由网络组成。FPGA的特别之处在于它是可编程硬件:您可以重新定义每个逻辑块和它们之间的连接。其结果是您可以构建一个复杂的数字电路,而不需要物理地布线各个门和触发器,也不需要花费设计费用。FPGA的特殊之处在于它是可编程的硬件:您可以重新定义每个逻辑块和它们之间的连接。结果是,您可以构建一个复杂的数字电路,而不需要物理地布线各个门和触发器,也不需要花费设计费用。
芯片照片特写,显示了XC2064 FPGA中64块之一的电路。金属层被移除,暴露出下面的硅和多晶硅晶体管。单击查看大图。来自siliconpronn。
FPGA是由罗斯·弗里曼(Ross Freeman)发明的,他于1984年与人共同创立了Xilinx 2,并推出了第一款FPGA XC2064。3这款FPGA比现代FPGA要简单得多--它只包含64个逻辑模块,而现代FPGA只包含数千或数百万个逻辑模块--但它催生了目前价值数十亿美元的FPGA产业。由于它的重要性,XC2064被列入了芯片名人堂。我对Xilinx的XC2064进行了逆向工程,在这篇博客文章中,我解释了它的内部电路(如上所述)以及比特流是如何对其进行编程的。在这篇博客文章中,我对Xilinx的XC2064进行了反向工程,并在这篇博客文章中解释了它的内部电路(如上所述)以及比特流是如何对其编程的。
如今,FPGA是用Verilog或VHDL等硬件描述语言编程的,但当时Xilinx提供了自己的开发软件,名为XACT的MS-DOS应用程序,标价高达12,000美元。XACT的运行水平低于现代工具:用户定义每个逻辑块的功能,如下面的屏幕截图所示,以及逻辑块之间的连接。XACT路由连接并生成可以加载到FPGA中的位流文件。
XACT的屏幕快照。两个查找表F和G实现了屏幕底部的方程式,上面显示了卡诺图。
FPGA是通过比特流(具有专有格式的比特流)配置的。如果你观察XC2064的比特流(见下文),你会发现它是一种令人费解的混合模式,这些模式不规则地重复着散布在比特流中的序列。XACT中的函数定义和比特流中的数据之间没有明确的联系。但是,研究FPGA的物理电路可以揭示比特流数据的结构,这是可以理解的。
下图来自最初的FPGA专利,显示了FPGA的基本结构。在这个简化的FPGA中,有9个逻辑块(蓝色)和12个I/O引脚。互连网络将元件连接在一起。通过在互连上设置开关(对角线),逻辑块彼此连接并连接到I/O引脚。每个逻辑元件都可以用所需的逻辑功能进行编程。结果是一个高度可编程的芯片,可以实现适用于可用电路的任何东西。
上图显示了9个可配置逻辑块(CLB),而XC2064有64个CLB。下图显示了每个CLB的结构。每个CLB有四个输入(A,B,C,D)和两个输出(X和Y)。中间是组合逻辑,可以用任何所需的逻辑功能编程。CLB还包含一个触发器,允许FPGA实现计数器、移位寄存器、状态机和其他状态电路。梯形是多路复用器,可以编程通过它们的任何输入。多路复用器允许配置CLB
您可能想知道组合逻辑是如何实现任意逻辑函数的。它是否在AND门、OR门、XOR门等的集合中进行选择?不,它使用了一种名为ALLOKUP TABLE(LUT)的巧妙技巧,实际上保存了函数的真值表。例如,一个三变量函数由其真值表中的8行定义。LUT由8位内存组成,还有一个多路复用器电路来选择正确的值。通过将值存储在这8位内存中,4.。
FPGA的第二个关键部分是互连,它可以编程以不同的方式连接CLB。互连相当复杂,但粗略地描述一下,每个CLB之间有几个水平和垂直线段。互连点允许在水平线和垂直线之间建立连接,允许创建任意路径。更复杂的连接是通过开关矩阵完成的。每个开关矩阵有8个引脚,可以(几乎)任意方式连接在一起。
下图显示了XC2064的互连结构,提供到逻辑块(青色)和I/O引脚(黄色)的连接。插图显示了布线功能的特写。绿色的方框是8针开关矩阵,而小方块是可编程的互连点。
XC2064 FPGA具有8x8网格的CLB。每个CLB都有一个从AA到HH的字母名称。
例如,互连可以将DC块的输出连线到DE块的输入端,如下所示。红线表示布线路径,红色小方块表示激活的布线点。离开DC块后,信号由第一个布线点引导到8针开关(绿色),该开关将其引导到另外两个布线点和另一个8针开关。(未显示未使用的垂直和水平路径。)请注意,布线相当复杂;即使这条短路径也使用了四个布线点和两个开关。
下面的屏幕截图显示了XACT程序中的布线。黄线表示逻辑块之间的布线。随着更多信号的添加,挑战是如何在不发生路径冲突的情况下高效布线。XACT软件包执行自动布线,但也可以手动编辑路由。
这篇文章的其余部分将讨论XC2064的内部电路,这是根据芯片照片进行反向工程的。5Be警告说,这假设您对XC2064有一定的了解。
下面的芯片照片显示了XC2064芯片的布局。FPGA的主要部分是8×8的瓦片网格;每个瓦片包含一个逻辑块和相邻的路由电路。尽管FPGA图将逻辑块(CLB)显示为独立于其周围的布线的实体,但这不是FPGA的实现方式。取而代之的是,每个逻辑块和相邻的布线被实现为单个实体,即瓦片。(具体地说,瓦片包括每个CLB上方和左侧的布线。)
在集成电路的边缘,I/O块提供与外部世界的通信。它们连接到小的绿色方形焊盘,这些小的绿色方形焊盘连接到芯片的外部引脚。芯片由缓冲器(绿色)划分:两个垂直的和两个水平的。这些缓冲器放大通过电路的长距离传输的信号,减少延迟。垂直移位寄存器(粉色)和水平列选择电路(蓝色)用于将比特流加载到芯片中,如下所述。
下图显示了XC2064中单个瓦片的布局;芯片包含64个如上所示打包在一起的瓦片。每个瓦片的大约40%被保存配置位的存储单元(绿色)占据。瓦片的顶部三分之一(大致)通过两个交换矩阵和许多单独的路由交换机处理互连路由。逻辑块的关键部分是多路复用器,用于输入、触发器和查找表(LUT)。瓦片通过垂直和水平布线连接到相邻的瓦片,用于互连、电源和接地。配置数据位水平馈入存储单元,而垂直信号选择特定列的存储单元进行加载。
FPGA采用CMOS逻辑实现,由NMOS和PMOS晶体管构成,晶体管在FPGA中有两个主要作用。首先,它们可以组合起来形成逻辑门。其次,晶体管被用作信号通过的开关,例如用来控制路由。在这一作用中,晶体管被称为传递晶体管。下图显示了MOS晶体管的基本结构。硅的两个区域掺入杂质以形成源区和漏区。在这两者之间,栅极开启或关闭晶体管,控制源极和漏极之间的电流流动。栅极由一种名为多晶硅的特殊类型的硅制成,并由一层薄薄的绝缘氧化层与底层硅隔开。在此基础上,两层金属提供了连接电路的布线。
下面的芯片照片特写显示了晶体管在显微镜下的样子。多晶硅栅极是两个掺杂硅区之间的蛇形线。圆圈是硅和金属层之间的通孔(在这张照片中已经去掉了)。
XC2064中的配置信息存储在配置存储单元中,而不是使用RAM块进行存储,FPGA';的存储器以160×71栅格分布在芯片上,确保每一位都紧挨着它控制的电路。下图显示了如何将配置位流加载到FPGA中。位流被馈送到沿芯片中心延伸的移位寄存器(粉红色)。一旦将71位加载到移位寄存器中,列选择电路(蓝色)就选择特定的存储器列,并将位并行加载到该列中。然后,将接下来的71位加载到移位寄存器和。将整个位流加载到芯片中。使用移位寄存器避免了庞大的存储器寻址电路。
如何将比特流加载到FPGA中。所显示的位是概念性的;实际的位存储要密集得多。左侧的三列已经加载,目前正在加载第四列。来自siliconpronn的模具照片。
重要的一点是,位流与它在文件中的显示完全一样地分布在芯片上:位流文件中的位流布局与芯片上的物理布局相匹配。如下所示,每个位都存储在它控制的电路旁边的FPGA中。因此,位流文件的格式直接由硬件电路的布局决定。例如,当由于缓冲电路而在FPGA片之间存在间隙时,在位流中出现相同的间隙。位流的内容不是围绕这样的软件概念来设计的。例如,当FPGA片之间由于缓冲电路而存在间隙时,位流中出现相同的间隙。位流的内容不是围绕这样的软件概念来设计的。例如,当FPGA片之间由于缓冲电路而存在间隙时,位流中出现相同的间隙。位流的内容不是围绕这样的软件概念来设计的。不是在软件方面。7个。
配置内存的每一位实现如下所示。8每个存储单元由环路连接的两个反相器组成。此电路有两个稳定状态,因此它可以存储一个位:上反相器为1,下反之为0,或者反之亦然。写入单元时,左侧的PASS晶体管被激活,使数据信号通过。数据线上的信号简单地对反相器供电,写入所需的位。(您也可以使用相同的路径从FPGA中读取配置数据。)Q和反相Q输出控制FPGA中所需的功能,如关闭。(在大多数情况下,仅使用Q输出。)
数据手册中一位配置内存的原理图。Q是输出,Q是反转输出。
下图显示了存储单元的物理布局。左边的照片显示了8个存储单元,其中一个单元突出显示。每条水平数据线馈送该行中的所有存储单元。每条列选择线选择该列中的所有存储单元进行写入,中间的照片放大一个存储单元的硅和多晶硅晶体管。去除金属层以暴露其下的晶体管。金属层将晶体管连接在一起;圆圈是硅或多晶硅与金属之间的连接(通孔)。示意图显示了五个晶体管是如何连接的;示意图的物理布局与照片相匹配。两对晶体管形成两个CMOS反相器,而左下角的PASS晶体管提供对单元的访问。
八位配置内存,上面四个,下面四个。红色方框显示一个比特。当列选择线被激活时,行数据线被加载到相应的单元中。特写和原理图显示了一点配置内存。来自siliconpronn的模具照片。
如前所述,FPGA通过使用查找表来实现任意逻辑功能。下图显示了如何在XC2064中实现查找表。左边的8个值存储在8个存储单元中。4个多路复用器根据A输入的值选择每对值中的一个;如果A为0,则选择顶值,如果A为1,则选择底值。接下来,较大的多路复用器基于B和C选择四个值中的一个。结果是期望值,在这种情况下是A XOR B XOR C。通过在查找表中放入不同的值,可以根据需要改变逻辑函数。
每个多路复用器由传递晶体管实现。根据控制信号,激活其中一个传递晶体管,将其输入到输出。下图显示了LUT电路的一部分,多路复用了两个位。右边是两个存储单元。每一位都经过反相器放大,然后通过中间的多路复用器的电阻,选择其中一位。
每个CLB都包含一个触发器,允许FPGA实现锁存器、状态机和其他有状态电路。下图显示了触发器的实现(略有不同寻常)。它使用主/次设计。当时钟低时,第一个多路复用器让数据进入主锁存器。当时钟变高时,多路复用器关闭第一个锁存器的环路,保持值不变。(该位通过OR门、NAND门和反相器反转两次,因此它保持恒定。)同时,当时钟变高时,辅助锁存器的多路复用器接收来自第一个锁存器的位(请注意,时钟是反转的)。该值变成触发器。当时钟变低时,辅助多路复用器关闭环路,锁存位。因此,触发器是边缘敏感的,在时钟的上升沿锁存值。置位和复位线强制触发器高或低。
触发器实现。箭头指向第一个多路复用器和两个OR-NAND门。来自siliconpronn的模具照片。
交换矩阵是重要的路由元素。每台交换机都有八个引脚(两边各两个),并且几乎可以将任何引脚组合连接在一起。这使得信号可以比单独的路由节点更灵活地转弯、拆分或交叉。下图显示了四个CLB(青色)之间的路由网络的一部分。开关矩阵(绿色)可以与右侧连接的任意组合连接。请注意,每个端号可以连接到7个其他端号中的5个。例如,引脚1可以连接到引脚3,但不能连接引脚2或4。这使得矩阵几乎是一个纵横杆,具有20个潜在连接,而不是28个。
开关矩阵由上下两个存储单元控制的一排PASS晶体管实现,晶体管的两侧是可由该晶体管连接的两个开关矩阵管脚,因此每个开关矩阵有20个相关的控制位;该晶体管控制管脚5和管脚1之间的连接。因此,位流中对应于该存储单元的位控制管脚5和管脚1之间的开关连接。类似地,其它存储单元及其相关晶体管控制其它开关连接。注意,这些连接的顺序不遵循特定的模式;因此,位流位和开关P之间的映射。因此,位流中对应于该存储单元的位控制管脚5和管脚1之间的开关连接。同样,其它存储器单元及其相关晶体管控制其它开关连接。注意,这些连接的顺序不遵循特定模式;因此,位流位和开关P之间的映射。
实施8针开关矩阵。硅区标有相应的管脚号。为这张照片去掉了金属层(将管脚连接到晶体管)。基于来自siliconpr0n的芯片照片。
CLB的输入在比特流中使用不同的编码方案,硬件实现对此进行了说明。在下图中,圈出的八个节点是CLB盒DD的潜在输入。最多只能配置一个节点作为输入,因为将两个信号连接到同一个输入会使它们一起短路。
输入选择。绿色圈出的八个节点是DD的潜在输入;可以选择其中一个。
使用多路复用器选择所需的输入。简单的解决方案是使用8路多路复用器,3个控制位选择8个信号中的一个。另一个简单的解决方案是使用8个通道晶体管,每个晶体管都有自己的控制信号,其中一个选择所需的信号。然而,FPGA使用混合方法,避免了第一种方法的解码硬件,而使用了5个控制信号,而不是第二种方法所需的8个控制信号。
上面的示意图显示了FPGA中使用的两级多路复用器方法。在第一级中,激活其中一个控制信号。第二级选择顶部信号或底部信号作为输出。10例如,假设控制信号B/F被发送到第一级,而控制信号B被发送到第二级;输入B是唯一将通过到输出的输入。因此,选择八个输入中的一个需要比特流中的5位,并且使用5个存储单元。
XC2064使用各种高度优化的电路来实现其逻辑块和布线。这种电路需要紧凑的布局才能安装到芯片上。即使如此,XC2064是一个非常大的芯片,比当时的微处理器还要大,所以一开始很难制造,而且成本高达数百美元。与现代FPGA相比,XC2064的单元数量少得离谱,但即便如此,它也引发了一条革命性的新产品线。
有两个概念是理解XC2064位流的关键。首先,FPGA是由64块瓦片实现的,即组合逻辑块和布线的重复块。虽然FPGA被描述为具有被布线包围的逻辑块,但这不是它们的实现方式。第二个概念是位流中没有抽象;它直接映射到FPGA的二维布局上。因此,只有考虑FPGA的物理布局,位流才有意义。
我已经确定了大部分XC2064位流是如何配置的(请参阅脚注11),并且我已经编写了一个程序来从位流文件生成CLB信息。不幸的是,这是最后20%花费大部分时间的项目之一,因此仍有工作要做。其中一个问题是如何处理I/O引脚,这些引脚充满了不规则性和它们自己的路由配置。另一个问题是边缘周围的瓦片的配置略有不同。
我在推特上宣布了我最新的博客帖子,所以请关注kensheriff上的最新消息。我还有一个RSS提要,感谢约翰·麦克马斯特、蒂姆·安塞尔和菲利普·弗莱丁的讨论。12个。
罗斯·弗里曼不幸死于肺炎。
.