Jump to content
    

Как записать в конфигурацию ПЛИС прошивку для NIOS? Пробовал - не получилось.

Создал сконвертировал elf - > hex

При создании JIC файла прошивки из файла SOF указал также и HEX файл. 

При записи конфигурации с HEX файлом конфигурация не запускается. NIOS не виден даже программатором из Эклипс. Без файла HEX (при создании JIC) все чинно стартует и прошивка NIOS II загружается.

Что я делаю не так?

Просто надоело каждый раз грузить прошивку при сбросе питания.

Edited by Димон Безпарольный

Share this post


Link to post
Share on other sites

А вы точно все сделали как надо? Например, как это описано здесь:

  • Terasic DE3 Board User Manual (см. вложение), Appendix C, Programming the Serial Configuration Device

 

DE3_User manual_v1.2.3.pdf

Share this post


Link to post
Share on other sites

4 hours ago, Raven said:

А вы точно все сделали как надо? Например, как это описано здесь:

Да, именно по этой инструкции я и делал. Инструкция эта говорит как зашить конфигурационную часть намертво - во флэш. Это прекрасно работает. Но в инструкции не сказано как вставить программную часть для NIOS в этот же флэш. И такой инструкции я пока не нашел. Делал чисто интуитивно. Надо hex - сконвертировал из elf. При конвертации sof -> jic можно было его подсунуть. Подсунул - не работает. Не запускается вообще. Может я и неправильно делаю.

Share this post


Link to post
Share on other sites

Для того, чтобы обеспечить возможность загрузки исполняемого кода Nios'а из конфигурационного флэша, в ниосовской системе должен присутствовать компонент epcq_controller2. Причем вектор сброса должен указывать на этот контролер (а вектор исключения - та ту память, куда этот исполняемый код должен быть скопирован). Кроме того, в bsp нужно сделать соответствующие настройки (запретить исполнение пользовательского кода с адреса сброса).

Мои примеры различных вариантов хранения и исполнения кода Вы можете скачать вот отсюда: https://cloud.mail.ru/public/JCXX/CKsCusF9H

Там три варианта - исполняемый код хранится в On-Chip RAM (Ocr), исполняемый код хранится в конфигурационном ПЗУ и по старту загружается в On-Chip RAM (Lfcfg) и исполняемый код хранится в конфигурационном ПЗУ и исполняется из конфигурационного ПЗУ.

Share this post


Link to post
Share on other sites

1 hour ago, StewartLittle said:

Там три варианта - исполняемый код хранится в On-Chip RAM (Ocr), исполняемый код хранится в конфигурационном ПЗУ и по старту загружается в On-Chip RAM (Lfcfg) и исполняемый код хранится в конфигурационном ПЗУ и исполняется из конфигурационного ПЗУ.

У ТС, если это не успело измениться, как раз случай старта из On-Chip RAM (Reset vector же у вас туда указывает, верно? или нет?). Он не пытается испольнять код из EPCQ ни напрямую, ни после его копирования в SRAM. Проблема состоит в том, что нужно обеспечить, чтобы инициализация этой SRAM кодом загрузчика правильно зашла в конфигурационные данные FPGA. С чем у ТС, видимо, какие-то проблемы, хотя утверждает, что все делает по правильной процедуре.

2 hours ago, Димон Безпарольный said:

Да, именно по этой инструкции я и делал. Инструкция эта говорит как зашить конфигурационную часть намертво - во флэш. Это прекрасно работает. Но в инструкции не сказано как вставить программную часть для NIOS в этот же флэш. И такой инструкции я пока не нашел. Делал чисто интуитивно. Надо hex - сконвертировал из elf. При конвертации sof -> jic можно было его подсунуть. Подсунул - не работает. Не запускается вообще. Может я и неправильно делаю.

А у вас инициализация On-Chip RAM вообще делается где-нибудь и когда-нибудь в процессе? Если нет, то откуда в SOF-файле возьмутся коды исполняемой программы? Вы код для NiOS загружаете только в процессе отладки из Eclipse?

Share this post


Link to post
Share on other sites

В 03.03.2025 в 12:04, Raven сказал:

У ТС, если это не успело измениться, как раз случай старта из On-Chip RAM

Тогда это первый пример (Ocr). При этом отдельно hex-файл прописывать в конфигуратор не нужно, т.к. содержимое On-Chip RAM удже встроено в битстрим. Достаточно убедиться, что в настройках On-Chip RAM  установлена галка Initialize memory content, что полученный hex-файл совпадает по имени с ожидаемым, ну и не забыть и перегенерировать систему в платформ дизайнере после того, как сделали hex-файл :)

 

On_Chip_RAM_cfg.png

Share this post


Link to post
Share on other sites

28 minutes ago, StewartLittle said:

Тогда это первый пример (Ocr). При этом отдельно hex-файл прописывать в конфигуратор не нужно, т.к. содержимое On-Chip RAM удже встроено в битстрим. Достаточно убедиться, что в настройках On-Chip RAM  установлена галка Initialize memory content, что полученный hex-файл совпадает по имени с ожидаемым, ну и не забыть и перегенерировать систему в платформ дизайнере после того, как сделали hex-файл :)

Да. Но есть подозрение, что ТС эту инициализацию пока не делал. Ждем подтверждения от него.

Share this post


Link to post
Share on other sites

Очень давно работая с NiosII оставлял себе заметки по поднятому ТС вопросу (было это в 2010 и 2013). Посмотрите, может это чем-то поможет.

hex.zip

Nios.zip

Share this post


Link to post
Share on other sites

22 minutes ago, Serhiy_UA said:

Очень давно работая с NiosII оставлял себе заметки по поднятому ТС вопросу (). Посмотрите, может это чем-то поможет.

