| Bitstream format | |
| ================ | |
| Some documentation on the ECP5 bitstream format is published by Lattice themselves | |
| in th ECP5 sysCONFIG Usage Guide (TN1260_). | |
| .. _TN1260: http://www.latticesemi.com/~/media/LatticeSemi/Documents/ApplicationNotes/EH/TN1260.pdf | |
| Basic Structure | |
| ---------------- | |
| The ECP5 is primarily byte oriented and always byte aligned. Multi-byte words are always in big endian format. | |
| Before the start of the bitstream itself is a comment section, which starts with FF 00 and 00 FF. | |
| Inside it are several null-terminated strings used as metadata by Lattice. The start of the bitstream | |
| is demarcated by a preamable, 0xFFFFBDB3. This is then followed by a 0xFFFFFFFF dummy section and then the | |
| start of functional commands. | |
| At minimum, a bitstream command is an 8 bit command type field, then 24 bits of command information. | |
| The MSB of command information is set to 1 if a CRC16 follows the command. The other 23 bits are command-specific, | |
| but usually zeros. Then follows a command-specific number of payload bytes, and the CRC16 if applicable. | |
| The CRC16 is accumulated over all commands until a CRC16 check is reached. It is not reset at the end of commands | |
| without a CRC16 check - except the ``LSC_RESET_CRC`` command, and after the actual bitstream payload | |
| (``LSC_PROG_INCR_RTI``). | |
| The CRC16 is calculated using the polynomial 0x8005 with no bit reversal. This algorithm is sometimes known as | |
| "CRC16-BUYPASS". | |
| NB: Lattice's documents talk about the CRC16 being flipped. This is based on standard | |
| CRC16 code with reversal, effectively performing double bit reversal. CRC16 code with no | |
| bit reversal at all matches the actual format. | |
| Control Commands | |
| ------------------ | |
| Control commands seen in a typical uncompressed, unencrypted bitstream are: | |
| +-------------------------------+-----+--------------------------+---------------------------------------------------+ | |
| | Command | Hex | Parameters | Description | | |
| +==========================+====+=====+==========================+===================================================+ | |
| | Dummy | FF | N/A | Ignored, used for padding | | |
| +-------------------------------+-----+--------------------------+---------------------------------------------------+ | |
| | ``LSC_RESET_CRC`` | 3B | 24 bit info: all 0 | Resets the CRC16 register | | |
| +-------------------------------+-----+--------------------------+---------------------------------------------------+ | |
| | ``VERIFY_ID`` | E2 | - 24 bit info: all 0 | This checks the actual device ID against the given| | |
| | | | - 32 bit device JTAG ID | value and fails if they do not match. | | |
| +-------------------------------+-----+--------------------------+---------------------------------------------------+ | |
| | ``LSC_PROG_CNTRL0`` | 22 | - 24 bit info: all 0 | This sets the value of device control register 0 | | |
| | | | - 32 bit CtlReg0 value | Normally 0x40000000 | | |
| +-------------------------------+-----+--------------------------+---------------------------------------------------+ | |
| | ``LSC_INIT_ADDRESS`` | 46 | 24 bit info: all 0 | Resets the frame address register | | |
| +-------------------------------+-----+--------------------------+---------------------------------------------------+ | |
| | ``ISC_PROGRAM_SECURITY`` | CE | 24 bit info: all 0 | Program the security bit (prevents readback (?) ) | | |
| +-------------------------------+-----+--------------------------+---------------------------------------------------+ | |
| | ``ISC_PROGRAM_USERCODE`` | C2 | - CRC bit set, 23 bits 0 | Sets the value of the USERCODE register | | |
| | | | - 32 bit USERCODE value | | | |
| +-------------------------------+-----+--------------------------+---------------------------------------------------+ | |
| | ``ISC_PROGRAM_DONE`` | 5E | 24 bit info: all 0 | End of bitstream, set DONE high | | |
| +-------------------------------+-----+--------------------------+---------------------------------------------------+ | |
| Configuration Data | |
| ------------------- | |
| The FPGA configuration data itself is programmed by using command ``LSC_PROG_INCR_RTI`` (0x82). Following this command, | |
| there are some setup bits: | |
| - 1 bit: CRC16 comparison flag, normally set | |
| - 1 bit: CRC16 comparison at end flag, normally cleared = CRC check after every frame | |
| - 1 bit: dummy bits setting, normally cleared = include dummy bits in bitstream | |
| - 1 bit: dummy byte setting, normally cleared = use following bits as number of dummy bytes | |
| - 4 bits: number of dummy bytes between frames, usually 1 | |
| - 16 bits: number of configuration frames | |
| This is then followed by a number of frames, each in the following format: | |
| - The configuration frame itself, such that bit 0 of the first byte sent is the MSB of the frame, | |
| bit 7 of the first byte the MSB-7 and bit 0 of the last byte (if there are no dummy bits) being the LSB of the frame. | |
| - Any dummy bits needed to pad the frame to a whole number of bytes | |
| - A CRC-16 checksum: | |
| - For the first frame, this also covers any other commands sent | |
| before the programming command but after a CRC reset, and the programming command itself. | |
| - For subsequent frames, this excludes dummy bytes between frames | |
| - Dummy 0xFF bytes, usually only 1 | |
| The highest numbered frame in the chip is sent first. | |
| Separate commands are used if EBR needs to be configured in the bitstream. ``EBR_ADDRESS`` (0xF6) is used to select the | |
| EBR to program and the starting address in the EBR; and ``LSC_EBR_WRITE`` (0xB2) is used to program the EBR itself using | |
| 72-bit frames. The specifics of these still need to be documented. | |
| Device-Specific Information | |
| ------------------------------ | |
| +-----------+-------------+--------+-----------------------+----------------------+ | |
| | Device | Device ID | Frames | Config Bits per Frame | Dummy Bits per Frame | | |
| +===========+=============+========+=======================+======================+ | |
| | LFE5U-25 | 0x41111043 | 7562 | 592 | 0 | | |
| +-----------+-------------+--------+-----------------------+----------------------+ | |
| | LFE5UM-25 | 0x01111043 | 7562 | 592 | 0 | | |
| +-----------+-------------+--------+-----------------------+----------------------+ | |
| | LFE5U-45 | 0x41112043 | 9470 | 846 | 2 | | |
| +-----------+-------------+--------+-----------------------+----------------------+ | |
| | LFE5UM-45 | 0x01112043 | 9470 | 846 | 2 | | |
| +-----------+-------------+--------+-----------------------+----------------------+ | |
| | LFE5U-85 | 0x41113043 | 13294 | 1136 | 0 | | |
| +-----------+-------------+--------+-----------------------+----------------------+ | |
| | LFE5UM-85 | 0x01113043 | 13294 | 1136 | 0 | | |
| +-----------+-------------+--------+-----------------------+----------------------+ |