Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Программа для NIosII в EPCS
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
torik
Упустил, собственно, этот вопрос, а теперь хочу разобраться.

Необходимо, чтобы память программ ниоса располагалась в EPCS. Прочитал что обсуждалось на форуме:
http://electronix.ru/forum/index.php?showt...30842&st=15
И не понимаю, если память программ будет содержаться в EPCS, то как она будет выполняться - неужели прямо из этого флеша читаться? Тогда это медленно.

А если нет, то куда она собственно зальется и где возьмется boot loader для этого. Поясните, что да как в кратце и отправьте где читать...
id_gene
Если секция TEXT лежит во флеше, то и читаться она будет из флеша.
А скорость вы уж сами считайте, хватает вам или нет.
Если нет, то ставьте reset адрес во флеш, а секции кладите в быструю память. Загрузчик в ИДЕ подцепится сам.
Читать Nios II Software Developer’s Handbook, разделы
Boot Sequence and Entry Point и Memory Usage.
vetal
Встроенный бутлоадер скопирует программу из epcs в ту память, которая помечена как исполняемая при компиляции программы.
Например, если это будет sdram - программа будет скопирована из epcs в sdram и ей будет передано управление.
torik
Ничего себе - "секция TEXT", "исполняемая память при компиляции"... где это все? первый раз слышу.
А зачем нужна "ексцепшен" в сопсбидере указанная?
vetal
Цитата
где это все?

Это в настройках проекта.
torik
Итак все-таки, прочитал что надо сделать чтобы зашить программу в епцс вместе с конфигурационным файлом. Но так и не вкурил следующее:

1) куда же эта программа при включении бутлоадится, в какое-то ОЗУ, которое входит в состав ниоса?
2) как я понимаю в версии 6.1 все-таки надо делать описание. Это точно? Ведь для заливки программы в CFI_FLASH я не делал описание, а просто дал название контроллеру (для епцс не дает дать название).

Альтернатива епцс и флешу - добавлять в SOPC onchipmemory и туда программу складывать, а потом указывать ей .hex для прошивки. Но это для конечного продукта, ведь ее можно залить только с перекомпиляцией проекта, а это долго. Кроме того годиться лишь для небольшой программы. Потому необходимо все-таки разбираться с епцс, чтобы снять этот вопрос раз и навсегда!
Еще, для ниоса пишу неособенно задумываясь программы на С, простенькие. Тут возникает непонятка - куда размещаются переменные-то? Надеюсь не по адресу 0, ибо там SDRAM в которой храниться картинка ))) Дизасемблер что-то лопатить не слишком хочется...
vetal
Вы в настройках системной библиотеки указываете где размещается исполняемый код, где переменные и прочие гадости лежат.
Контроллер epcs это всего навсего ROM, содержащий код для загрузки программы из spi памяти(epcs) в то место, которое указано при компиляции программы. Если у вас программа во внутрикристальной памяти - этот контроллер не нужен, т.к. при подаче питания там уже все есть.
torik
Так, с этим вроде разобрался...
Теперь, т.к. у меня квартус 6.1, то мне приходится создавать описание платы дабы можно было в EPCS запихнуть программу для ниоса.

Создаю описание платы, как на рисунке. И флеш програмер говорит ошибку:
"SOF offset is invalid: java.lang.NumberFormatException: For input string: """
Ну, соответсвенно, не дает указать hardware image region... и вообще не програмирует. Что я не так со смещением сделал?

Е-мое, забыл рисунок-то добавить, как обычно. Добавляю...
torik
Отредактировал, рисунок добавил(
torik
Ладно, от этой темы можно пока отвлечся, т.к. это сейчас для меня не принципиально.

Теперь вопрос по программной части. Мне необходимо из флеш-памяти (CFI) перекопировать в память SDRAM область размером 640х480х2 (всмысле два байта на пиксель).
Далее я ее вывожу на монитор посредством обращения к памяти через шину авалон прямо из проекта квартусовского...
Так вот, вначале делал просто таким образом:
Код
alt_u16 *fff;             //указатель на флеш
alt_u16 *ddd;             //указатель на сдрам
   fff = (alt_u16*)(CFI_FLASH_0_BASE);
   ddd = (alt_u16*)(SDRAM_0_BASE);
   memcpy(ddd, fff, 614400);

И все вроде работало. Тот же результат, что и при копировании прямо через указатели. Картинка выводилась и т.п.
Но вот дальше обнаружилось что так прокатывает только один раз, далее функции
Код
memcpy, memset
работают уже неправильно, да и через указатели уже не получается.

Начал копать в сторону IOWR:
Код
    for (i = 0; i < 307200; i++) {
        dst_src = IORD_16DIRECT(CFI_FLASH_0_BASE, i);
       IOWR_16DIRECT(SDRAM_0_BASE, i, dst_src);
   }

И оказалось что и тут все не так. Копируется, но как-то неправильно, с пропусками. Даже если просто записывать в память 0...

Подскажите, что делать, как правильно сделать все это? Без ДМА.

Господа, простите. Это была паника, просто паника - все работает...
RHnd
Програму вы храните в епцс? Т.е. сама флеш-память полностью свободна? Ладно, с этим понятно.
Но вот не очень понятно, на каких правах вы так прото берете и перезаписываете данные по нулевому адресу сдрам? А если там уже что-то лежит? Вплоть до той же самой проги, которая выполняется. Или у вас в настройках библиотеки под оперативную память не сдрам предназначен, а какая-нить onchip?
Тут нужно как минимум делать malloc.

Кстати, вполне можно rtfm главу руководства квартуса, которая по встроенной переферии. Там, на сколько помню, есть вполне себе описание HAL для работы с flash.
torik
Спасибо за ответ...
1) С епцс не разобрался пока, отложил. Вот там вверху картинку выкладывал и на том застопорился.

2) Прога хранится во флеш-памяти, память программ, переменные и пр. - все в on_chip памяти, ибо программа пока небольшая.

3) СДРАМ предназначен только для хранения нескольких кадров (страниц), и вывод осуществляю аппаратно, потому распределяю память принудительно.
Думаю воспользоваться тем же malloc в дальнейшем, а адрес выделяемой памяти передавать через PIO. Но это не принципиально да и не необходимо на мой взгляд.

4) Про перефирию прочитал, потом прочитал HAL и выяснил, что главное использовать функции IOWR/IORD (и производные), если работать в обход кэша, для простоты.
vadimuzzz
Цитата(torik @ Jan 23 2008, 13:38) *
Теперь, т.к. у меня квартус 6.1, то мне приходится создавать описание платы дабы можно было в EPCS запихнуть программу для ниоса.

Создаю описание платы, как на рисунке. И флеш програмер говорит ошибку:
"SOF offset is invalid: java.lang.NumberFormatException: For input string: """
Ну, соответсвенно, не дает указать hardware image region... и вообще не програмирует. Что я не так со смещением сделал?

8) да,да помню я этот глюк. это не флеш програмер, а java корявая.
проблема решается очень просто, надо шить в консоли. почитайте user guide на flash_programmer.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.