| Configuration | |
| ============= | |
| Within an FPGA, various memories (latches, block RAMs, distributed RAMs) | |
| contain the state of signal routing, :term:`BEL` configuration, and runtime | |
| storage. Configuration is the process of loading an initial state into all of | |
| these memories both to define the intended logic operations as well as set | |
| initial data for runtime memories. Note that the same mechanisms used for | |
| configuration are also capable of reading out the active state of these | |
| memories as well. This can be used to examine the contents of a block RAM or | |
| other memory at any point in the device's operation. | |
| Addressing | |
| ---------------- | |
| As described in :ref:`architecture_overview-label`, 7-Series FPGAs are constructed | |
| out of :term:`tiles <tile>` organized into :term:`clock domains <clock | |
| domain>`. Each tile contains a set of :term:`BELs <BEL>` and the memories used | |
| to configure them. Uniquely addressing each of these memories | |
| involves first identifying the :term:`horizontal clock row`, then the tile within | |
| that row, and finally the specific bit within the tile. | |
| :term:`Horizontal clock row` addressing follows the hierarchical structure described | |
| in :ref:`architecture_overview-label` with a single bit used to indicate top or bottom half | |
| and a 5-bit integer to encode the row number. Within the row, tiles are connected to | |
| one or more configuration busses depending on the type of tile and what configuration | |
| memories it contains. These busses are identified by a 3-bit integer: | |
| +---------+-------------------+---------------------+ | |
| | Address | Name | Connected tile type | | |
| +=========+===================+=====================+ | |
| | 000 | CLB, I/O, CLB | Interconnect (INT) | | |
| +---------+-------------------+---------------------+ | |
| | 001 | Block RAM content | Block RAM (BRAM) | | |
| +---------+-------------------+---------------------+ | |
| | 010 | CFG_CLB | ??? | | |
| +---------+-------------------+---------------------+ | |
| Within each bus, the connected tiles are organized into | |
| :term:`columns <column>`. A column roughly | |
| corresponds to a physical vertical line of tiles perpendicular to and centered over | |
| the horizontal clock row. Each column contains varying amounts of configuration data | |
| depending on the types of tiles attached to that column. Regardless of the amount, | |
| a column's configuration data is organized into a multiple of :term:`frames <frame>`. | |
| Each frame consists of 101 words with 100 words for the connected tiles and 1 word for | |
| the horizontal clock row. The 7-bit address used to identify a specific frame within | |
| the column is called the minor address. | |
| Putting all these pieces together, a 32-bit frame address is constructed: | |
| +-----------------+-------+ | |
| | Field | Bits | | |
| +=================+=======+ | |
| | Reserved | 31:26 | | |
| +-----------------+-------+ | |
| | Bus | 25:23 | | |
| +-----------------+-------+ | |
| | Top/Bottom Half | 22 | | |
| +-----------------+-------+ | |
| | Row | 21:17 | | |
| +-----------------+-------+ | |
| | Column | 16:7 | | |
| +-----------------+-------+ | |
| | Minor | 6:0 | | |
| +-----------------+-------+ | |
| CLB, I/O, CLB | |
| ^^^^^^^^^^^^^ | |
| Columns on this bus are comprised of 50 directly-attached interconnect tiles with various | |
| kinds of tiles connected behind them. Frames are striped across the interconnect tiles | |
| with each tile receiving 2 words out of the frame. The number of frames in a column | |
| depends on the type of tiles connected behind the interconnect. For example, interconnect | |
| tiles always have 26 frames and a CLBL tile has an additional 12 frames so a column of CLBs | |
| will have 36 frames. | |
| Block RAM content | |
| ^^^^^^^^^^^^^^^^^ | |
| As the name says, this bus provides access to the :term:`block RAM` contents. | |
| Block RAM configuration data is accessed via the CLB, I/O, CLB bus. The mapping | |
| of frame words to memory locations is not currently understood. | |
| CFG_CLB | |
| ^^^^^^^ | |
| While mentioned in a few places, this bus type has not been seen in any bitstreams for Artix7 | |
| so far. | |
| Loading sequence | |
| ---------------------- | |
| .. todo:: | |
| Expand on these rough notes. | |
| * Device is configured via a state machine controlled via a set of registers | |
| * CRC of register writes is checked against expected values to verify data | |
| integrity during transmission. | |
| * Before writing frame data: | |
| * IDCODE for configuration's target device is checked against actual device | |
| * Watchdog timer is disabled | |
| * Start-up sequence clock is selected and configured | |
| * Start-up signal assertion timing is configured | |
| * Interconnect is placed into Hi-Z state | |
| * Data is then written by: | |
| * Loading a starting address | |
| * Selecting the write configuration command | |
| * Writing configuration data to data input register | |
| * Writes must be in multiples of the frame size | |
| * Multi-frame writes trigger autoincrementing of the frame address | |
| * Autoincrement can be disabled via bit in COR1 register. | |
| * At the end of a row, 2 frames of zeros must be inserted before data for the next row. | |
| * After the write has finished, the device is restarted by: | |
| * Strobing a signal to activate IOB/CLB configuration flip-flops | |
| * Reactivate interconnect | |
| * Arms start-up sequence to run after desync | |
| * Desynchronizes the device from the configuration port | |
| * Status register provides detail of start-up phases and which signals are asserted | |
| Other | |
| ----- | |
| * ECC of frame data is contained in word 50 alongside horizontal clock row configuration | |
| * Loading will succeed even with incorrect ECC data | |
| * ECC is primarily used for runtime bit-flip detection |