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).
Командная строка для создания образа загрузчика:
В данном примере создание образа осуществляется в соответствии с содержимым конфигурационного файла bld.bif
, который в простейшем случае описывает только образ загрузчика:
Для удобства и автоматизации процесса сборки конфигурационный файл *.bif
генерируется автоматически, указывая корректный путь к bld.elf
.
FPGA Bitstream Image🔗
Образ битстрима ПЛИСа формируется из файла битстрима (*.bit
) путём создания файла для программирования загрузочной флешь памяти (*.bin
или *.mcs
файлы, последний по факту является файлом формата Intel HEX) и дополнения его служебными полями, в результате чего получается двоичный файл, содержащий три части:
header
;bitstream_data
;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
Типовой вариант