概述
在进行 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。#配置#FPGA#PAD收藏
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。
第一类是在用户设计中明确配置了需要保留的功能引脚,例如对于配置相关的引脚设置了 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。