如果在FPGA配置之后仍然想访问非通用输入输出的管脚(即无法通过*.xdc文件直接限制,一般作特殊用法的管脚),CCLK时,需要使用STARTUPE2原语。如果想要在上电之后再次复位所有的寄存器,触发器和I/O管脚,也需要使用STARTUPE2原语。总的来说,STARTUPE2原语提供了用户访问FPGA配置相关信号的途径。如果没有STARTUPE2原语,用户也无法访问SPI/BPI FLASH。在介绍Xilinx 原语STARTUPE2之前,先介绍两个全局的控制信号GSR和GTS,它们一般用来控制FPGA配置期间所有的寄存器,触发器和I/O管脚的状态。
1. GSR和GTS
GSR(Global set reset)被拉高时,异步地将所有的寄存器和触发器都设置到它们的初始状态。
GTS(Global 3-state)被拉高时,异步强迫所有的I/O管脚拉成高阻(High-Z,3态)。
GSR和GTS都是对全局的寄存器,触发器或是I/O管脚进行复位/设置,并且使用时不需要通用布线资源。GSR在FPGA配置期间会被自动启用,进而确保FPGA在启动时是已知状态。如果是在FPGA配置完成后仍然需要对全局的寄存器,触发器或是I/O管脚进行复位/设置,GSR和GTS都可以用STARTUPE2原语来设置实现。除了GSR和GTS外,STARTUPE2中还有其它在FPGA配置时使用的信号的设置。
2. STARTUPE2原语
STARTUPE2 原语提供了用户逻辑和配置逻辑控制和状态信号之间的接口,即用户可以通过STARTUPE2来访问配置逻辑控制和状态信。 许多引脚与启动顺序有关,包括允许用户指定启动时钟的 CLK 信号。 STARTUPE2 可以在设计中实例化,进而在设备运行期间提供用户对选定配置信号的控制。
2.1 STARTUPE2原语模板
原语的使用,可以在点击Vivado的文本编辑器的language template(灯泡状图标),打开原语使用界面,STARTUPE2所在的路径是点开language temp之后,找到Verilog > Device Primitive Instantiation > Artix-7 > Config/BSCAN Components > STARTUP Block (STARTUPE2),如图1所示。
图1 STARTUPE2原语
2.1 STARTUPE2原语端口
STARTUPE2原语的端口示意图如图2所示,STARTUPE2块左侧的信号都是输入,右侧的信号都是输出。其端口的例化如下:

