Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Загрузка NIOS с флеш
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Desmiles
Доброго времени суток! Возникла проблема с запуском программы NIOS из флеш памяти.
Создал конфигурацию ПЛИС, NIOS и написал программу. Всё работает, но только при непосредственном запуске из эклипса. Никак не получается записать на флеш и запустить с неё. При этому непосредственно логика ПЛИС работает после прошивки (перезагрузки).
Входная частота 20 МГц, после PPL в QSYS 100 МГц.
Делаю mem_init_generate и добавляю qip файл от этого mem_init_generate.

Следую данной иструкции:
1- Add EPCS Flash Controller in Qsys
2- Connect the Clk input of EPCS Flash Loader IP to a separate clock of < 25Mhz
3- Set Reset Vector offset of NiosII to the Base Address of EPCS Flash Loader.
4- Set Exception vector to any On Chip RAM
5- Generate Qsys
6- Open BSP Editor and set all linker regions to SDRAM / onchip memory
7- Generate BSP and Build the BSP project
8- Build Your C code and obtain *.elf
9- Goto make targets->Build and run "mem_init_generate"
10- From mem_init folder include *.qip file in your Quartus project and recompile to get *.SOF
11- copy *.SOF and *.elf files in a separate folder i.e /output
12- perform following in NiosII command Shell:

1. Create a flash file for the hardware and software image
sof2flash --input=<hwimage>.sof --output=hwimage.flash --epcs --verbose
elf2flash --input=<elf file>.elf --output=swimage.flash --epcs --after=hwimage.flash --verbose


2. Convert the flash images into Hex files

nios2-elf-objcopy -I srec -O ihex hwimage.flash hwimage.hex
nios2-elf-objcopy -I srec -O ihex swimage.flash swimage.hex


3. Generate *.JIC file

Create your jic file using Quartus® II Convert Programming File tool, add the Flash Loader and
both hex files with absolute addressing option selected.

Подскажите что может быть?







Swup
Уберите flash контроллер. Он вам сейчас явно не нужен.
Поставьте вектор сброса тоже на ончип память.


Stewart Little
Цитата(Swup @ Sep 11 2017, 19:39) *
Уберите flash контроллер. Он вам сейчас явно не нужен.
Поставьте вектор сброса тоже на ончип память.

Уточню.
Топикстартер делает две взаимоисключающие вещи - mem_init_generate и вектор сброса на EPCS Flash Controller.

Mem_init_generate нужно выполнять в том случае, если хочется положить исполняемый код прямо в sof-файл - т.е. в этом случае сегмент кода располагается в OnChip RAM, туда же должен указывать вектор сброса.

Если же при старте хочется загружать исполняемый код из EPCS (например, во внешнее ОЗУ), то для этого служит EPSC Flash Controller, и вектор сброса должен указывать на него. При старте системы первой начнет выполняться программа-копировшик, которая живет внутри EPSC Flash Controller'а. И после того, как исполняемый код будет перелит в нужное ОЗУ, копировшик передаст управление этому коду.
Но в этом случае необходимо, чтобы в настройках BSP было бы запрещено исполнение кода приложения с адреса сброса (галка "Allow code at reset" должна быть сброшена).
Desmiles
Цитата(Stewart Little @ Sep 12 2017, 12:29) *
Уточню.
Топикстартер делает две взаимоисключающие вещи - mem_init_generate и вектор сброса на EPCS Flash Controller.

Mem_init_generate нужно выполнять в том случае, если хочется положить исполняемый код прямо в sof-файл - т.е. в этом случае сегмент кода располагается в OnChip RAM, туда же должен указывать вектор сброса.

Если же при старте хочется загружать исполняемый код из EPCS (например, во внешнее ОЗУ), то для этого служит EPSC Flash Controller, и вектор сброса должен указывать на него. При старте системы первой начнет выполняться программа-копировшик, которая живет внутри EPSC Flash Controller'а. И после того, как исполняемый код будет перелит в нужное ОЗУ, копировшик передаст управление этому коду.
Но в этом случае необходимо, чтобы в настройках BSP было бы запрещено исполнение кода приложения с адреса сброса (галка "Allow code at reset" должна быть сброшена).


