Bitstream structure — XC9500XL/XV
The main differences from XC9500 are:
The UIM wire-AND area is completely gone, only the main areas exist.
The main area has 108 rows per FB instead of 72.
Unprogrammed fuse state is 0
, programmed fuse state is 1
.
Thus, the sense of every bitstream bit is inverted from the XC9500 version.
While in XC9500 all areas are loaded sequentially, in XC9500XL/XV the areas
are loaded in parallel. Thus, the JTAG unit is not a byte, but a word of
size 8 * num_fbs
. Likewise, the bytes for each FB are interleaved
in the JED format.
On a high level, the whole bitstream is split into “areas”. Each FB
of the device corresponds to one area.
Each area is made of 108 “rows”. Each row is made of 15 “columns”.
Each column is made of 6 or 8 bits: columns 0-8 are made of 8 bits, while
columns 9-14 are made of 6 bits.
The low 6 bits of every column are used to store product term masks, and
the high 2 bits of columns 0-8 are used to store everything else.
When programmed or read via JTAG, the bitstream is transmitted as words.
Each word is 8 bits per FB. Each word of the bitstream has its address.
Not all addresses are valid, and valid addresses are not contiguous.
Address is 16 bits long, and is split to several fields:
The unprogrammed state of a bit on XC9500XL/XV is 0
.
The programmed state is 1
. Thus, whenever a boolean fuse is mentioned
in the documentation, the “true” value is actually represented as 1
in the bitstream.
Fuses — product terms
The product term masks are stored in bits 0-5 of every column and every row of the main area.
The formulas are as follows (unchanged from XC9500, but now with more rows):
FB[i].MC[j].PT[k].IM[l].P
is stored at:
row: l * 2 + 1
column: k + (j % 3) * 5
bit: j // 3
FB[i].MC[j].PT[k].IM[l].N
is stored at:
row: l * 2
column: k + (j % 3) * 5
bit: j // 3
Fuses — macrocells
Per-MC config fuses (that are not product term masks) are stored in bits 6-7 of
columns 0-8 of rows 12-49 of the main area. The formulas are as follows:
PT[0].ALLOC | 13 | 12 |
NONE | 0 | 0 |
SUM | 0 | 1 |
EXPORT | 1 | 0 |
SPECIAL | 1 | 1 |
PT[1].ALLOC | 15 | 14 |
NONE | 0 | 0 |
SUM | 0 | 1 |
EXPORT | 1 | 0 |
SPECIAL | 1 | 1 |
PT[2].ALLOC | 17 | 16 |
NONE | 0 | 0 |
SUM | 0 | 1 |
EXPORT | 1 | 0 |
SPECIAL | 1 | 1 |
PT[3].ALLOC | 19 | 18 |
NONE | 0 | 0 |
SUM | 0 | 1 |
EXPORT | 1 | 0 |
SPECIAL | 1 | 1 |
PT[4].ALLOC | 21 | 20 |
NONE | 0 | 0 |
SUM | 0 | 1 |
EXPORT | 1 | 0 |
SPECIAL | 1 | 1 |
IMPORT_UP_ALLOC | 23 |
EXPORT | 0 |
SUM | 1 |
IMPORT_DOWN_ALLOC | 24 |
EXPORT | 0 |
SUM | 1 |
EXPORT_CHAIN_DIR | 25 |
UP | 0 |
DOWN | 1 |
OE_MUX | 29 | 28 | 27 |
PT | 0 | 0 | 0 |
FOE0 | 0 | 0 | 1 |
FOE1 | 0 | 1 | 1 |
FOE2 | 1 | 0 | 1 |
FOE3 | 1 | 1 | 1 |
CLK_MUX | 34 | 33 |
FCLK1 | 0 | 0 |
FCLK2 | 0 | 1 |
FCLK0 | 1 | 0 |
PT | 1 | 1 |
CLK_INV | 35 |
Non-inverted | [0] |
CE_MUX | 37 | 36 |
NONE | 0 | 0 |
PT2 | 0 | 1 |
PT3 | 1 | 0 |
REG_INIT | 42 |
Non-inverted | [0] |
IOB_GND | 43 |
Non-inverted | [0] |
PT[0].HP | 45 |
Non-inverted | [0] |
PT[1].HP | 46 |
Non-inverted | [0] |
PT[2].HP | 47 |
Non-inverted | [0] |
PT[3].HP | 48 |
Non-inverted | [0] |
PT[4].HP | 49 |
Non-inverted | [0] |
Fuses — per-FB bits and globals
Per-FB bits are stored in row 78, columns 0-8, bits 6-7. The bits are (row, bit, column):
Row | Bit, column |
6 | 7 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
11 |
X | - | - | X | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
78 |
X | X | - | - | - | - | X | - | - | - | - | - | - | - | - | - | - | - |
WRITE_PROT | [11, 6, 0] |
Non-inverted | [0] |
READ_PROT | [11, 6, 3] |
Non-inverted | [0] |
ENABLE | [78, 6, 0] |
Non-inverted | [0] |
EXPORT_ENABLE | [78, 6, 1] |
Non-inverted | [0] |
PULLUP_DISABLE | [78, 6, 6] |
Non-inverted | [0] |
Global bits are stored in rows (2, 6, 7), columns 0-8, bits 6-7 of FB 0. The bits are (fb, row, bit, column):
FSR_INV | [0, 2, 6, 0] |
Non-inverted | [0] |
FCLK0_ENABLE | [0, 2, 6, 1] |
Non-inverted | [0] |
FCLK1_ENABLE | [0, 2, 6, 2] |
Non-inverted | [0] |
FCLK2_ENABLE | [0, 2, 6, 3] |
Non-inverted | [0] |
FOE0_ENABLE | [0, 2, 6, 4] |
Non-inverted | [0] |
FOE1_ENABLE | [0, 2, 6, 5] |
Non-inverted | [0] |
FOE2_ENABLE | [0, 2, 6, 6] |
Non-inverted | [0] |
FOE3_ENABLE | [0, 2, 6, 7] |
Non-inverted | [0] |
TERM_MODE | [0, 2, 6, 8] |
KEEPER | 0 |
FLOAT | 1 |
USERCODE | [0, 6, 7, 0] | [0, 6, 6, 0] | [0, 6, 7, 1] | [0, 6, 6, 1] | [0, 6, 7, 2] | [0, 6, 6, 2] | [0, 6, 7, 3] | [0, 6, 6, 3] | [0, 6, 7, 4] | [0, 6, 6, 4] | [0, 6, 7, 5] | [0, 6, 6, 5] | [0, 6, 7, 6] | [0, 6, 6, 6] | [0, 6, 7, 7] | [0, 6, 6, 7] | [0, 7, 7, 0] | [0, 7, 6, 0] | [0, 7, 7, 1] | [0, 7, 6, 1] | [0, 7, 7, 2] | [0, 7, 6, 2] | [0, 7, 7, 3] | [0, 7, 6, 3] | [0, 7, 7, 4] | [0, 7, 6, 4] | [0, 7, 7, 5] | [0, 7, 6, 5] | [0, 7, 7, 6] | [0, 7, 6, 6] | [0, 7, 7, 7] | [0, 7, 6, 7] |
Non-inverted | [31] | [30] | [29] | [28] | [27] | [26] | [25] | [24] | [23] | [22] | [21] | [20] | [19] | [18] | [17] | [16] | [15] | [14] | [13] | [12] | [11] | [10] | [9] | [8] | [7] | [6] | [5] | [4] | [3] | [2] | [1] | [0] |
DONE | [0, 11, 6, 6] |
Non-inverted | [0] |
The DONE
bit is only applicable to XC9500XV.