Xilinx IO的分类:
以XC7A100TFGG484为例,其引脚分类如下:
命名为IO_LXXY_# 、IO_XX_#的引脚,有固定的特定用途,多为底层特定功能的直接实现,如差分对信号、关键控制信号等,不能随意变更。
命名为IO_LXXY_ZZZ_# 、IO_XX_ZZZ_#的引脚,同时有多个特定功能(ZZZ部分表示特定的功能),未被使用时可以用作普通I/O引脚。
1.专用IO (Dedicated I/O):包括部分配置I/O、电源/接地相关I/O、高速收发器相关I/O,具有特定用途,用户不可使用。
2.用户IO(User I/O):用户可以使用的IO。
2.1专用用户I/O (Dedicated General-purpose User I/O):指命名为IO_LXXY_# 、IO_XX_#的引脚,表示没有特定的预定义功能,只是单纯的用户I/O引脚,用户可以任意使用的普通IO(即这里的专用是指单一)。
2.2多功能用户I/O (Multi-function User I/O):指命名为IO_LXXY_ZZZ_# 、IO_XX_ZZZ_#的引脚,表示有特定的预定义功能,也可以作为用户I/O引脚。(其中有些IO的特定功能是FPGA配置,即包括部分配置I/O)(即上面分类中的多功能IO (Multi-function I/O))
vivado的PULLMODE配置,是把IO分为used user IO、unused user IO和Dedicated IO:
used user IO:在xdc界面等进行配置。
unused user IO:在bitstream界面都配置为PULLDOWN。
Dedicated IO:配置IO在bitstream界面都配置为PULLUP;电源/接地IO连接特定电压或地,不涉及信号电平变化,因此不需要PULLMODE设置;高速收发器IO,高速信号传输必须确保信号的高完整性,以避免信号畸变和反射。PULLUP或PULLDOWN电阻会引入额外的寄生电容和阻抗变化,可能会影响信号的完整性,因此不需要PULLMODE设置。(高速收发器IO在xilinx中是否进行了PULLMODE设置,可以进一步测试)
(注:专用IO里面的配置IO在used IO的xdc界面是不会提供这个选项,用户不能使用这些引脚。)
Pullmode主要是为了确定一个信号在没有其他激励的情况下,有一个稳定的状态。具体来说,pull-up和pull-down电阻用于将未连接(或高阻态)的引脚设置为已定义的电平,从而避免由于浮置引脚引起的不稳定状态和潜在的错误。这在数字电路设计中非常重要,具体原因如下:
防止浮置引脚: 在没有pull-up或pull-down电阻的情况下,未驱动的引脚可能处于浮动状态(即高阻态),这会导致信号不稳定和错误的逻辑状态。通过配置pull-up或pull-down,可以确保引脚在未连接或未驱动时处于已知的稳定状态。
提高电路稳定性和可靠性: 通过pull-up或pull-down电阻设置引脚的默认状态,可以提高电路的稳定性和可靠性,避免因浮置引脚带来的未知和不确定的行为。
确保正确的逻辑电平: 在某些情况下,需要确保特定引脚在系统初始化或重置过程中保持特定的逻辑电平。通过软件设置pullmode,可以在硬件初始化之前或在系统空闲时确保正确的逻辑电平。(如果系统需要低电平复位,那么复位引脚在没有其他激励时应该保持一个高电平,以确保在正常操作期间该引脚不会误触发复位。在这种情况下,应该将复位引脚设置为pull-up模式。)
降低功耗: 浮动引脚可能造成不必要的功耗,因为电流可以在不同逻辑电平之间不断变化。通过pull-up或pull-down电阻可以将未使用的引脚固定在某一逻辑电平,从而减少功耗。
避免电磁噪声和干扰: 浮动引脚可能会拾取环境中的电磁噪声并引起不必要的干扰,通过pull-up或pull-down可以减少这种影响。
FPGA 内部支持配置上拉或下拉电阻,是通过一些内建的电阻实现的。这些电阻在硅片上是预先设计好的,芯片制造过程中就已经存在。具体来说,FPGA 内部通过配置寄存器或者配置文件(.bit 文件)中的控制信息来开启或关闭这些内部的上拉或下拉电阻。FPGA内部利用MOSFET作为开关,控制上拉和下拉电阻的启用和关闭,通过配置寄存器进行编程控制。
软件中对于引脚有默认值的依据?
1. 引脚的功能和用途:引脚的具体用途决定了其在未被驱动时需要保持何种状态。
输入引脚:输入引脚在未被外部信号驱动时,需要保持已定义的逻辑电平,否则可能会因为浮动而产生噪声或误触发。
控制引脚:像复位引脚、模式选择引脚等控制引脚,需要确保在系统初始化或无外界驱动时能保持在预期的逻辑电平。
特殊功能引脚:一些引脚可能需要特定的默认状态以满足其特定的功能需求,比如JTAG或调试引脚。
2. 电路的稳定性和可靠性
默认的PULLMODE设置应有助于提高系统的稳定性和可靠性,避免浮动引脚带来的不确定性。上拉(pull-up)或下拉(pull-down)电阻能确保引脚在未驱动时处于已定义状态,防止噪声干扰和误操作。
3. 功耗考虑
默认PULLMODE设置也需要考虑功耗。对于未使用或在某些模式下不用的引脚,通过合适的上拉或下拉设置,可以降低不必要的功耗。例如,浮动的输入引脚可能导致芯片的功耗增加,通过设置pull-up或pull-down可以避免这种情况。
4. 电路设计习惯和规范
在硬件设计规范中,通常有默认的推荐实践。例如,大多数输入引脚默认设置为上拉(pull-up),以确保它们在未连接或驱动时不浮动到中间电平。另外,某些特定的引脚,如复位引脚可能有特定的设计规范来推荐默认的pull-up或pull-down设置。
1. 外部电路已配置
外部电路通常会包含适当的上拉或下拉电阻,因此在FPGA内部再配上拉或下拉电阻就显得多余。例如,很多板子可能在硬件电路层面已经对特定引脚进行了上拉或下拉处理。
2. 特定信号要求
某些信号,比如高速串行信号、差分对信号(例如LVDS)、某些通信总线(比如UART、SPI等),有它们特定的电气规范和要求。通常外部电路已经设计精确以符合这些要求,额外的上拉或下拉电阻可能影响信号完整性或电气特性。
3. 高阻状态的需求
某些情况下,希望引脚处于高阻状态(高阻态)以避免干扰其他电路。将引脚配置为高阻态允许其在浮空时不影响系统,并使得多个器件可以共享一个信号线。
4. 低功耗考虑
上拉和下拉电阻引入了电流路径,这在某些低功耗设计中可能是不可取的。因此,对于功耗敏感的设计,选择none可以避免不必要的电流消耗。
5. 逻辑可控
在硬件描述语言(如Verilog或VHDL)中可以更精确地控制信号的行为,而不依赖硬件内部的默认行为。例如,复位信号都可以在电路设计层面或通过软件控制,由硬件控制信号的状态。
特定场景下的考虑
双向数据总线:例如I2C、SPI等总线,在数据传输过程中,引脚可能既作为输入也作为输出。在这种情况下,设置为 PULLNONE可以避免上下拉电阻干扰总线驱动和阻抗匹配。
高速信号:在高速数据通讯中,任何额外的电阻都会引起信号延迟和波形失真,因此这些引脚通常只由外围设备驱动。
1. 防止引脚浮空
未使用的引脚如果没有下拉电阻或上拉电阻,可能会浮空(即处于高阻状态),在这种状态下,引脚可能会拾取到周围环境中的噪声信号。这些噪声信号可以引起未定义的逻辑状态,导致不稳定的系统行为。
2. 减少功耗
浮空状态的引脚可能会偶然地进入中间电平状态(既不是高电平也不是低电平),这会导致内部的CMOS电路持续导通,从而引起额外的功耗。通过将引脚拉低,可以确保其处于稳定的逻辑低电平,从而避免这些中间状态,减少功耗。
3. 提高噪声抗扰性
将未使用的引脚拉低可以减少它们作为天线接收和传播电磁干扰的可能性,从而提高整个系统的噪声抗扰性。
4. 安全性
在没有特定需求的情况下,未使用的引脚拉低可以防止这些引脚意外连接到外部电路,从而避免潜在的短路或干扰。
1. TCK(JTAG时钟引脚)
高电平:在未驱动情况下,高电平确保时钟引脚不会随机产生时钟信号,从而保持JTAG状态机稳定,并确保没有错误的时钟信号触发。
低电平:低电平作为时钟信号的一部分,在时钟周期内出现,但在系统未驱动时保持低电平可能导致浮动,造成不期望的噪声和干扰。
上拉原因:保持高电平可以确保在没有驱动时,引脚不会浮动。浮动时钟引脚可能会引起状态机的误触发或不稳定。因此,通过上拉电阻维持稳定的高电平,确保系统处于安全和稳定模式。
2. TDI(JTAG数据输入引脚)
高电平:表示输入的默认状态为高电平,以确保在没有输入数据时,引脚不会悬空导致噪声或误数据。
低电平:在传输数据位时,低电平是有效数据的一部分,但在没有输入时将其拉低可能会导致检测到错误的数据。
上拉原因:当没有驱动信号时,将TDI引脚上拉至高电平可以避免引脚浮动,受噪声干扰,确保数据输入的通道在未使用时维持在高电平,防止错误数据输入。
3. TDO(JTAG数据输出引脚)
高电平:在没有数据输出时,保持高电平可以避免噪声,并确保其在未使用时处于稳定状态。
低电平:低电平作为数据的一部分在输出过程中出现,但在没有数据时保持低电平可能会受环境噪声影响。
上拉原因:尽管TDO主要作为输出信号,没有驱动时不能悬浮。维持高电平可以避免噪声干扰,在未使用时防止输出信号的不必要波动和干扰。
4. TMS(JTAG模式选择引脚)
高电平:高电平通常用于将TAP控制状态机置于特定模式,如进入测试模式,确保在未驱动时不会进入随机模式。
低电平:低电平用于选择其他特定的TAP状态,但在未驱动时如果悬空且受到噪声影响,可能会导致状态机进入错误模式。
上拉原因:上拉至高电平确保选择状态机在默认启动的模式,以防止未接状态受噪声干扰导致模式误选。高电平确保默认状态为稳定和已知状态。
5. INIT_B(初始化引脚)
高电平:高电平表示初始化完成。上拉电阻确保默认状态为高电平,指示初始化状态已完成。
低电平:低电平指示正在进行初始化。如果该引脚在初始状态下悬空或未驱动可能误触发初始化过程。
原因:上拉到高电平确保在没有主动拉低时,系统不会误认为正在初始化,防止误操作。
6. DONE(配置完成引脚)
高电平:高电平表示配置已成功完成。上拉确保默认状态为高电平,使之在配置完成后保持稳定。
低电平:低电平表示配置未完成或正在进行。如果这个引脚未驱动但悬空,可能引起状态误判,认为配置尚未完成。
上拉原因:上拉电平确保在没有主动驱动时,完成引脚保持高电平状态,防止误认为配置未完成。
7. M0, M1, M2(配置模式选择引脚)
高电平:高电平表示选择某种具体的配置模式。上拉保证默认模式为已知和稳定的配置模式。
低电平:低电平表示选择其他配置模式。如果未驱动且悬空,可能选择错误的配置模式,导致系统配置失败。
上拉原因:上拉电平确保这些引脚在未驱动时保持逻辑高电平状态,选择默认的配置模式,防止未定义状态导致配置模式错误。
8. PROGRAM_B(配置模式启动引脚)
高电平:高电平表示正常操作模式,不启动配置。上拉确保系统启动时不意外进入配置模式。
低电平:低电平表示启动配置或重新启动配置。悬空的引脚受环境干扰可能意外触发配置。
上拉原因:上拉电平确保在未驱动时,引脚处于高电平状态,避免误触发配置过程。
9.CCLK(配置时钟引脚)
CCLK(Configuration Clock)引脚:是 FPGA 配置过程中一个关键的时钟引脚。它在不同的配置模式下起到不同的作用:
Master 配置模式:CCLK 作为输出时钟,FPGA 自己生成配置时钟信号并通过 CCLK 引脚输出。这个配置时钟信号用于驱动配置存储设备(如 Flash等)中的数据读取过程。
Slave 配置模式:CCLK 作为输入时钟,FPGA 从外部设备(如 PC、MCU 等)接收配置时钟信号,用于驱动 FPGA 配置数据的加载过程。
CCLK 的高低电平含义
高电平:在配置时钟引脚为输出时,高电平表示时钟信号的一个逻辑位处于高态。在输入模式下,高电平表示外部时钟源提供的时钟信号为高状态。
低电平:在配置时钟引脚为输出时,低电平表示时钟信号的一个逻辑位处于低态。在输入模式下,低电平表示外部时钟源提供的时钟信号为低状态。
设置 PULLUP 的原因
确保引脚稳定性和高电平默认状态:
未被驱动时的状态:在上电或复位阶段,FPGA 还未开始配置,或配置过程未启动之前,CCLK 引脚未处于强制驱动状态。如果没有其他驱动器,PULLUP 可以确保引脚在逻辑高电平,而不是悬空或漂浮。
防止噪声干扰:高电平默认状态可以减少环境噪声对未驱动引脚的影响,避免因噪声导致的误触发和意外的配置错误。
配置的可靠性:
初始化和上电阶段:在上电初始化过程中,PULLUP 保证 CCLK 引脚稳定在高电平,以防止引脚在配置启动之前出现不可预测的逻辑状态。
避免高阻态:高阻态引脚容易受到环境噪声干扰,PULLUP 确保在未驱动前不是高阻态或低电平状态,保持高电平更有利于预防误操作。
KEEPER 模式
上电未初始化之前:
在系统复位和初始化之前,如果引脚没有被其他驱动器驱动,它可能会处于高阻态,也就是说,KEEPER模式不会强制一个明确的高电平或者低电平。
初始化和驱动之后:
引脚被驱动之后,例如,经历过一个逻辑高或逻辑低的状态。如果驱动器停止驱动并进入高阻态,引脚会通过 KEEPER 电路保持最后已知的驱动状态(即保持最后一个状态,避免浮动)。
适用场景:适合需要维持最后驱动状态的信号,如共享总线、缓慢变化的状态信号等。
PULLUP 或 PULLDOWN 设置
上电未初始化之前:
在系统复位和初始化之前,这些引脚会被强制到一个明确的逻辑状态(高电平或低电平),避免浮动和高阻态。
初始化和驱动之后:
引脚被驱动之后,驱动器会覆盖上拉或下拉电阻的影响,提供必要的逻辑电平。如果驱动器停止驱动,引脚会通过上拉或下拉电阻被拉到高电平或低电平,不会保持最后的驱动状态(仅简单地强制到使其状态为高或低,避免悬空)。
适用场景:适合需要明确定义空闲状态(高电平或低电平)的信号,如控制信号、非共享总线信号等。
IO类别 |
设置输入位置 |
可选配置值 |
默认值 |
配置I/O中的dedicated IO |
UI bit stream全局设置统一配置 |
PULLUP PULLDOWN (部分支持) PULLNONE |
PULLUP |
unused IO |
UI bit stream全局设置统一配置 |
PULLUP PULLDOWN PULLNONE |
PULLDOWN |
used user IO |
XDC界面,XDC文件,代码(用户输入) |
PULLUP PULLDOWN NONE KEEPER |
NONE |