概述

在进行 FPGA 硬件设计时,引脚分配是非常重要的一个环节,特别是在硬件电路上需要与其他芯片通行的引脚。Xilinx FPGA 从上电之后到正常工作整个过程中各个阶段引脚的状态,会对硬件设计、引脚分配产生非常重要的影响。这篇专题就针对 FPGA 从上电开始 ,配置程序,到正常工作整个过程中所有 IO 的状态进行分析。

 

从时间阶段可以分为两部分,第一阶段是从 FPGA 上电开始直到配置(Configuration)完成之前。第二个阶段是配置完成之后,FPGA 开始正常工作开始。

 

从引脚类型上分,可以分为三大类:第一类是普通的 IO,其中又分为程序设计中使用到的 IO 和程序设计中没有使用的 IO(即在 ucf 或者 XDC 文件中没有进行约束的 IO);第二类是专用下载配置引脚(Dedicated Pins),这类引脚只用于专用的功能,包括有 M[2:0]、TCK、TMS、PROGRAM_B、INIT_B 等。第三类为功能复用引脚,这类引脚在使用特定的功能时使用,例如在使用 BPI 配置模式时,D[00-31]和 A[00-28]需要使用。如果使用 SYSMON 时,I2C_SDA 和 I2C_SCL 需要使用。但在当前没有使用该功能的情况下,功能复用引脚可以看成普通 IO。

 

FPGA IO 的基本结构

在《IO 输入输出的各种模式》介绍了处理器 IO 的各种输入输出模式以及原理,那么 FPGA 的 IO 是什么样的结构和原理?图 1 为 Xilinx 文档中提供的 IOB 的内部结构,可以看出:

 

在 FPGA IOB 内部,Pad 输出之前,内置上下拉电阻。且可以通过 Passive Pull-up/Pull-down 模块控制两个 MOS 管的导通与否来控制是否使能上下拉电阻。

 

内部连接 Pad 的分别有一个 Input Buffer 和 Output Buffer。其中 Input Buffer 对外应该始终呈现高阻状态,同时可以将 Pad 上的电平通过 Input Buffer 传到 I1 和 I2,或者是下部的 FF。Output Buffer 有两个控制信号,分别是 Slew Rate Control,用来控制输出信号的 Slew Rate;另一个是三态控制信号 T,可以控制 Output Buffer 输出高阻。

 

内部输出信号 Out,可以通过上半部分的 FF,经 Output Clock 同步后打出,也可以直接连接到 Output buffer 的输入端,直接输出。

 

同样 Input Buffer 的输出,可以直接连接到 I1 和 I2,也可以经过下半部分的 FF,经过 input clock 的同步之后输出到内部总线上。

 

上下两个 MOS 并不是推挽输出的两个 MOS 管,因为并不受到互补信号的控制,并不一定一个导通另一个闭合。

 

 

这里介绍一下输入缓存器的结构和原理,其结构如图 2 所示,其原理与推挽输出电路非常类似,只是输入端信号作为了两个互补 MOS 管的控制端,控制着输出端的电平。由于输入缓冲器有自己的供电电压,所以输入电平必须与缓冲器的电源电压相匹配。D1 和 D2 两个钳位二极管用于防治输入电压过低或者过高,损坏输入缓冲器。

 

普通 IO

 

配置完成之前

 

在 FPGA 上电到配置完成之前,由于当前 FPGA 还没有下载程序,无法区分哪些引脚被设计所使用,哪些引脚没有被使用。此时的普通 IO 包括两部分:

 

该封装中所有的通用 IO 引脚。

 

当前所选择的模式下没有使用到的所有功能复用管脚。

 

在 Spartan6 系列以及之前的器件中这些引脚的状态是根据 HSWAPEN 的状态决定的。

 

 

在 7 系列以后的器件,包括 Ultrascale 器件中,这些引脚的状态是根据 PUDC_B(Pull-Up During Configuration)引脚

 

 

这两个引脚的功能是相似的,都是用来控制在 Configuration 完成之前,所有普通 IO 的上拉电阻是否使能的。对应到图 1 中,即 Output Buffer 输出高阻,Input Buffer 对外始终为高阻,此时选择是否连接上拉电阻。

 

在配置完成之后,FPGA 就进入正常工作的模式了。在配置完成之后,普通引脚可以分为以下两种:

 

工程设计中使用的 IO,即在 UCF 或者 XDC 中有明确约束的 IO。

 

其余没有使用,也没有约束的 IO。(称为 Unassigned Pins)

 

首先,对于第一种情况,由于已经在设计中明确设定了这些引脚的设置,包括方向、电平、驱动能力等等,所以在配置完成之后,这些引脚的状态已经被设置为了预设的状态。

 

