dde29 0 30 октября, 2023 Опубликовано 30 октября, 2023 (изменено) · Жалоба Стоит задача: реализовать конфигурацию ПЛИС (Kintex UltraScale) с интерфейсом PCI-Express, позволяющую загружать пользовательскую конфигурацию (user-logic), через приложение ПК посредством PCI-Express. Т.е. при подаче питания в ПЛИС конфигурируется только ядро PCIe (pcie-core), позволяющее операционной системе сконфигурировать устроство. Далее, уже GUI-приложение в любой момент загружает user-logic. У меня возникли проблемы. Опишу ход своих действий дабы местные гуру в данном вопросе подсказали, что я сделал не так. Руководствовался документом PG156: UltraScale Devices Gen3 Integrated Block for PCI Express v4.4 Сразу скажу, что уже создана обычная конфигурация с pcie-core и user-logic. Налажено взаимодействие между ядром и логикой, а также между приложением ПК и устройством. Т.е. проблем с конфигурации самого IP-ядра не было (вернее они были, но решены 🙂 ) - устройство определяется системой при включении. В wizard IP UltraScale Devices Gen3 Integrated Block for PCI Express v4.4 мне следует обратить внимание на следующую опцию: Tandem Configuration or Partial Reconfiguration, которая предлагает следующие варианты: - None - Tandem - Tandem with Field Update - PR over PCIe Под пунктом Tandem понимается два варианта: Tandem PROM и Tandem PCIe. Tandem PROM: создается один bitstream, но внутри он логически разделен на pcie-core и user-logic. Этот bitstream загружается целиком в конфигурационную флеш, посредством программатора или иным способом. При подаче питания первым делом в ПЛИС загружается pcie-core, чтобы успеть, в установленные стандартом, 100мс. Далее, загружается user-logic и устройство становится работоспособным. Проверил - все так и есть. Tandem PCIe: создается два bitstream: tandem1 и tandem2. Tandem1 содержит только pcie-core (на самом деле помимо самого ядра, еще и чуть-чуть окружающей логики) и загружается во флеш. При подаче питания загружается в ПЛИС pcie-core и устройство становится доступным в операционной системе (распознается). В любой момент через особый интерфейс MCAP приложение на ПК может загрузить tandem2, содержащий user_logic и устройство становится работоспособным. Проверил - все так и есть. Казалось бы - БИНГО, проблема решена! Рано радовался, так как создается битстрима то два, но логически они все равно между собой жестко связаны. При изменении в проекте что-то, что касается только user-logic и перекомпиляции опять таки создается два битстрима, и новый tandem2 со старым tandem1 уже не фурычит... Тогда я начал разбираться с Tandem with Field Update: насколько я понял это то, что мне нужно (но это не точно 🙂 ). 1. Сгенерировал IP-корку; 2. Создал template-проект на основе IP Example Design (чтобы уж точно быть уверенным в том, что проект рабочий); 3. При этом создается такой проект, который нужно компилировать в непроектом режиме (non-project). Т.е. предоставляются скрипты (field_update_scripts), запуская которые проект в нужном нам виде компилируется. Имеется главный скрипт, который запускает когда нужно остальные скрипты - design_field_updates.tcl Главное в нем нужно обратить внимание на строки: # Steps for the static portion of the design set runStaticSynth 1 # Steps for the update version 1 portion of the design dependent on having completed runSynthStatic. set runUpdateVer1Synth 1 set runUpdateVer1Impl 1 set runUpdateVer1Bitstreams 1 # Steps for the update version 2 portion of the design dependent on having completed runImplUpdateVer1. set runUpdateVer2Synth 0 set runUpdateVer2Impl 0 set runUpdateVer2Bitstreams 0 # Steps for PR Verify across all Update versions set runPrVerify 0 Т.е. скрипт может создать две конфигурации - Ver1 и Ver2. Насколько я понял Ver1 - это именно то, что нужно записать во флеш и оно будет стартовать первым, т.е. pcie-core. Ver2 - это user-logic. Сначала нужно создать Ver1 записать его на флеш, а потом, проинвертировав флаги скрипта, создать Ver2 - это и будет то, что нужно загружать посредством PCI-Express. Проделав все, как я думаю, как положено я получил следующие файлы: ver1_tpcie_tandem1.bin ver1_tpcie_tandem2.bin ver1_tpcie_update_region_partial.bin ver1_tpcie_update_region_partial_clear.bin ver1_tprom.bin ver1_tprom_update_region_partial.bin ver1_tprom_update_region_partial_clear.bin ver1_tpcie_tandem1.bit ver1_tpcie_tandem2.bit ver1_tpcie_update_region_partial.bit ver1_tpcie_update_region_partial_clear.bit ver1_tprom.bit ver1_tprom_update_region_partial.bit ver1_tprom_update_region_partial_clear.bit ver1_tpcie_write_bitstream.log ver1_tprom_write_bitstream.log ver1_tpcie_tandem1.mcs ver1_tprom.mcs ver1_tpcie_tandem1.prm ver1_tprom.prm Насколько я понял, сначала я должен загрузить во флеш ver1_tpcie_tandem1.mcs. Причем при перезагрузки питания системы, PCIe устройство у меня должно определиться в системе - этого не произошло. НО! Если я загружаю напрямую в ПЛИС ver1_tpcie_tandem1.bit, а затем перезагружаю на горячую систему (чтобы ОС опросила устройства), то все ОК - мое устройство определяется. Т.е. pcie-core сформировано верно. Где-то проблема в процессе старта системы. Но где именно я пока не понял. Может местные гуру - подскажут где я свернул не туда) Ну помимо того, что я в принципе связался с PCIe ))) P.S.: Vivado 2018.1 - Kintex UltraScale xcku060 Изменено 30 октября, 2023 пользователем dde29 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dde29 0 1 ноября, 2023 Опубликовано 1 ноября, 2023 (изменено) · Жалоба Выложу архив сгенерированного template-проекта в режиме Tandem with Field Updates https://disk.yandex.ru/d/AI_ZLjtWQkbeXA В папке field_update_script расположены скрипты для генерации файлов прошивки В папке Bitstreams находятся уже сгенерированные файлы для Ver1. Это вроде как и должно быть ядро pcie Но, повторюсь, загружая во флеш файл ver1_tpcie_tandem1.mcs. При сбросе питания загрузки конфигурации в ПЛИС не происходит (пин DONE = 0) Но, в тоже время загрузив в ПЛИС мимо флеш файл ver1_pcie_tandem1.bit и после горячей перезагрузки ОС - система определяет плату. Почему не работает вариант с mcs до сих пор не разобрался... Вопрос остановился уже на месте - почему формат MCS не загружается в ПЛИС (DONE = 0, STARTUP_STATE = 0, EOS = 0). Что ему мешает? FLASH BPIx16 подключена к банку 65, к нему же подключен сигнал PERSTN на пин K22 Изменено 1 ноября, 2023 пользователем dde29 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dde29 0 2 ноября, 2023 Опубликовано 2 ноября, 2023 · Жалоба Нашел косяк, почему загруженная прошивка MCS не конфигурировалась в ПЛИС: В одном и скрипте generate_bitstreams.tcl нашел фрагмент, описывающий настройки при генерации MCS: # BPI Flash Programming set_property CONFIG_MODE BPI16 [current_design] set_property BITSTREAM.CONFIG.BPI_SYNC_MODE Type1 [current_design] set_property BITSTREAM.CONFIG.CONFIGRATE 9 [current_design] set_property CONFIG_VOLTAGE 1.8 [current_design] set_property CFGBVS GND [current_design] # Generate Tandem PCIe Bitstreams if { [lsearch -exact $bitstreamTypes "TandemPCIe"] >= 0 } { set_property HD.OVERRIDE_PERSIST False [current_design] set_property HD.TANDEM_BITSTREAMS Separate [current_design] write_bitstream -force -bin_file -file ${outputPrefix}_tpcie > ${outputPrefix}_tpcie_write_bitstream.log # Generate Flash Files Example. This must be updated to match your board and flash settings. ############################################################################### # Flash Programming Example Settings: Modify as required by your design. ############################################################################### write_cfgmem -force -format mcs -interface bpix16 -size 256 -loadbit "up 0x0 ${outputPrefix}_tpcie_tandem1.bit" ${outputPrefix}_tpcie_tandem1.mcs } Проверил каждую строчку... Смутил режим загрузки: BITSTREAM.CONFIG.BPI_SYNC_MODE Type1 Что это за Type1 вообще. Порылся в документации и нашел описание: Sets the BPI synchronous configuration mode for different types of BPI flash devices. Disable (the default) disables the synchronous configuration mode. Type1 enables the synchronous configuration mode and settings to support the Micron G18(F) family. Type2 enables the synchronous configuration mode and settings to support the Micron (Numonyx) P30 and P33 families. Моя конфигурационная флеш никак не относилась ни к семейству G18 ни к P30/P33. Поэтому изменив значение параметра "Type1" на "Disable" и прошивка ver1_tpcie_tandem1.mcs стала правильно загружаться в ПЛИС, сигнал DONE устанавливается в 1 и плата начала определяться в системе... Буду идти дальше в плане загрузки user-logic в ПЛИС... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться