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

На плате установлены:
1. EP3C40Q240-C8
2. SDRAM MT48LC4M32B2
3. EPCS M25P54 в количестве двух штук, одна из которых подключена к конфигурационным ногам ПЛИС, вторая - к regulag I/O (соответствует EPCS контроллеру в qsys)

В qsys добавлено следующее:

1. on-chip memory
2. nios 2 processor
3. sysid
4. JTAG UART
5. EPCS flash controller
6. PIO
7. SDRAM controller (для MT48LC4M32B2 есть установка по умолчанию)

Вектор сброса процессора установлен на базовый адрес EPCS flash controller
Вектор обработчика исключений - на on-chip memory
В Eclips создан проект, зажигающий светодиод на плате

Задача: использовать SDAM для хранения инструкций и данных

Для этого в BSP Editor во вкладке Linker области .text, .rodata, .rwdata, .heap, .stack, .bss указаны на SDRAM; .entry и .exeptions - на EPCS и on-chip соответственно.

.elf-файл с программной частью зашивается в EPCS при помощи NIOS 2 Flash Programmer.
.jic-файл с аппаратной частью зашивается при помощи стандартного Quartus Programmer.

После передергивания питания NIOS не подает признаков жизни.

Если же в BSP Editor во вкладке Linker области .text, .rodata, .rwdata, .heap, .stack, .bss указать на on-chip, после передергивания питания NIOS оживает....

Если у кого есть предположения, в чем проблема, с радостью выслушаю, заранее спасибо!

Да, забыл сказать, что система нормально работает под отладкой в Eclipse, когда все области в BSP Editor указаны в SDRAM
vadimuzzz
проблема в констрйенах клоков и/или I/O на SDRAM. покажите настройки PLL и констрейны
a.v.yastrebov
PLL из входного клока 16,9344 МГц делает 2, умножая на 3, сдвига фаз нет. Файл .sdc прикрепил
vadimuzzz
Цитата(a.v.yastrebov @ Feb 21 2013, 13:45) *
сдвига фаз нет.

на чип SDRAM надо подавать клок, сдвинутый по фазе. обычно используют сдвинутый на 90 гр.
Konst_777
Цитата(a.v.yastrebov @ Feb 20 2013, 22:13) *
...
.elf-файл с программной частью зашивается в EPCS при помощи NIOS 2 Flash Programmer.
.jic-файл с аппаратной частью зашивается при помощи стандартного Quartus Programmer.

После передергивания питания NIOS не подает признаков жизни.
...

А правильно ли расположен .elf-файл в EPCS? Не проще ли использовать NIOS II Flash Programmer для прошивки и .sof и .elf? Тогда NIOS II Flash Programmer автоматически расположит в EPCS .elf сразу же после .sof и загрузчик сможет найти и загрузить .elf.

Цитата(a.v.yastrebov @ Feb 20 2013, 22:13) *
..Если же в BSP Editor во вкладке Linker области .text, .rodata, .rwdata, .heap, .stack, .bss указать на on-chip, после передергивания питания NIOS оживает....

