STARTUPE3 Primitive - XAPP1280

UltraScale FPGA Post-Configuration Access of SPI Flash Memory using STARTUPE3 (XAPP1280)

Document ID
XAPP1280
Release Date
2024-08-29
Revision
2.1.2 English

The dedicated AMD UltraScaleā„¢ FPGA SPI interface signals (RDWR_FCS_B_0, CCLK_0, D03_0, D02_0, D01_DIN_0, D00_MOSI_0) reside in Bank0. By default, these pins are not accessible for post-configuration access of the SPI flash memory. To access these dedicated pins, the design instantiates the STARTUPE3 primitive. The following table shows the internal logic signal name associated with each dedicated configuration pin, the STARTUPE3 port it connects to, and the corresponding FPGA output pin location.

Table 1. STARTUPE3SPI Interface Dedicated Pins
Logic Signal STARTUPE3 Port Dedicated Pin Name FPGA (U1) Pin Location
spi_0_ss_o_0(0) FCSBO RDWR_FCS_B_0 U7
spi_0_sck_o USRCCLKO CCLK_0 AA9
flash_dq_o(3) DO[3] D03_0 Y7
flash_dq_o(2) DO[2] D02_0 AA7
flash_dq_o(1) DO[1] D01_DIN_0 AB7
flash_dq_o(0) DO[0] D00_MOSI_0 AC7
flash_dq_i(3) DI[3] D03_0 Y7
flash_dq_i(2) DI[2] D02_0 AA7
flash_dq_i(1) DI[1] D01_DIN_0 AB7
flash_dq_i(0) DI[0] D00_MOSI_0 AC7

The STARTUPE3 primitive allows a user design to drive or 3-state the FPGA outputs on the dedicated pins by connecting the design to the appropriate STARTUPE3 ports. In addition, D[03:00] can be read as inputs. The dedicated FPGA pins are accessed by the user design through the .USRCCLKO, .USRCCLKTS, .DO, .DTS, .FCSBO, and .FCSBTS ports of the STARTUPE3 block. The data signals returning from the SPI flash are provided to the user design through the .DI port. The UltraScale FPGA pins CCLK, D00_MOSI_0, D01_DIN_0, D02_0, D03_0, and RDWR_FCS_B_0 are dedicated and not assigned in the constraints file because their physical locations cannot be altered.

For example, forwarding the spi_0_sck_o externally to the flash is accomplished by connecting it to the USRCCLKO port of the STARTUPE3 instantiation. There is no explicit port declaration for sck at the top level of the design because the CCLK output of the FPGA can only be accessed via connections to the STARTUPE3 block. The STARTUPE3 port USRCCLKTS controls the enable of the USRCCLKO, and is tied to 0 so that the CCLK signal is always actively driven out to the SPI flash memory. The signals going from the internal logic through the STARTUPE3 block to the dedicated external pins of the FPGA are not shown as top level ports of the design, and do not appear in the .xdc file.

Since the connections between the AXI Quad SPI core and the STARTUPE3 primitive are made inside the top-level design_1_wrapper.vhd wrapper, the STARTUPE3 block does not appear in the IP Integrator block design. The instantiation of the STARTUPE3 is shown below:

-- STARTUPE3: STARTUP Block
-- Kintex UltraScale+
-- Xilinx HDL Language Template, version 2022.2
STARTUPE3_inst : STARTUPE3
 -----------------------
 generic map
 (
 PROG_USR => "FALSE", -- Activate program event security feature. Requires encrypted bitstreams.
 SIM_CCLK_FREQ => 0.0 -- Set the Configuration Clock Frequency (ns) for simulation
 )
 port map
 (
 USRCCLKO => spi_0_sck_o, -- 1-bit input: User CCLK input
 ----------
 CFGCLK => open, -- 1-bit output: Configuration internal oscillator clock output
 CFGMCLK => open, -- 1-bit output: Configuration internal oscillator clock output
 EOS => startupe3_eos, -- 1-bit output: Active-High output signal indicating the End Of Startup
 PREQ => open, -- 1-bit output: PROGRAM request to fabric output
 ----------
 DO => flash_dq_o, -- 4-bit input: Allows control of the D pin output
 DI => flash_dq_i, -- 4-bit output: Allow receiving on the D input pin
 DTS => flash_dq_t, -- 4-bit input: Allows tristate of the D pin
 FCSBO => spi_0_ss_o_0(0),-- 1-bit input: Controls the FCS_B pin for flash access
 FCSBTS => spi_0_ss_t, -- 1-bit input: Tristate the FCS_B pin
 GSR => '0', -- 1-bit input: Global Set/Reset input (GSR cannot be used for the port)
 GTS => '0', -- 1-bit input: Global 3-state input (GTS cannot be used for the port name)
 KEYCLEARB => '1', -- 1-bit input: Clear AES Decrypter Key input from Battery-Backed RAM (BBRAM)
 PACK => '0', -- 1-bit input: PROGRAM acknowledge input
 USRCCLKTS => spi_0_sck_t, -- 1-bit input: User CCLK 3-state enable input
 USRDONEO => '1', -- 1-bit input: User DONE pin output control
 USRDONETS => '1' -- 1-bit input: User DONE 3-state enable output
 );
-- End of STARTUPE3_inst instantiation