Flash Images🔗

Image Map🔗

Загрузочная QSPI флешь память содержит три загрузочных образа: Bootloader Image, FPGA Bitstream Image и Application Program Image. Размещение образов представлено в Таб. 1:

Name Address Max Size Offset
Bootloader Image 0x0000_0000 256k 0x0000_0000
FPGA Bitstream Image 0x0004_0000 4M 0x0004_0000
Application Program Image 0x0044_0000 1M 0x0040_0000

Таб. 1  Image Map

Bootloader Image🔗

Образ загрузчика формируется утилитой bootgen, входящей в состав пакета Vitis. В процессе сборки проекта образ автоматически создаётся после успешного получения исполняемого файла загрузчика bld.elf. Образ содержит заголовок и данные – подробнее с форматом образа, процессом его создания и использованием можно ознакомиться в официальной документации (UG585 и UG821).

Командная строка для создания образа загрузчика:

<path-to-vitis>/bin/bootgen -arch zynq -image <path-to-bif>/bld.bif -w -o <path-to-result>/bld.bin

В данном примере создание образа осуществляется в соответствии с содержимым конфигурационного файла bld.bif, который в простейшем случае описывает только образ загрузчика:

bld_image:
{
    [bootloader] <path-to-bld.elf>/bld.elf
}

Для удобства и автоматизации процесса сборки конфигурационный файл *.bif генерируется автоматически, указывая корректный путь к bld.elf.

FPGA Bitstream Image🔗

Образ битстрима ПЛИСа формируется из файла битстрима (*.bit) путём создания файла для программирования загрузочной флешь памяти (*.bin или *.mcs файлы, последний по факту является файлом формата Intel HEX) и дополнения его служебными полями, в результате чего получается двоичный файл, содержащий три части:

  1. header;
  2. bitstream_data;
  3. trailer.

Рис. 1 FPGA Bitstream Image

Заголовок является 32-разрядным целым числом, значение которого указывает размер битстрима в байтах.

Трейлер содержит значение контрольной суммы битстрима, вычисленной по алгоритму CRC32 (образующий полином 0x04C11DB7 – тот самый, который используется в Ethernet).

При загрузке битстрима в ПЛИС производится вычисление контрольной суммы bitstream_data, которая сравнивается со значением поля trailer с целью проверки целостности данных битстрима.

Команда для создания файла конфигурации ПЛИС:

write_cfgmem  \
-format bin \
-size 128 \
-interface SPIx1 \
-loadbit {up 0x00000000 "<path-to-bit-file>/<bit-file>.bit" } \
-file "<path-to-out-file>/<out-file>.mcs"

Далее полученный файл конфигурации дополняется заголовком и трейлером, что в результате даёт файл образа битстрима, который и программируется в QSPI флешь память по указанному выше адресу.

Application Program Image🔗

Образ целевой программы состоит из блоков, каждый из которых имеет заголовок и собственно данные блока, последним словом образа является контрольная сумма CRC32 всех данных образа.

Поля данных блока формируется из секций исполняемого файла программы (*.elf), помеченных атрибутом LOAD, к таковым относятся:

  • .text;
  • .data;
  • .rodata;
  • .init_array.

Каждый блок снабжается заголовком, который используется загрузчиком для того, чтобы определить, по какому адресу и в каком количестве загружать данные блока. Заголовок состоит из трёх полей:

Name Size, bits Description
address 32 Адрес в целевой памяти, по которому нужно загрузить данные блока (размер блока данных
всегда выровнен на границу 32-разрядного слова
size 32 Количество данных в байтах (размер кратен размеру 32-разрядного слова)
attr 32 Атрибуты блока. В настоящее время поддерживается только флаг-признак последнего блока,
при обнаружения которого загрузчик прекращает процесс после загрузки текущего блока

Рис. 2 Block Header

Типовой вариант