Вот это дает повод усомниться в полезности моего совета laughing.gif
Да, интересно - в чем же все таки дело?
Apast
Я с Altera и с NIOS не работал, но есть достаточный опыт с Xilinx и Microblaze.
Судя по тому что вы пишите код программы вы не меняетет, только переставляете указания линкеру
с внутренней памяти на внешнюю и наоборот. Тогда возникает вопрос а есть ли у вас кусок программы который грузит
исполняемый код во внешнюю память, сам он туда не попадет, и я сильно сомневаюсь что Quartus делает это сам.
В том случае когда указана внутренняя память то код по вкючению питания (после загрузки FPGA) уже лежит там
и все работает. В случае внешней памяти вы должны сделать это сами и этот кусок программы (начальный загрузчик)
должен лежать во внутреней памяти.
Отладчик, я думаю как и у Xilinx, как раз и грузит код во внешнюю память через свой загрузчик.
vadimuzzz
Я как-то упустил, что программа работает в отладчике, значит дело не в SDRAM. Тогда 2 вопроса: стоит ли в настройках EPCS-контроллера галка "Automatically select dedicated active serial interface" и зачем вам 2 флешки - можно ведь все в одну запихать.
gosu-art
Я выкрутился так http://electronix.ru/forum/index.php?showt...4&hl=sdram*, Хоть и довольно таки геморно, но со стандартным бутлодером у меня не получилось грузится в SDRAM.
a.v.yastrebov
При сдвиге фаз в 90 градусов, соблюдения констрайтнов никак не удается достичь. Но при сдвиге -70 градусов, все соблюдается с приличным запасом, но процессор по-прежнему не стартует... Для того, чтобы хранить инструкции и данные в SDRAM не нужет какой-то особенный bootloader, может контроллер SDRAM просто не проинициализирован к моменту запуска bootloader-а? Дело в том, что в отладке я можгу писать/читать в/из SDRAM, все работает корректно

Спасибо всем за ответы! Неужели стандартный загрузчик EPCS контроллера не может загружать в SDRAM?

Vadimuzz, я пробовал с помощью Flash programmer залить elf и sof в одну флешку, результат такой же...
wpost
Цитата(a.v.yastrebov @ Feb 22 2013, 10:36) *
При сдвиге фаз в 90 градусов, соблюдения констрайтнов никак не удается достичь. Но при сдвиге -70 градусов, все соблюдается с приличным запасом, но процессор по-прежнему не стартует... Для того, чтобы хранить инструкции и данные в SDRAM не нужет какой-то особенный bootloader, может контроллер SDRAM просто не проинициализирован к моменту запуска bootloader-а? Дело в том, что в отладке я можгу писать/читать в/из SDRAM, все работает корректно

Спасибо всем за ответы! Неужели стандартный загрузчик EPCS контроллера не может загружать в SDRAM?

Vadimuzz, я пробовал с помощью Flash programmer залить elf и sof в одну флешку, результат такой же...


Скорее всего у вас проблемы с таймингами SDRAM контроллера. у меня с MT48 прекрасно все работает и никуда частоту не сдвигаю.
Еще возможно у вас частота с pll для ОЗУ появляется поздно. т.е. загрузчик сунулся, а клоков еще нет и ОЗУ не работает еще.

Еще момент, есть у меня впечатление документально не подтвержденное, что в ядре EPCS flash controller жестко системные ноги прописаны. Для начала попробуйте проверить .elf и .jic случайно не один поверх другого прожегаются в железе?
alexadmin
У меня когда-то была ситуация, что загрузчик не мог скопировать программу в 8-битную внешнюю SRAM. А в 16-битную копировал нормально (или наоборот, забыл уже). Сама память при этом работала нормально. Так что может так какие-то проблемы с реализацией операции копирования в зависимости от разрядности шины данных.
vadimuzzz
Цитата(a.v.yastrebov @ Feb 22 2013, 13:36) *
При сдвиге фаз в 90 градусов, соблюдения констрайтнов никак не удается достичь.

значит констрейны кривые, т.к. частоты явно не запредельные. вот пример для K4S561632 (16-битная SDRAM), частота 75МГц, дорожки предполагаются выровненными
CODE