图2 STARTUPE2原语端口
// STARTUPE2: STARTUP Block
// Artix-7
// Xilinx HDL Language Template, version 2018.2
STARTUPE2 #(
.PROG_USR("FALSE"), // Activate program event security feature. Requires encrypted bitstreams.
.SIM_CCLK_FREQ(0.0) // Set the Configuration Clock Frequency(ns) for simulation.
)
STARTUPE2_inst (
.CFGCLK(CFGCLK), // 1-bit output: Configuration main clock output
.CFGMCLK(CFGMCLK), // 1-bit output: Configuration internal oscillator clock output
.EOS(EOS), // 1-bit output: Active high output signal indicating the End Of Startup.
.PREQ(PREQ), // 1-bit output: PROGRAM request to fabric output
.CLK(CLK), // 1-bit input: User start-up clock input
.GSR(GSR), // 1-bit input: Global Set/Reset input (GSR cannot be used for the port name)
.GTS(GTS), // 1-bit input: Global 3-state input (GTS cannot be used for the port name)
.KEYCLEARB(KEYCLEARB), // 1-bit input: Clear AES Decrypter Key input from Battery-Backed RAM (BBRAM)
.PACK(PACK), // 1-bit input: PROGRAM acknowledge input
.USRCCLKO(USRCCLKO), // 1-bit input: User CCLK input
// For Zynq-7000 devices, this input must be tied to GND
.USRCCLKTS(USRCCLKTS), // 1-bit input: User CCLK 3-state enable input
// For Zynq-7000 devices, this input must be tied to VCC
.USRDONEO(USRDONEO), // 1-bit input: User DONE pin output control
.USRDONETS(USRDONETS) // 1-bit input: User DONE 3-state enable output
);
// End of STARTUPE2_inst instantiation
原语中属性部分的描述如表1所示:
表1
| 管脚名称 | 输入/输出类型 | 描述 |
| CLK | 输入 | 用户启动时钟引脚。 驱动器件启动序列时钟的 FPGA输入。 为启动序列提供用户定义的 CCLK。 |
| GSR | 输入 | GSR引脚是FPGA的有效高电平输入,声明异步设置/复位,可用于重新初始化 CLB 触发器。这里不推荐将GSR拉高(应将GSR拉低以禁用)。 GSR 信号跨越整个器件并与用户时钟异步释放。 由于器件上的异步释放和偏移,触发器很可能不会在同一时钟周期内释放,并且可能产生亚稳态。 使用 GSR 的应用程序应在 GSR拉高之前停止所有时钟,和/或在 GSR 拉高之后重新配置器件。 相同的触发器初始化(设置/复位)在启动之前的配置期间安全地执行。 |
| GTS | 输入 | 全局三态引脚。 FPGA的高电平有效输入,将所有用户 I/O管脚(配置 bank 除外)置于高阻态(High-Z)。 GTS在配置期间总是被拉高。 对于大多数应用,该引脚应拉低。 |
| KEYCLEARB | 输入 | 从电池供电的 RAM 中清除 AES 解密密钥。FPGA低电平有效输入。 该引脚的 TPROGRAM (FPGA器件datasheet中上电编程的时间)延迟期间保持低电平时,会从电池供电的 RAM (BBRAM) 中擦除解密密钥的内容。(相关内容参考文档Xilinx FPGA 上电配置官方文档) |
| PACK | 输入 | PROGRAM_B 或 JPROGRAM(JTAG相关管脚和指令)信号的确认。 作为FPGA 输入来确认PROGRAM_B 信号的拉高并允许 PROGRAM_B 状态机的其余部分继续重置 FPGA。 此引脚仅在设置了 PROG_USR 属性时启用。 |
| PREQ | 输出 | PROGRAM_B 脉冲或 JPROGRAM REQuest 到 FPGA 逻辑。 该引脚是 PROGRAM_B 状态机复位器件的请求,允许对 PROGRAM_B 请求进行门控,直到处于可以完成复位的状态。 此引脚仅在设置了 PROG_USR 属性时启用。 |
| USRCCLKO | 输入 | CCLK 引脚。 在FPGA配置之后,FPGA 输入来驱动自定义逻辑生成的时钟频率到 FPGA CCLK 引脚。 用于外部 SPI FLASH设备的配置后访问。 |
| USRCCLKTS | 输入 | 用户 CCLK 三态使能到 CCLK 引脚。FPGA的高电平有效输入,在FPGA配置之后使用时将 FPGA CCLK 引脚置于高阻态。 对于大多数应用,该引脚应被拉低。 |
| USRDONEO | 输入 | DONE(JTAG相关管脚) 引脚输出值。 连接到 FPGA DONE 引脚的 FPGA输入。 |
| USRDONETS | 输入 | 用户 DONE 三态使能 DONE 引脚。 FPGA 高电平有效输入,使 DONE 进入高阻态。 通常被拉低来启用 DONE。 |
| CFGCLK | 输出 | 配置逻辑主时钟输出。 FPGA输出信号。 从专用内部环形振荡器(ring oscillator)输出时钟信号,典型频率由比特流 ConfigRate 选项定义。 输出仅在配置期间有效,并且在启用 Persist (一种配置和回读的模式) 的主模式下有效。 |
| CFGMCLK | 输出 | 配置内部振荡器时钟输出。 FPGA 输出的信号。 从具有典型 65 MHz 频率的专用内部环形振荡器输出的时钟信号。 |
| EOS | 输出 | End of Startup。高电平有效输出将 EOS 标志回显到 FPGA中。 可用作指示 FPGA 准备运行的复位信号。 |
关于USRCCLKO的补充说明:
STARTUPE2 原语上的 USRCCLKO 输入允许用户在FPGA配置后驱动 CCLK 引脚。 当两者(FPGA配置和用户配置)都使用时,USRCCLKO 还可以为 POST_CRC 回读逻辑提供时钟。 从内部 USRCCLKO 到 CCLK 引脚的延迟在datasheet中定义为 TUSRCCLKO。 在设置完成后(End of Startup)后USRCCLKO 上的前三个时钟周期用于切换时钟源,不会在外部 CCLK 引脚上输出,这样有助于防止在从内部振荡器到用户时钟的转换中出现 CCLK 毛刺。 但是如果使用外部主控 CCLK 管脚EMCCLK(外部时钟) 来配置FPGA,它将继续在 CCLK 上输出,直到 USRCCLKO 的三个时钟周期允许转换到新的用户时钟。