| 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 |