对于没有约束的 IO,又复杂一些了。在 ISE 开发环境下,工程完成 Implement 之后,在 Processà Process properties àConfiguration Options 中有"-g UnusedPin Unused IOB Pins"属性,可以选择 Pull Down、Pull Up 或者 Floating。默认状态是 Pull-Down。对应到图 1 中,是高阻输出,导通下拉电阻。另两个设置就是高阻加上上拉电阻或者只是上下拉电阻均不导通。

 

在 Vivado 中也有相同的设置,必须在实现完成之后,打开 Implementation Design 之后选择 bitstream Settings,其中在"Configure additional bitstream settings"中的 Configuration 栏中,有如下属性选择项。

 

 

专用 IO

所有的专用配置引脚全部位于 Bank0,包括 CFGBVS、M[2:0]、TCK、TMS、TDI、TDO、PRORAM_B、INIT_B、DONE 以及 CCLK。专用引脚的含义就是无论在配置过程中还是配置完成之后,这些引脚无论在什么阶段都只用于配置。

 

所以对于这些引脚考虑相对比较简单,分为输入信号和输出信号。输入信号的状态始终保持 LVCMOS 电平标准,电压值为 VCCO(输入信号为什么也有电平标准要求,需要与 Input buffer 的供电电压相匹配,见图 2)。输出信号的状态始终保持 LVCMOS 电平标准,电压为 VCCO,12mA drive,fast slew rate。

 

功能复用 IO

相比于其他引脚,功能复用引脚的情况是最复杂的,这些管脚包括与配置相关的 PUDC_B、EMCCLK、CSI_B、CSO_B、DOUT、RDWR_B、D00_MOSI、D01_DIN、D[00-31]、A[00-28]、FCS_B、FOE_B、FEW_B、ADV_B、RS0 以及 RS1;以及与 System Monitor 相关的 AD0P 至 AD15P、AD0N 至 AD15N,I2C_SDA 以及 I2C_SCLK。

 

为了说清楚功能复用管脚在不同阶段的状态,将复用管脚分为以下几类:

 

在当前所选择的功能中使用到的功能复用管脚,例如在选择 BPI 配置时的 D[00-31]和 A[00-28]。

 

在当前所选择的功能中没有使用到的功能复用管脚。例如在选择 SPI 配置时的 D[00-31]和 A[00-28]。

 

在完成配置之前需要作为输出或者双向,总之有可能向外输出信号的管脚,例如 I2C_SDA 和 I2C_SCLK。

 

配置完成之前

在 FPGA 上电至配置完成之前的这段时间内,前面列出的第一类引脚,即在当前所选择的功能中使用到的功能复用管脚,状态等同于专用配置 IO 管脚。输入信号的状态始终保持 LVCMOS 电平标准,电压值为 VCCO。输出信号的状态始终保持 LVCMOS 电平标准,电压为 VCCO,12mA drive,fast slew rate。

 

前面列出的第二类引脚,即在当前所选择的功能中没有使用到的功能复用管脚,视同于普通 IO,其状态受到 HSWAPEN 或者 PUDC_B 信号的控制,决定是高阻还是连接弱上拉电阻。

 

第三类引脚的情况比较复杂,目前所知的只有 I2C_SDA 和 I2C_SCLK,这两个信号会在配置完成前出现一些不确定的状态。所以如果 FPGA 的 IO 还有富余,并且要求所有连接到外部的引脚有确定的状态,那么最好不要使用这两个引脚作为连接外设的 IO。

 

在 FPGA 配置完成之后,前面提到的三种引脚会被分成另外三类:

 

第一类是在用户设计中明确配置了需要保留的功能引脚,例如对于配置相关的引脚设置了 Persist option 属性,这种情况下这些引脚会继续保持之前与配置相关的功能,其状态为输入信号的状态始终保持 LVCMOS 电平标准,电压值为 VCCO。输出信号的状态始终保持 LVCMOS 电平标准,电压为 VCCO,12mA drive,slow slew rate。再例如设计中使用了 SYSMON,I2C_SDA 和 I2C_SCLK 引脚则继续保持 DRP I2C 的功能。

 

第二类是在用户设计配置中没有要求保留其特殊功能,这些引脚在配置完成之后会变成普通 IO,且在用户设计中没有使用到的 IO。这些 IO 相当于 Unassigned IO,如前所述,这些 IO 在配置完成之后的状态受到相应设置的影响,可以是上拉、下拉或者 Floating。

 

第三类是在用户设计配置中没有要求保留其特殊功能,这些引脚在配置完成之后会变成普通 IO,并且在用户设计中使用到的 IO。这些 IO 的状态由用户设计控制,会在 XDC 或者 UCF 中设定。如果没有设定就会按照默认的状态,输入端口默认状态为 LVCMOS 电平标准,电压值为 VCCO;输出信号默认状态为保持 LVCMOS 电平标准,电压为 VCCO,12mA drive,slow slew rate。