set main_clk u1|altpll_component|auto_generated|pll1|clk[0]
set sdram_clk u1|altpll_component|auto_generated|pll1|clk[1]
create_generated_clock -name sdram_clk_pin -source $sdram_clk
set_clock_groups -exclusive -group [list $main_clk $sdram_clk sdram_clk_pin]
#**************************************************************
# sdram timings
#**************************************************************
set tAC 5.4
set tOH 3
set tCM_Hold 0.8
set tCM_Setup 1.5
set tD_Hold 0.8
set tD_Setup 1.5
set tA_Hold 0.8
set tA_Setup 1.5
set_input_delay -max -clock sdram_clk_pin $tAC [get_ports {sdram_dq[*]}]
set_input_delay -min -clock sdram_clk_pin $tOH [get_ports {sdram_dq[*]}]
set_output_delay -max -clock sdram_clk_pin $tD_Setup [get_ports {sdram_dq[*]}]
set_output_delay -min -clock sdram_clk_pin $tD_Hold [get_ports {sdram_dq[*]}]
set_output_delay -max -clock sdram_clk_pin $tCM_Setup [get_ports {sdram_cas_n sdram_ras_n sdram_we_n sdram_cs_n sdram_cke sdram_dqm[*]}]
set_output_delay -min -clock sdram_clk_pin $tCM_Hold [get_ports {sdram_cas_n sdram_ras_n sdram_we_n sdram_cs_n sdram_cke sdram_dqm[*]}]
set_output_delay -max -clock sdram_clk_pin $tA_Setup [get_ports {sdram_addr[*] sdram_ba[*]}]
set_output_delay -min -clock sdram_clk_pin $tA_Hold [get_ports {sdram_addr[*] sdram_ba[*]}]
#**************************************************************
# Set Multicycle Path
#**************************************************************
set_multicycle_path -from [get_clocks {sdram_clk_pin}] -to [get_clocks $main_clk] -setup -end 2
set_multicycle_path -from [get_clocks {sdram_clk_pin}] -to [get_clocks $main_clk] -hold -end 0

обратите внимание на 2 последние строки.
Цитата
Неужели стандартный загрузчик EPCS контроллера не может загружать в SDRAM?

может. но загрузчик можно и свой поставить. смысла в этом в вашем случае я не вижу: ПЛИС конфигурируется, значит как минимум 1 интерфейс в цепочке загрузчика рабочий, разбираемся со вторым (sdram).
Acvarif
Недавно имел похожую ситуацию http://electronix.ru/forum/index.php?showtopic=109862 Все работало нормально в SDRAM из отладчика. Но после прошивки EPCS (после включения питания) не работал .elf.
Все нормально заработало в SDRAM только при прошивке EPCS из flash программера, но не вовсех случаях (не работало при переходе на оптимизированный вариант Release).
Поэтому думаю полезно прислушаться к советам vadimuzzz по поводу констрейнов для sdram (это помимо сдвига фазы который должен быть обязательно в соответствии с документацией по подключению в систему SDRAM). Сам пока не выставлял констрейны sdram, но наверняка придется...
a.v.yastrebov
Проверил сигналы на SDRAM при помощи осциллографа, все времена прекрасно соблюдаются, из отладчика SDRAM читается и пишется без единой ошибки, так же хорошо читается и пишется флешка из-под отладчика. Но при включении питания на ногах SDRAM тишина, будто туда загрузчик вообще не пытается ничего прописать...

Про вариант со своим загрузчиком: в "alternative boot methods" есть пример под названием small_boot_copier, так вот в самом начале своей работы этот загрузчик считывает по базовому адресу EPCS 32-битное число и сравнивает его с 0xA5A5A5A5, что объявлено заранее под именем VALID_BOOT_SIGNATURE, но значения эти не совпадают, т загрузчик вываливается. Что бы это могло значить? Ведь под отладкой флешка прекрасно работает.
vadimuzzz
Цитата(a.v.yastrebov @ Feb 25 2013, 10:23) *
Про вариант со своим загрузчиком: в "alternative boot methods" есть пример под названием small_boot_copier, так вот в самом начале своей работы этот загрузчик считывает по базовому адресу EPCS 32-битное число и сравнивает его с 0xA5A5A5A5, что объявлено заранее под именем VALID_BOOT_SIGNATURE, но значения эти не совпадают, т загрузчик вываливается. Что бы это могло значить? Ведь под отладкой флешка прекрасно работает.

параметры FLASH_BASE и BOOT_IMAGE_OFFSET передаются через make, проверьте их значения
a.v.yastrebov
Цитата(vadimuzzz @ Feb 25 2013, 10:15) *
параметры FLASH_BASE и BOOT_IMAGE_OFFSET передаются через make, проверьте их значения


