Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: DDR2 на циклоне, помогите запустить
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
alexPec
Всем доброго дня. Пытаюсь запустить DDR2 на циклоне 3. Нужна помошь опытных в этом деле коллег. В системе ниос, clock crossing bridge(с ниоса на ДДР), DDR контроллер и onchip память. ДДР работает на 135 МГц (иначе констрейны не пролазят), все остальное на 67,5МГц. При компиляции ни одного отрицательного слэка. В эклипсе сделал проект memory test small с bsp, все компилируется без ошибок. Все располагаю в onchip памяти, DDR только тестирую. Программа загружается (в onchip), пошаговая отладка идет. Первый же тест памяти - снача пишется число в память ДДР, затем читается. команда IOWR_32DIRECT в пошаговом режиме выполняется, а вот следующая команда IORD_32DIRECT уже нет. Делаешь на ней step (F6) выполняться начинает и тут же отваливается JTAG отладка. Дебагер находится в положении Run, делаешь паузу или стоп - говорит что потеряна связь с target-ом. При этом конфигурация сохраняется, т.е. можно снова запустить программу на отладку и все начинает работать до первого чтения из ДДР. Встроенный просмотрщик памяти реагирует также: как только пытаешься посмотреть область ДДР - отваливается JTAG. Все питания в норме.
Было у кого такое? Куда копать, что смотреть? Похоже дальше нужен сигнал тап, что посмотреть им в первую очередь с чего начать, посоветуйте пожалуйста.

gosu-art
У меня так же было, если неправильно настроил тайминги ДДР в таблице. Там их много.
krux
из altmemddr выходит сигнал init_done
он в единицу установился?
если нет, значит инициализация DDR не прошла.

если установился, тогда второе предполжение - reset_request_n c altmemddr выходит в 1 позже чем reset_n на nios, т.е. nios подает команды раньше, чем altmemddr способен их обработать.
Golikov A.
была такая фигня правда с ксалинксом. Ошибка была в том что подключение ДДР у них требует отдельного PLL определенного для клоков контроллера, а я запитал его от того же что и проц. И потому он работал не стабильно, стоило кристаллу чуть нагреться и все рушилось. А до установки регистров на шину (они времянку чуть улучшают) все особенно падало как только проходила команда включения кэша данных. Там проходит рефреш кэша по этой команде, обращения в ДДР и кирдык... хотя одиночные тесты проходили боле менее нормально.

Резюме, может у вас что-то подобное? Поглядите клоки для ДДР как формируются и нет ли каких особых требований на это.
alexPec
Цитата(krux @ Oct 8 2014, 16:35) *
из altmemddr выходит сигнал init_done
он в единицу установился?
если нет, значит инициализация DDR не прошла.

если установился, тогда второе предполжение - reset_request_n c altmemddr выходит в 1 позже чем reset_n на nios, т.е. nios подает команды раньше, чем altmemddr способен их обработать.


В общем после долгих экспериментов со средами разработки собрал в Q91 систему (рисунок). Только в Q91 в элипсе не отваливался Jtag при обращении к DDR.
Результат такой: init_done в 1 выставляется, в пошаговом режиме пытаюсь писать-читать в/из DDR (программа в onchip) - ничего не меняется в памяти. Читаются по разным адресам разные но всегда одни и те же значения. На запись не реагирует. Значения в любом 32-битном слове состоят из 4-х одинаковых байт. Не надо ли часом в clock-crossing bridge (а может до или после него) ставить какие-то преобразователи 8<->32 бит? Хотя смотрел пример для starter kit - там правда DDR, не DDR2, но 16-разрядная и тоже без всяких преобразователей вешается на шину процессора.
И насчет того что ниос подает команды раньше, это Вы имеете ввиду команды инициализации? Их ниос подает, не контроллер DDR?
Если все же DDR, тогда в пошаговом режиме получается что этот пункт можно отбросить?

PS со второго раза читается из памяти что попало. Как ни пытался повторить - не получилось, читается всегда разное. Ботва какая-то...
thermit
у вас прога из какой памяти выполняется? судя по картинке из ддр?
alexPec
Цитата(thermit @ Oct 11 2014, 19:41) *
у вас прога из какой памяти выполняется? судя по картинке из ддр?


Нет, из onchip_memory2_0.
thermit
Цитата(alexPec @ Oct 11 2014, 21:04) *
Нет, из onchip_memory2_0.


ddr имеет базу 0. программа по умолчанию выполняется с адреса 0, так что похоже, что все же из ддр.
поставте базовый адрес ончип мемори в 0, заблокируйте иго изменение и сделайте автоассигн базовых адресов. потом в бсп линкер скрипт надо явно указать размещение сегментов в ончип мемори. тогда ддр будет полностью доступна в смысле любого обращения без боязни испортить код.
alexPec
Цитата(thermit @ Oct 11 2014, 21:13) *
ddr имеет базу 0. программа по умолчанию выполняется с адреса 0, так что похоже, что все же из ддр.
поставте базовый адрес ончип мемори в 0, заблокируйте иго изменение и сделайте автоассигн базовых адресов. потом в бсп линкер скрипт надо явно указать размещение сегментов в ончип мемори. тогда ддр будет полностью доступна в смысле любого обращения без боязни испортить код.


Нене, там клок кроссинг бридж стоит, DDR располагается с адреса 0х8000000. В процессоре ресет вектор указывает на ончип. В BSP в линкере я уже поставил все сегменты на ончип, в ДДР ничего нет.

