mirror of https://github.com/openXC7/prjxray.git
132 lines
5.4 KiB
ReStructuredText
132 lines
5.4 KiB
ReStructuredText
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
|