это понятно. А вообще у кого-нибудь процессор загружается из EPCS при включении питания с такой конфигурацией:

1. адрес сброса на EPCS flash controller
2. адрес исключений на on-chip RAM
3. все поля в BSP Editor на SDRAM (кроме .exeptioins и .entry) ????
vadimuzzz
Цитата(a.v.yastrebov @ Feb 25 2013, 17:07) *
А вообще у кого-нибудь процессор загружается из EPCS при включении питания с такой конфигурацией:
1. адрес сброса на EPCS flash controller
2. адрес исключений на on-chip RAM
3. все поля в BSP Editor на SDRAM (кроме .exeptioins и .entry) ????

у меня все так, только исключения тоже в sdram
Konst_777
Цитата(vadimuzzz @ Feb 25 2013, 14:28) *
у меня все так, только исключения тоже в sdram

+1
a.v.yastrebov
ниче не понимаю...((( а в каком квартусе Вы собираете проекты? на какой частоте работает NIOS?
vadimuzzz
прямо сейчас - в 11-м, а вообще системы с ниосом собирал, начиная с 6.x. баги с загрузчиком встречал пару раз, но это легко проверить, перескочив на соседнюю версию. частоты обычно в районе 50-100 МГц (циклоны 3-4). сделайте дамп флешки, проверьте наличие обеих прошивок (sof и elf), дальше можно уже в загрузчик лезть. баги в загрузчике я, кстати, так и находил - один раз по дампу (байты задом наперед шли), другой раз - кривой скрипт совал загрузчик для стратикса вместо циклоновского.
a.v.yastrebov
у меня тоже 11.0 установлен. Но я пробовал в 9.1 sp1, результат один и тот же. А в qsys Вы никаких дополнительных модулей не подключаете? напрямую соединяете SDRAM-controller и NIOS-II-processor? Просто при использании внутренней памяти, все работает, значит дело не в загрузчике, я так понимаю....
vadimuzzz
Цитата(a.v.yastrebov @ Feb 26 2013, 14:01) *
А в qsys Вы никаких дополнительных модулей не подключаете? напрямую соединяете SDRAM-controller и NIOS-II-processor?

да
Цитата
Просто при использании внутренней памяти, все работает, значит дело не в загрузчике, я так понимаю....

не факт. надо смотреть как загрузчик работает с sdram.
a.v.yastrebov
А клок не SDRAM у Вас, говорите, на 90 градусов опережает клок на qsys-систему?
vadimuzzz
Цитата(a.v.yastrebov @ Feb 26 2013, 15:06) *
А клок не SDRAM у Вас, говорите, на 90 градусов опережает клок на qsys-систему?

сейчас настройки такие: c0 - 75MHz 0ns phase shift (это на проц); c1 - 75MHz -1.45ns phase shift (это на микросхему памяти). но это я подгонял под кривую разводку.
a.v.yastrebov
что-то у меня никак не выходит... не могли бы Вы скинуть какой-нибудь проектик "Hello world!", который у Вас точно грузится при включении питания платы, сравню, как у Вас и у меня? Я был бы Вам очень признателен
Konst_777
Цитата(a.v.yastrebov @ Feb 27 2013, 10:45) *
... не могли бы Вы скинуть какой-нибудь проектик "Hello world!", который у Вас точно грузится при включении питания платы, сравню, как у Вас и у меня?...

Проект создан в Quartus 12.1 SP1 (установлен в "D:\FPGA\Q12_1sp1"). Nios II SBT (Eclipse) будет выдавать предупреждения, что у Вас другой путь к папке, в которую установлен Quartus.
a.v.yastrebov
Спасибо, буду ковырять. У меня получилось загрузить процессор с использованием advanced boot copier, но это слишком затратно по внутренней памяти
vadimuzzz
еще один проект, на всякий случай
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.