dimka76 59 7 октября, 2022 Опубликовано 7 октября, 2022 · Жалоба Здравствуйте. Кто-нибудь делал для Gowin обновление конфигурации по JTAG с микроконтроллера ? Что-то описание у них мутное какое-то. В описании одно пишут. Создал SVF файл - так как-то иначе все выходит. У меня пока что получилось только ID и регистр статуса прочитать. Теперь бьюсь со стиранием - никак не выходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 7 октября, 2022 Опубликовано 7 октября, 2022 · Жалоба 1 hour ago, dimka76 said: Здравствуйте. Кто-нибудь делал для Gowin обновление конфигурации по JTAG с микроконтроллера ? Что-то описание у них мутное какое-то. В описании одно пишут. Создал SVF файл - так как-то иначе все выходит. У меня пока что получилось только ID и регистр статуса прочитать. Теперь бьюсь со стиранием - никак не выходит. Сделано и работает. bin файл из папки \impl\pnr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 7 октября, 2022 Опубликовано 7 октября, 2022 · Жалоба On 10/7/2022 at 12:16 PM, Realking said: Сделано и работает. bin файл из папки \impl\pnr Я в исходном сообщении забыл указать, что интересует программирование встроенной FLASH, а не внешней. Вы каким документом пользовались ? У вас какая марка FPGA ? У меня GW1N-9 В UG290 в описании алгоритма стирания FALSH написано Quote 7. Move the state machine in turn: Run-Test-ldle -> Select-DR-Scan-> Capture-DR -> Shift-DR -> Transfer 32 bits-> Exit1-DR -> Update-DR -> Run-Test-ldle (This step only applied to GW1N-4.Skip this step for other devices); Но в сгенерированном SVF файле этот пункт присутствует. Пробовал выполнять это действие, пробовал не выполнят. Все равно не стирается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 7 октября, 2022 Опубликовано 7 октября, 2022 · Жалоба GW1N-9 но я программирую не флэш, а саму ПЛИС. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 7 октября, 2022 Опубликовано 7 октября, 2022 · Жалоба Заработало у меня стирание. Пропустил в документации UG290 одно важное замечание в разделе Read ID CODE Instance Quote 4. Move the state machine, back to Run-Test-Idle after going from Exit1-IR to Update-IR, and then run the state machine at least 3 clock cycles in Run-Test-Idle. После добавление этих дополнительны тактов в конце загрузки регистра инструкций стирание заработало. Только вот ни на диаграмме состояний (Figure 6-10), ни на временной диаграмме (Fugure 6-8 и Figure 6-9) это никак не отображено. Также ничего об этом не сказано в разделе Instruction Register and Data register. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ask78 0 13 ноября, 2022 Опубликовано 13 ноября, 2022 · Жалоба Доброго дня! Задача у меня та же: программирование GW1N-9 микроконтроллером через JTAG. Благодарю за подсказку выше (про 3 clock cycles), получилось прошить SRAM, наконец-то DONE взлетел! Далее пытаюсь прошить внутренний FLASH, никак не получается. Есть много сомнений и вопросов: 1) Bitstream (.bin) должен быть одинаковый для SRAM и FLASH ? 2) Должна ли быть разница в порядке бит каждого байта (для SRAM - MSB, для FLASH - LSB) ? 3) Что делать с 4-х байтовым autoboot-pattern (ничего/ вставить в начале/ заменить в начале 4 байта) ? 4) Что такое address ? Индекс 256-байтного блока сдвинутый на 6 ? Это конечно не все возможные вопросы... ))) Но может кто-нибудь прояснит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 14 ноября, 2022 Опубликовано 14 ноября, 2022 · Жалоба On 11/13/2022 at 1:05 PM, Ask78 said: 1) Bitstream (.bin) должен быть одинаковый для SRAM и FLASH ? 2) Должна ли быть разница в порядке бит каждого байта (для SRAM - MSB, для FLASH - LSB) ? 3) Что делать с 4-х байтовым autoboot-pattern (ничего/ вставить в начале/ заменить в начале 4 байта) ? 4) Что такое address ? Индекс 256-байтного блока сдвинутый на 6 ? 1) Не знаю, со SRAM не работал 2) см. п1 Но для FLASH я выталкиваю младшим битом вперед. При этом еще и из бинарного файла читаю не байтами, а 32-х битными словами. И перед отправкой этих слов я в них меняю порядок байт с Little-endian на Big-endian. Может и костыль, но без этого у меня не работало. 3) Его после завершения программирования надо вставить (записать) по нужному адресу. Иначе ПЛИС не будет грузить FLASH в свою SRAM при реконфигурации. 4) С эти действительно мутно как-то. Создайте в Gowin IDE файл SVF и пользуйтесь им как шпаргалкой. Очень помогает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ask78 0 14 ноября, 2022 Опубликовано 14 ноября, 2022 · Жалоба dimka76, благодарю за подсказки, заработало, ура!!! SVF действительно полезно смотреть как шпаргалку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 215 28 февраля, 2023 Опубликовано 28 февраля, 2023 · Жалоба Доброго всем времени суток! При реализации механизма программирования внутренней флеш-памяти ПЛИС GW1N-9C через JTAG на GPIO МК внезапно выяснилось, что данные в Y-страницы флеш-памяти (4 байта) необходимо писать в перевёрнутом виде, т.е. младший по смешению из bin-файла байт (например, по смещению 0) пишется по смещению старшего байта (т.е. по смещению 3) и так далее. При этом, что интересно, в генерируемом средой Gowin Programmer SVF-файле этого переворота нет, судя по моим наблюдениям. Соответственно если использовать SVF без модификаций, то КМК прошить им ПЛИС не получится. Может быть кто-то пробовал и готов поделиться результатом? В документации от Gowin на этот счёт путаница: они пишут про программирование Y-страницы начиная с LSB, говоря о битах, но на самом деле LSB - это младший байт. При этом в проекте openFPGALoader (файл src/gowin.cpp) также присутствует переворот (tx[3-x] = t[x]), что подтверждает мою гипотезу: for (int ypage = 0; ypage < nb_iter; ypage++) { unsigned char *t = buffer+xoffset + 4*ypage; for (int x=0; x < 4; x++) { if (page == 0) tx[3-x] = t[x]; else tx[x] = t[x]; } _jtag->shiftDR(tx, NULL, 32); if (!is_gw1n1) _jtag->toggleClk(40); } Условие page == 0 соответствует программированию конфигурации ПЛИС. При прошивке пользовательской области флеша переворот байт не выполняется. В любом случае после добавления аналогичного кода перестановки байт в слове Y-страницы прошивка успешно стартовала и ПЛИС работает как было задумано. PS: В руководстве от Gowin процедура верификации внутреннего флеша после программирования также описана некорректно. Для её лучшего понимания советую посмотреть на генерируемый средой SVF-файл. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 215 8 марта, 2023 Опубликовано 8 марта, 2023 · Жалоба Продолжение истории про программирование Gowin: 1. Прошитая сигнатура Readable Pattern, дающая возможность чтения флеша, действует до выполнения двух последовательных команд реконфигурации. Т.е. если мы прошиваем образ с Readable Pattern, выполняем реконфигурирование, читаем и сравниваем, а далее перезаписываем в начало нулевой Y-страницы в нулевой X-странице значение Autoboot pattern, то после очередной реконфигурации мы имеем вполне рабочую ПЛИС с вполне успешно читаемой внутренней флеш-память. Если выполнить ещё одну операцию реконфигурирования, то доступ на чтение пропадает. Однако для гарантии лучше дёрнуть питанием. 2. В паузах между транзакциями на шине уровень TCK должен быть нулём. При единице в периоды неактивности наблюдаются непонятные случайные сбои. Например, внутренняя флеш может стираться через раз или даже через пять попыток. 3. При чтении регистров (например Status) и т.п. через TDI нужно вдвигать нули. При вдвигании единиц наблюдались непонятные сбои при программировании. Оригинальный Gowin Programmer делает именно так. 4. Требование к частоте при программировании относится к операциям стирания флеша, записи адреса Y-страницы и записи данных Y-страницы. Т.е. для успешного программирования Y-страницы необходимо без каких либо задержек сразу после перехода TAP в состояние Run-Test/Idle дать требуемое и описанное в документации число импульсов на определённой частоте. Если будет пауза или частота будет ниже (например, 1 МГц), то страница может не записаться, может записаться с искажениями или даже бывает сдвиг на одну страницу, т.е. первая страница пишется на место нулевой и так далее. В целом резюме такое: алгоритм программирования, описанный в документации, логика работы Gowin Programmer и алгоритм программирования в виде SFV это три разных алгоритма. Причём если последовательность программирования через JTAG из Gowin Programmer ещё хоть как-то соответствует данным их SVF, то оба два этих алгоритма слабо похоже на описание в из документа. PS: в итоге после многих мытарств удалось реализовать прошивку GW1N-9C из МК через JTAG на GPIO-пинах МК с использованием встроенного PWM, позволяющего сформировать требуемый тактовый сигнал в паузах. В качестве примера можно посмотреть на реализацию эмуляции JTAG на базе MPSSE в проекте RV-Debugger - https://github.com/sipeed/RV-Debugger-BL702/blob/main/firmware/app/usb2uartjtag/jtag_process.c.gowin, которая как раз содержит в себе довольно много костылей для вышеописанных случаев. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 8 марта, 2023 Опубликовано 8 марта, 2023 · Жалоба On 3/8/2023 at 7:37 PM, makc said: Продолжение истории про программирование Gowin: Я реализовал программирование по JTAG. Подглядывал в SVF файл. Фактически деле больше по SVF, чем по документации, но документацией тоже пользовался. И openFPGAloader тоже смотрел. Вот моя темка кстати А в чем собственно у вас вопрос ? Как я понял вы же уже все реализовали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 215 8 марта, 2023 Опубликовано 8 марта, 2023 · Жалоба 8 минут назад, dimka76 сказал: А в чем собственно у вас вопрос ? Как я понял вы же уже все реализовали. Тема была создана для обмена опытом и обсуждения особенностей программирования, которые не всегда покрыты документацией. Вопрос у меня глобально остался только один: у кого-нибудь получилось прошить внутренний флеш с верификацией с помощью генерируемого средой SVF? У меня через OpenOCD+кабель на FT2232H так и не получилось, хотя тот же кабель без единого сбоя шьёт из Gowin Programmer. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 8 марта, 2023 Опубликовано 8 марта, 2023 · Жалоба On 3/8/2023 at 10:55 PM, makc said: Тема была создана для обмена опытом и обсуждения особенностей программирования, которые не всегда покрыты документацией. Вопрос у меня глобально остался только один: у кого-нибудь получилось прошить внутренний флеш с верификацией с помощью генерируемого средой SVF? У меня через OpenOCD+кабель на FT2232H так и не получилось, хотя тот же кабель без единого сбоя шьёт из Gowin Programmer. Я bin файл прошиваю. On 3/8/2023 at 10:55 PM, makc said: Тема была создана для обмена опытом и обсуждения особенностей программирования Может тогда с моей темой как объединить ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 215 8 марта, 2023 Опубликовано 8 марта, 2023 · Жалоба 8 минут назад, dimka76 сказал: Я bin файл прошиваю. Я не про "что", а про "как". Понятное дело, что в SVF лежит преобразованный bin + ещё кто что. 9 минут назад, dimka76 сказал: Может тогда с моей темой как объединить ? Объединил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
okela 0 29 сентября, 2023 Опубликовано 29 сентября, 2023 · Жалоба Освежу темку. Кто-нибудь пользовался утилитой svf2jam для конвертации svf-файла в jam-файл ? Запускаю эту утилиту с двумя параметрами - входной и выходной файл. В результате получаю выходной файл нулевой длины и сообщение "TCK Frequency set to 0 MHz". Хотя частота во входном файле задана 2,5 МГц. Не могу понять что происходит и чего не хватает для нормальной работы этой утилите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться