|
DDR2 на циклоне, помогите запустить |
|
|
|
Oct 8 2014, 10:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Всем доброго дня. Пытаюсь запустить 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. Все питания в норме. Было у кого такое? Куда копать, что смотреть? Похоже дальше нужен сигнал тап, что посмотреть им в первую очередь с чего начать, посоветуйте пожалуйста.
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 11 2014, 11:36
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(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 со второго раза читается из памяти что попало. Как ни пытался повторить - не получилось, читается всегда разное. Ботва какая-то...
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 11 2014, 17:13
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата(alexPec @ Oct 11 2014, 21:04)  Нет, из onchip_memory2_0. ddr имеет базу 0. программа по умолчанию выполняется с адреса 0, так что похоже, что все же из ддр. поставте базовый адрес ончип мемори в 0, заблокируйте иго изменение и сделайте автоассигн базовых адресов. потом в бсп линкер скрипт надо явно указать размещение сегментов в ончип мемори. тогда ддр будет полностью доступна в смысле любого обращения без боязни испортить код.
|
|
|
|
|
Oct 11 2014, 21:12
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(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 через некоторое время, так?
|
|
|
|
|
Oct 12 2014, 05:03
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(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, тайминги оставил такие же. Всем большое спасибо за Ваши мысли и советы!!!
|
|
|
|
|
Oct 17 2014, 16:19
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

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

Лентяй
     
Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843

|
Цитата(alexPec @ Oct 17 2014, 20:19)  Может просветит кто, почему разница чуть не в 2 раза? Чего-то допилить может надо чтоб поменьше занимал? Чип конечно с запасом, но жаба уже на пределе, чуть еще и задушит. Разница в реализации шины Avalon в SOPC Builder'е и в Qsys'е. В Qsys'е Avalon занимает больше места, но зато может обеспечить больую скорость. Подробности можно посмотреть в сравнении сопка и кусиса - его можно на альтеровском сайте поискать.
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|