Но я сейчас пробую проект запустить не только в Q91, еще и в Q13.1. Там картина другая: если в Q91 init done стоит в 1, то такой же проект в Q13.1 (ончип память, процессор, DDR2) ведет себя по другому - init done там нуле. Reset_request_n с ДДР контроллера в единице, т.е. вроде (как я понял из описания контроллера ДДР) ПЛЛ ДДР-ная в захвате. Процессорная ПЛЛ тоже в захвате. Как его (init_done контроллера ДДР) заставить в 1 перейти?

Судя по описанию сигнала :

When the memory initialization, training, and calibration are complete, the
PHY sequencer asserts ctrl_usr_mode_rdy to the memory controller,
which then asserts this signal to indicate that the memory interface is ready
for use.

это индикация того, что стейт-машина инициализации памяти закончила работу, и от результата этой работы этот сигнал не зависит, т.е. по любому должен выставиться в 1 через некоторое время, так?
vadimuzzz
alexPec, а у вас кит какой-нибудь есть под рукой? С DDR ошибиться-то почти негде: констрейны генератор корки делает, остается только их подключить и пины назначить. Просто чтобы отвлечься (иногда глаз замылится и очевидную ошибку пропускает) и исключить кривую схему/разводку повторите проект на какой-нибудь девборде. У меня есть проект для стартера, если что (вроде и тут выкладывал).
Timmy
Отваливается JTAG - это надо понимать, как отваливается JTAG Debugger? Вероятная причина - блокировка шины Avalon. Так что стоит посмотреть на шины данных и команд в SignalTap, а лучше в симуляторе, если там проблема будет воспроизводиться.
alexPec
Цитата(Timmy @ Oct 12 2014, 07:26) *
Отваливается JTAG - это надо понимать, как отваливается JTAG Debugger? Вероятная причина - блокировка шины Avalon.


Да, я тоже так и думал.

Цитата
alexPec, а у вас кит какой-нибудь есть под рукой? С DDR ошибиться-то почти негде: констрейны генератор корки делает, остается только их подключить и пины назначить. Просто чтобы отвлечься (иногда глаз замылится и очевидную ошибку пропускает)


Вот это точно. Кит у меня на 3C25, там DDR, не DDR2, и контроллер соответствующий, поэтому вроде как без надобности.

В общем завелась ДДР (полный тест пока не прогонял), по отделным адресам пишет-читает нормально, заработал проект в Q13.1 (кстати, спасибо за него закромам). Что было:

1. Самое главное, похоже - перепутал при назначении пинов BA0 и BA1. Все бы ничего, только они в инициализации участвуют ))
2. Убрал из СОПЦа JTAG UART (на случай если он участвует в зависании при обращении к ДДР)
3. Для своей памяти с спидгрейдом -25 загрузил настройки (из предустановленных) как для памяти из кита на EP3C120 с спидгрейдом -3 и поменял только разрядность BA, тайминги оставил такие же.

Всем большое спасибо за Ваши мысли и советы!!! biggrin.gif

alexPec
А вот что-то сравнил я СОПЦ, состоящий из контроллера ДДР2 и процессора ниос, собранный в Q91 и Q13.1. Сопц один в один, из Q91 просто перенес в Q13.1 и перекомпилировал. В итоге: в Q91 СОПЦ занимал чуть меньше 6000LEs, а в Q13.1 - уже 10112LEs. Чет большая разница для ОДИНАКОВОГО функционала. Может просветит кто, почему разница чуть не в 2 раза? Чего-то допилить может надо чтоб поменьше занимал? Чип конечно с запасом, но жаба уже на пределе, чуть еще и задушит.

Кстати, нашел еще одну причину плохой работы (неработы) памяти - при питании 1.8В пульсации были 1В sm.gif. Устранил, работает как часы.
Kuzmi4
Цитата(alexPec @ Oct 17 2014, 18:19) *
...Чет большая разница для ОДИНАКОВОГО функционала....

функционал одинаковый, реализация разная biggrin.gif
alexPec
Цитата(Kuzmi4 @ Oct 17 2014, 20:30) *
функционал одинаковый, реализация разная biggrin.gif


Ну то есть это нормально и никак его (родной альтеровский контроллер) не ужать?
Kuzmi4
2 alexPec
На счёт "нормально это или нет" - это вам решать wink.gif
Касательно "места поменьше": там есть разные контролеры DDR2 в Qsys (производительность разная, рекомендовано/ не рекомендовано в новых разработках и т.д) - посмотрите, выберите..
В конце концов, если сильно задавит жаба/обстоятельства/... (нужное подчеркнуть), то можно из старого SoPC вытащить и в новый вставить, но я бы так делал в самом крайнем случае (когда уже угрожают физической расправой например).
Stewart Little
Цитата(alexPec @ Oct 17 2014, 20:19) *
Может просветит кто, почему разница чуть не в 2 раза? Чего-то допилить может надо чтоб поменьше занимал? Чип конечно с запасом, но жаба уже на пределе, чуть еще и задушит.

Разница в реализации шины Avalon в SOPC Builder'е и в Qsys'е.
В Qsys'е Avalon занимает больше места, но зато может обеспечить больую скорость.
Подробности можно посмотреть в сравнении сопка и кусиса - его можно на альтеровском сайте поискать.
alexPec
Цитата(Stewart Little @ Oct 17 2014, 22:04) *
Разница в реализации шины Avalon в SOPC Builder'е и в Qsys'е.
В Qsys'е Avalon занимает больше места, но зато может обеспечить больую скорость.
Подробности можно посмотреть в сравнении сопка и кусиса - его можно на альтеровском сайте поискать.


Спасибо, это объясняет жадность кусиса.
vadimuzzz
можно посмотреть статистику по использованным ресурсам после компиляции, какой модуль сколько сожрал
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.