Спасибо за сведения!

Пробую всё таки сделать с mem_init, добавляю mem_init.qip к проекту и никаких результатов. Сброс естественно на он чип. И как определить где должен располагаться код, т.е. где эта настройка?


doom13
Цитата(Desmiles @ Sep 11 2017, 17:44) *
8- Build Your C code and obtain *.elf
9- Goto make targets->Build and run "mem_init_generate"
10- From mem_init folder include *.qip file in your Quartus project and recompile to get *.SOF
3. Generate *.JIC file

Вам нужно только это, должно работать.
Swup
Настройки линкера в bsp editor.
Если у вас есть еще какая-то память проекте, то может там указано не туда куда нужно.

ПС Там еще отдельно в main есть настройка указателей на стек прерываний и стек исключений.


doom13
Если не работает попробуйте выполнитьProcessing->Update Memory Initialization File, иногда помогало.
Stewart Little
Цитата(Desmiles @ Sep 13 2017, 11:09) *
Пробую всё таки сделать с mem_init, добавляю mem_init.qip к проекту и никаких результатов. Сброс естественно на он чип. И как определить где должен располагаться код, т.е. где эта настройка?

После того, как qip к проекту добавляете, не забываете проект перекомпилировать? Ну или, как минимум, ассемблер в квартусе запустить?
Все это нужно, чтобы в sof-файле содержимое OnChip RAM было проинициализировано исполняемым кодом.

Вот после заливки в микрросхему такого sof'а Ваш исполняемый код должен сразу начать выполняться (если, конечно, с ресетом косяков не имеется).

Ну и не забываем про настройки BSP (которые необходимо сделать перед компиляцией исполняемого кода в эклипсе), как коллега выше советовал.
_Anatoliy
А в настройках памяти указали файл инициализации?
Stewart Little
Цитата(_Anatoliy @ Sep 13 2017, 15:23) *
А в настройках памяти указали файл инициализации?

Он там по умолчанию указывается, со стандартным наименованием.
_Anatoliy
Цитата(Stewart Little @ Sep 13 2017, 15:38) *
Он там по умолчанию указывается, со стандартным наименованием.

Я имел ввиду память системную в кусисе. Странно, у меня всегда требует флажок поставить и путь указать. Пардон, видимо ключевое слово non-default...
Desmiles
Цитата(Stewart Little @ Sep 13 2017, 11:49) *
После того, как qip к проекту добавляете, не забываете проект перекомпилировать? Ну или, как минимум, ассемблер в квартусе запустить?
Все это нужно, чтобы в sof-файле содержимое OnChip RAM было проинициализировано исполняемым кодом.

Вот после заливки в микрросхему такого sof'а Ваш исполняемый код должен сразу начать выполняться (если, конечно, с ресетом косяков не имеется).

Ну и не забываем про настройки BSP (которые необходимо сделать перед компиляцией исполняемого кода в эклипсе), как коллега выше советовал.


Проект перекомпилирую полностью, но безрезультатно.
Файл с настройками BSP:



Non-default я ставлю без галки. Как я понимаю, если делать mem-init и добавлять этот qip, то галочка там и не нужна.

При обновлении памяти у меня выскакивает следующее, может ли это как-то повлиять. На форуме видел, что вроде как на это не надо обращать внимания, но все же.


Stewart Little
Цитата(Desmiles @ Sep 13 2017, 16:10) *
При обновлении памяти у меня выскакивает следующее, может ли это как-то повлиять. На форуме видел, что вроде как на это не надо обращать внимания, но все же.

Не открывается картинка. Вставьте ее прямо в сообщение.
Desmiles
Цитата(Stewart Little @ Sep 13 2017, 18:35) *
Не открывается картинка. Вставьте ее прямо в сообщение.



doom13
С этими сообщениями все нормально, ошибок нет, в моем проекте аналогичные варнинги.
Desmiles
Всем спасибо за помощь, не знаю почему, но изменил в on-chip memory data width на 32 и всё запустилось нормально.
Делал через mem_init. qip и перекомпиляцию проекта.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.