В целом хороший HowTo, но есть некоторые недочеты:

  • Пункт 2 "Открыть требуемый hex-файл через File -> Open. Появится окно с запросом о ширине слова Word Size. Задать его равным 8 (важно задать именно 8)."  не соответствует ширине On-Chip RAM (32 бита) - см. Приложение.

Будет warning, и даже все сработает как надо благодаря кратности (8=2*4), но осадочек останется. Оно нам надо? Ведь можно сделать все, "как в лучших домах Бостона":

  • Либо выбрать ширину =4 (как оно есть в действительности) в Memory Editor
  • Либо прописать ширину =4 в свойствах BSP вашей платформы/проекта ("elf2hex_extra_args = $(mem_no_zero_fill_flag) --record=4") - подробности описаны здесь: Ваш первый проект на Nios II

Share this post


Link to post
Share on other sites

7 hours ago, Raven said:

Да. Но есть подозрение, что ТС эту инициализацию пока не делал. Ждем подтверждения от него.

И правда не делал. 

 

8 hours ago, Raven said:

как раз случай старта из On-Chip RAM (Reset vector же у вас туда указывает, верно? или нет?).

Нет. В Onchip код не исполняется. Он исполняется из SDRam расположенной с нулевого адреса. Reset вектор 0x0. Исключения 0x20. 

 

8 hours ago, Raven said:

Проблема состоит в том, что нужно обеспечить, чтобы инициализация этой SRAM кодом загрузчика правильно зашла в конфигурационные данные FPGA.

Кажется так. Только это SDRAM.

8 hours ago, Raven said:

С чем у ТС, видимо, какие-то проблемы, хотя утверждает, что все делает по правильной процедуре.

Нет. Ее то как раз я и не знаю. Т.е. сейчас я прошил JIC в конфигурационную ПЗУ. И он прекрасно стартует потому что на то есть животворящая инструкция. А вот как вместе с этим JIC туда запихнуть еще и прошивку NIOS которая загрузится в SDRAM по адресу 0 инструкции нет. Ну и я видимо по интуиции делаю неправильно.

7 hours ago, StewartLittle said:

При этом отдельно hex-файл прописывать в конфигуратор не нужно, т.к. содержимое On-Chip RAM удже встроено в битстрим.

Круто. Теперь я по крайней мере понял как загнать прошивку в Onchip. Но она туда не помещается.

Edited by Димон Безпарольный

Share this post


Link to post
Share on other sites

В 03.03.2025 в 20:06, Димон Безпарольный сказал:

Нет. В Onchip код не исполняется. Он исполняется из SDRam расположенной с нулевого адреса. Reset вектор 0x0. Исключения 0x20.

Смотрите мой второй пример (Lfcfg). Разница только в том, что у Вас вектор исключения должен указывать на SDRAM. И про галку в bsp не забудьте.

Share this post


Link to post
Share on other sites

16 hours ago, Димон Безпарольный said:

Нет. В Onchip код не исполняется. Он исполняется из SDRam расположенной с нулевого адреса. Reset вектор 0x0. Исключения 0x20. 

 

16 hours ago, Димон Безпарольный said:

Кажется так. Только это SDRAM.

 

16 hours ago, Димон Безпарольный said:

Нет. Ее то как раз я и не знаю. Т.е. сейчас я прошил JIC в конфигурационную ПЗУ. И он прекрасно стартует потому что на то есть животворящая инструкция. А вот как вместе с этим JIC туда запихнуть еще и прошивку NIOS которая загрузится в SDRAM по адресу 0 инструкции нет. Ну и я видимо по интуиции делаю неправильно.

Теперь ситуация стала яснее. Но на всякий случай поясню.

Если код исполняется из SDRAM, то непосредственно из конфигурационных данных FPGA он туда попасть не может (в отличие от варианта с On-Chip RAM, где эта RAM - это часть FPGA, и потому может быть проинициализирована как часть процесса конфигурирования FPGA). Но его туда [в SDRAM] может поместить загрузчик, после чего передать управление этому коду. Это почти соответствует варианту Lfcfg от @StewartLittle, о чем он уже и говорил; разница только в том, что у него загрузчик копирует код из EPCQ в On-Chip RAM, а вам надо, чтобы он копировал его в SDRAM.

Действует примерно так:

  • Reset vector установлен на epcq_controller (в нем есть небольшой блок SRAM, в который зашит программа-загрузчик);
  • После выхода из ресета управление получает программа-загрузчик (внутри EPCQ-контроллера), инициализирует CPU, копирует указанный объем кода из указанных адресов EPCQ в указанные адреса системы (вам надо, чтобы копировал в SDRAM @0x0);
  • Программа-загрузчик передает управление по указанному адресу в скопированный код;
  • Voila! Your code finally works from SDRAM!

Обратите внимание на поправки, указанные @StewartLittle ! Ну, и внимательно изучите пример и его настройки.

Share this post


Link to post
Share on other sites

Ну а вообще ТС'у следовало бы воспользоваться поиском по форуму - этот вопрос здесь уже обсасывался и переобсасывался неоднократно.

Вот там смотрите вложение к сообщению: https://electronix.ru/forum/topic/156362-quartus-191-pod-windows-u-kogo-nibud-normalno-rabotaet/?do=findComment&comment=1710231

 

Share this post


Link to post
Share on other sites

Пока пробовал самый простой вариант. SOF + ELF. Решил попробовать Flash Programmer из Eclipse.

Создал проект работающий в onchp. Делал по инструкции, но дальше такого вида  Flash Programmer'а не пошло.

image.thumb.png.f8f3f02ac2d928b630fcc8162772eb66.png

 

Что я сделал не так? Кварус 13.

Edited by Димон Безпарольный

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...