现场可编程门阵列(FPGA)可以实现任意数字逻辑,从微处理器到视频天生器或加密矿机,一应俱全。FPGA由许多逻辑模块组成,每个逻辑模块常日由触发器和逻辑功能以及连接逻辑模块的路由网络组成。FPGA的分外之处在于它是可编程的硬件:您可以重新定义每个逻辑块及其之间的连接,用来构建繁芜的数字电路,而无需物理上连接各个门和触发器,也不必花费设计专用集成电路的用度。
内部裸片显微照片

FPGA是由Ross Freeman发明的,他在1984年共同创立了Xilinx,并推出了第一款FPGA--XC2064。这种FPGA比当代FPGA大略得多,它只包含64个逻辑块,而当代FPGA中的逻辑块有几千个或数百万个,但它导致了目前代价数十亿美元的FPGA家当。由于其主要性,XC2064被列入芯片名人堂。在这篇博文中,我们对Xilinx的XC2064进行了逆向工程,阐明了它的内部电路(上图)以及 \公众比特流 \公众是如何对它进行编程的。

Xilinx XC2064是第一款FPGA芯片
如今,FPGA是采取Verilog或VHDL之类的硬件描述措辞编程的,但是当时Xilinx供应了他们自己的开拓软件XACT,运行再MS-DOS操作系统之下,价格高达12,000美元。XACT自然无法与现在的FPGA开拓工具比较,XACT通过用户定义了每个逻辑块的功能(如下面的屏截图所示)以及逻辑块之间的连接,对连接进行布线连接,并天生可加载到FPGA中的比特流文件。
XACT的屏幕截图。两个查找表F和G在屏幕底部实现逻辑运算,上面部分显示该逻辑的卡诺图。
通过位流(具有专有格式的位序列)配置FPGA。如果您查看XC2064的比特流(如下所示),那是令人费解的稠浊模式,这些模式不规则地重复,并散布在比特流中。XACT中的功能定义与位流中的数据之间没有明确的联系。但是,研究FPGA的物理电路可以揭示比特流数据的构造,并且可以理解。
通过位流(具有专有格式的位序列)配置FPGA。如果您查看XC2064的比特流(如下所示),那是令人费解的稠浊模式,这些模式不规则地重复,并散布在比特流中。XACT中的函数定义与位流中的数据之间没有明确的联系。但是,研究FPGA的物理电路可以揭示比特流数据的构造,并且可以理解。
1 FPGA如何事情?
下图来自原始 FPGA 专利,显示了 FPGA 的基本构造。在此简化的 FPGA 中,有 9 个逻辑块(蓝色)和 12 个 I/O 引脚。互连网络将组件连接在一起。通过设置互连上的开关(对角线),逻辑块相互连接并连接到 I/O 引脚。每个逻辑元素都可以利用所需的逻辑功能进行编程。其结果是一个高度可编程的芯片,可以实现任何适宜可用的电路。
FPGA专利显示通过互连连接的逻辑块(LE)
2 CLB:可配置逻辑块
虽然上图显示了九个可配置逻辑块(CLB),但 XC2064 有 64 个 CLB。下图显示了每个 CLB 的构造。每个 CLB 有四个输入(A、B、C、D)和两个输出(X 和 Y)。两者之间是组合逻辑,可以利用任何所需的逻辑功能进行编程。CLB 还包含一个触发器,许可 FPGA 实现计数器、移位寄存器、状态机和其他有状态电路。梯形是多路复用器,可以编程通过其任何输入。多路复用器许可为特界说务配置 CLB,为触发器控件和输出选择所需的旗子暗记。
XC2064 中的可配置逻辑块
您可能想知道组合逻辑如何实现任意逻辑功能。它会采取与门、或门、异或门等逻辑吗?不,它利用一种称为查找表(LUT)的奥妙技巧,实际上它包含的是逻辑功能的真值表。例如,三个变量的功能由其真值表中的 8 行定义。LUT 由 8 位内存以及多路复用电路组成,以选择精确的值。通过将值存储在这 8 位内存中,可以实现任何 3 输入逻辑功能。
3
互连
FPGA的第二个关键部分是互连,可以对其进行编程以不同办法连接CLB。互连相称繁芜,但是粗略的描述是每个CLB之间有几个水平和垂直线段。CLB互连点许可在水平线和垂直线之间建立连接,从而可以创建任意路径。更繁芜的连接通过“交流矩阵”(switchmatrices)完成。每个开关矩阵都有8个引脚,可以(险些)任意办法将它们连接在一起。下图显示了XC2064的互贯串衔接构,供应了到逻辑块(青色)和I / O引脚(黄色)的连接。该图显示了路由功能的特写。绿色框是8针开关矩阵,而小方块是可编程的互连点。
XC2064 FPGA具有一个8 x 8的CLB网格
每个CLB都有从AA到HH的字母名称。互连可以将例如块DC的输出连接到块DE的输入,如下所示。红线表示路由路径,赤色小方块表示已激活的路由点。离开模块DC后,旗子暗记由第一个路由点定向到8针开关(绿色),该旗子暗记将其勾引到其余两个路由点和另一个8针开关。(未显示未利用的垂直和水平路径。)请把稳,布线相称繁芜;纵然是这条短路径,也利用了四个路由点和两个开关。
从块DC的输出路由到块DE的旗子暗记示例
下面的屏幕截图显示了 XACT 程序中的路由外不雅观。黄线指示逻辑块之间的路由。随着旗子暗记的加入,寻衅在于如何有效地路由而不使路径发生冲突。XACT 软件包实行自动路由,但也可以手动编辑路由。
XACT 程序的屏幕截图。此 MS-DOS 程序通过键盘和鼠标进行掌握。
4 Implementation
本文的别的部分谈论了XC2064的内部电路,从裸片照片中的反向工程。
下图显示了XC2064芯片的布局。FPGA的紧张部分是8×8的网格。每个图块包含一个逻辑块和相邻的路由电路。只管图片显示将逻辑块(CLB)显示为与环绕它们的路由不同的实体,但这并不是 FPGA的实现办法。取而代之的是,每个逻辑块和相邻路由都实现为单个实体,即图块。(详细来说,图块包括每个CLB上方和左侧的路由。)
XC2064芯片的布局
I/O模块环绕集成电路的边缘供应与外界的通信。它们连接到小的绿色方形焊盘,该焊盘连接到芯片的外部引脚。裸片被缓冲区(绿色)划分:两个垂直和两个水平。这些缓冲器可放大在电路中传播很长间隔的旗子暗记,从而减少延迟。垂直移位寄存器(粉赤色)和水平列选择电路(蓝色)用于将比特流加载到芯片中,如下所述。
5 Tile的内部构造
下图显示了XC2064中单个Tile的布局;如上图所示,该芯片包含64个这样的Tile挤在一起。每个Tile约有40%的面积被保存配置位的内存单元(绿色)所霸占。顶部三分之一处通过两个交流矩阵和许多单独的路由交流处理互连路由,下面是逻辑块。逻辑块的关键部分是输入的多路复用器、触发器和查找表(LUT)。每个块通过垂直和水平布线连接到相邻的块,以实现互连,电源和接地。配置数据位被水平地馈送到存储单元,而垂直旗子暗记选择要加载的存储单元的特定列。
5 晶体管
FPGA由CMOS逻辑实现,该逻辑由NMOS和PMOS晶体管构建。晶体管在FPGA中具有两个紧张浸染。首先,可以将它们组合以形成逻辑门。其次,晶体管被用作旗子暗记通过的开关,例如以掌握路由。在此浸染下,该晶体管称为传输晶体管。
MOSFET的构造
下面的裸片照片特写显示了在显微镜下晶体管的外不雅观。多晶硅栅极是两个掺杂硅区域之间的蛇形线。
FPGA中的MOSFET
6 比特流和配置存储
XC2064 中的配置信息存储在配置内存单元中。FPGA 的内存不是利用 RAM 块进行存储,而是分布在 160×71 网格中的芯片上,确保每个位都位于它掌握电路阁下。下图显示了配置比特流如何加载到 FPGA 中。比特流被送入从芯片中央(粉赤色)向下运行的移位寄存器中。将 71 位加载到移位寄存器中后,列选择电路(蓝色)将选择特定的内存列,并并行加载到此列中。然后,将接下来的 71 位加载到移位寄存器中,左侧的下一列将成为所选列。此过程将重复 FPGA 的所有 160 列,将全体比特流加载到芯片中。利用移位寄存器可避免大量内存寻址电路。
比特流如何加载到 FPGA 中
主要的是,比特流的分布与文件中的分布完备相同:比特流文件中的比特布局与芯片上的物理布局匹配。如下所示,每个位都存储在FPGA掌握电路的阁下。因此,比特流文件格式直接由硬件电路的布局确定。例如,当由于缓冲电路而在FPGA切片之间存在间隙时,相同的间隙会涌如今位流中。比特流的内容不是环绕字段,数据表或配置块之类的软件观点来设计的。理解比特流取决于从硬件角度而非软件角度进行思考。如下所示实现配置存储器的每一位。每个存储单元均包含两个以环路连接的反相器。该电路具有两个稳定状态,因此可以存储一个位:顶部反相器为1,底部反相器为0,反之亦然。为了写入该单元,左侧的传输晶体管被激活,使数据旗子暗记通过。数据线上的旗子暗记只会使逆变器过载,从而写入所需的位。(您也可以利用相同的路径从FPGA中读取配置数据。)Q和反相Q输出掌握FPGA中所需的功能,例如关闭路由连接,为查找表供应位,或掌握锁存器电路。(在大多数情形下,仅利用Q输出。)
从数据表中显示一个位配置内存的示意图。Q 是输出,Q 是颠倒输出。
下图显示了存储单元的物理布局。左图显示了八个存储单元,个中一个单元高亮显示。每条水平数据线馈入该行中的所有存储单元。每列选择行选择该列中的所有存储单元以进行写入。中间照片放大了一个存储单元的硅和多晶硅晶体管。
7 查找表多路复用器
如前所述,FPGA通过利用查找表来实现任意逻辑功能。下图显示了如何在XC2064中实现查找表。左侧的八个值存储在八个存储单元中。四个多路复用器根据A 输入值选择每对值中的一个 。如果 A 为0,则选择最高值;如果 A 为1,则选择最低值。接下来,较大的多路复用器根据B 和 选择四个值之一 C。在这种情形下,结果是所需的值 A XOR B XOR C。通过在查找表中放置不同的值,可以根据须要变动逻辑功能。
利用查找表实现 XOR
每个多路复用器都是通过晶体管来实现的。根据掌握旗子暗记,个中一个通报晶体管被激活,将该输入通报到输出。下图显示了LUT电路的一部分,多路复用了个中的两个比特。右边是两个存储器单元。每一个比特都要经由一个反相器进行放大,然后经由中间的多路复用器的通报晶体管,选择个中的一个比特。
LUT实现中的电路特写
8 锁存器
每个CLB包含一个触发器,许可FPGA实现锁存器,状态机和其他有状态电路。下图显示了触发器的实现。它利用主/赞助设计。当时钟为低电平时,第一个多路复用器让数据进入主锁存器。当时钟变高时,多路复用器关闭第一个锁存器的环路,并保持该值。(该位通过“或”门,“与非”门和反相器两次反转,因此保持不变。)同时,当时钟变高时,赞助锁存器的多路复用器从第一个锁存器吸收该位(请把稳,时钟已反转)。该值成为触发器的输出。当时钟变低时,次级的多路复用器关闭环路,从而锁存该位。因此,触发器是边缘敏感的,在时钟的上升沿锁存该值。置位和复位线逼迫触发器为高电平或低电平。
触发器的实现,箭头指出了第一个多路复用器和两个OR-NAND门
9 8-pin 交流矩阵
交流矩阵是一个主要的路由元件。每个开关有八个\"大众引脚\公众(每侧两个),险些可以连接任意引脚组合在一起。这许可旗子暗记比单个路由节点更灵巧地迁徙改变、拆分或交叉。下图显示了四个 CLB (cyan)之间的路由网络的一部分。交流矩阵(绿色)可与右侧连接的任意组合连接。请把稳,每个引脚可以连接到其他 7 个引脚中的 5 个。例如,引脚 1 可以连接到引脚 3,但无法连接到引脚 2 或 4。这使得矩阵险些是一个横栏,有20个潜在的连接,而不是28个。
基于Xilinx 可编程门阵列数据手册,图7b
开关矩阵由一排传输晶体管实现,该传输晶体管由上方和下方的存储单元掌握。晶体管的两侧是可以通过该晶体管连接的两个开关矩阵引脚。因此,每个开关矩阵具有20个干系联的掌握位。
每个图块两个矩阵产生每个图块40个掌握位的矩阵。下图显示了个中一个存储单元,该存储单元连接到下面的传输晶体管的长波折栅极。该晶体管掌握引脚5和引脚1之间的连接。
因此,与该存储单元相对应的位流中的位掌握引脚5和引脚1之间的开相干接。同样,其他存储单元及其干系晶体管掌握其他开相干接。请把稳,这些连接的顺序不遵照特定的模式。因此,位流位和开关引脚之间的映射是随机的。
10 输入路由
CLB的输入在位流中利用不同的编码方案,这由硬件实现办法阐明。不才图中,八个圆圈的节点是CLB框DD的潜在输入。
最多只能将一个节点配置为输入,由于将两个旗子暗记连接到同一输入将使它们短路。利用多路复用器选择所需的输入。一个大略的办理方案是利用8路多路复用器,个中3个掌握位选择8个旗子暗记之一。另一个大略的办理方案是利用8个通过晶体管,每个晶体管都有自己的掌握旗子暗记,个中一个选择所需的旗子暗记。但是,FPGA利用一种稠浊方法,该方法避免了第一种方法的解码硬件,但利用了5个掌握旗子暗记,而不是第二种方法所需的8个掌握旗子暗记。
FPGA利用多路复用器选择八个输入之一
上面的示意图显示了FPGA中利用的两级多路复用器方法。在第一阶段,掌握旗子暗记之一被激活。第二阶段从顶部或底部选择旗子暗记作为输出。例如,假设掌握旗子暗记 B/F 发送到第一级,“ ABCD”发送到第二级;输入B是唯一将通报到输出的B。因此,选择八个输入之一须要在比特流中利用5位,并利用5个存储单元。
11
结论
XC2064利用各种高度优化的电路来实现其逻辑块和路由。该电路须要紧凑的布局,以适宜芯片。纵然这样,XC2064还是一个非常大的芯片,比当时的微处理器还大,因此一开始很难制造,而且要花费数百美元。与当代FPGA比较,XC2064的单元数量非常少,但是纵然如此,它也引发了革命性的新产品线。
理解XC2064比特流的关键是两个观点。首先,FPGA由64个块组成,这些块是将逻辑块和路由结合在一起的重复块。只管FPGA被描述为具有被路由包围的逻辑块,但这并不是实现它们的办法。
第二个观点是,比特流中没有抽象。它直接映射到FPGA的二维布局中。因此,只有考虑FPGA的物理布局,比特流才故意义。
原文:https://semiwiki.com/fpga/290990-reverse-engineering-the-first-fpga-chip-xilinx-xc2064/







