Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Контроллер SDRAM
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Волощенко
Всем привет!
Намерен синтезировать собственный контроллер SDRAM на FPGA Stratix II 2S60, в данном случае в Quartus 7.2, но вне SOPC, и без NiosII. Есть вопросы, может кто-то знает ответ.

1. В описании на SDRAM (у меня это MT46V16M16P-6T) для выполнения команд WRITE, необходимо выдержать время tDH, необходимое для предварительной установки данных на шине DQ перед фронтом/спадом сигнала стробирования DQS этих данных. Для MT46V16M16P-6T оно должно быть более 0.4ns (очень малое, но есть).
Если строить FSM контроллера, например, с тактовой частотой 100МГц, то не ясно как выдержать tDH и избежать гонок, то есть сигнал DQS нужно гарантированно задержать. Кто и как решил эту задачу?
Kompot
Цитата(Волощенко @ Jan 16 2009, 13:57) *
Всем привет!
Намерен синтезировать собственный контроллер SDRAM на FPGA Stratix II 2S60, в данном случае в Quartus 7.2, но вне SOPC, и без NiosII. Есть вопросы, может кто-то знает ответ.

1. В описании на SDRAM (у меня это MT46V16M16P-6T) для выполнения команд WRITE, необходимо выдержать время tDH, необходимое для предварительной установки данных на шине DQ перед фронтом/спадом сигнала стробирования DQS этих данных. Для MT46V16M16P-6T оно должно быть более 0.4ns (очень малое, но есть).
Если строить FSM контроллера, например, с тактовой частотой 100МГц, то не ясно как выдержать tDH и избежать гонок, то есть сигнал DQS нужно гарантированно задержать. Кто и как решил эту задачу?



Сигнал DQS формируется в другом клоковом домене, сдвинутом по фазе относительно основного на 90 - 180 -270 градусов.
Причем сдвиг этот можно осуществлять на самой последней стадии - в триггере в IO буфера, питая его сдвинутым клоком.

Запись - не самое страшное. Что Вы будете делать с чтением?
Волощенко
Цитата(Kompot @ Jan 16 2009, 15:04) *
Сигнал DQS формируется в другом клоковом домене, сдвинутом по фазе относительно основного на 90 - 180 -270 градусов.
Причем сдвиг этот можно осуществлять на самой последней стадии - в триггере в IO буфера, питая его сдвинутым клоком.

Спасибо, похоже что только так.
Но просматривая SOPC для проекта от Альтеры full_featured (в нем как раз используется DDR SDRAM Controller MegaCore), я заметил, что согласно SOPC, эта корка синхронизируется только одним синхроимпульсом pll_c0. Хотя модуль PLL формирует еще один сигнал pll_c1, задержанный на 3380 ps. и, получается, что он также должен входить в корку SDRAM. Почему-то в SOPC эта связь не показывается.
Выходит, что мне нужно вынуть из NiosII сигнал pll_c1 и передать его вместе с pll_c0 в мои схемы.

Цитата(Kompot @ Jan 16 2009, 15:04) *
Запись - не самое страшное. Что Вы будете делать с чтением?

Я пока с чтением не заметил больших подвохов. Может плохо искал? Уточните...
Меня больше смущает инициализация, похоже, что для ее начала нужен внешний толчок, например от NiosII. Так?
Kompot
Цитата(Волощенко @ Jan 16 2009, 14:37) *
Я пока с чтением не заметил больших подвохов. Может плохо искал? Уточните...
Меня больше смущает инициализация, похоже, что для ее начала нужен внешний толчок, например от NiosII. Так?



Именно. Нужен внешний толчок. Можно использовать системный Ресет (через большой счетчик, чтобы все прогреться успело).
Возможная ошибка - слишко рано начали инициализацию. Требуется сначала выставить стабильный клок на долгое время, лишь потом инициализацию делать.
Еще не забудьте про регенерацию.
Не забудьте про вход в слип и выход из него. (это если надо слип).

Найдите VHDL or Verilog модель используемой (или похожей памяти) и прикрутите ее к своей среде моделирования.
Очень поможет отлавливать ошибки. Моделсим рулит здесь.

С чтением прикол в том, что фронт DQS и начало выдачи данных совпадают. Поэтому надо задержать DQS внешними цепями R-C например и защелкнуть данные в регистре IO пина и только потом передать в клоковый домен схемы чтения данных - по месту увидите.

Для DDR 100МГц неплохо бы также в HyperLynx оценить форму и задержки сигналов. Понадобятся IBIS модели ФПГА и памяти.

Удачи.
Postoroniy_V
Цитата(Волощенко @ Jan 16 2009, 20:37) *
Спасибо, похоже что только так.
Но просматривая SOPC для проекта от Альтеры full_featured (в нем как раз используется DDR SDRAM Controller MegaCore), я заметил, что согласно SOPC, эта корка синхронизируется только одним синхроимпульсом pll_c0. Хотя модуль PLL формирует еще один сигнал pll_c1, задержанный на 3380 ps. и, получается, что он также должен входить в корку SDRAM. Почему-то в SOPC эта связь не показывается.
Выходит, что мне нужно вынуть из NiosII сигнал pll_c1 и передать его вместе с pll_c0 в мои схемы.


Я пока с чтением не заметил больших подвохов. Может плохо искал? Уточните...
Меня больше смущает инициализация, похоже, что для ее начала нужен внешний толчок, например от NiosII. Так?

на корку подаетё pll_c0, а на мелкосхему памяти pll_c1 чем и гарантируется выдержка всех времён (Tdh, Tsu)
для начальной инициализации пишется автомат, который после ресета и делает ту самую инициализацию.
а почему нельзя взять готовый и его использовать?
Волощенко
к Kompot и Postoroniy_V
Спасибо за советы!
Я сейчас в поиске открытой корки под verilog, чтобы переделать ее под свои задачи (где нужно много памяти и вычислений).
Склоняюсь в сторону ХАРР200, похоже, здесь уже многие ее успешно применяли. Хотелось бы услышать краткие мнения и оценки, или замечания.
А может есть другие корки, более надежные, понятные и лучше описанные?
dvladim
Цитата(Волощенко @ Jan 17 2009, 21:28) *
А может есть другие корки, более надежные, понятные и лучше описанные?

des00 делал корку. На opencores поищите и здесь ее обсуждали неоднократно.
Kompot
Цитата(Волощенко @ Jan 17 2009, 22:28) *
к Kompot и Postoroniy_V
Спасибо за советы!
Я сейчас в поиске открытой корки под verilog, чтобы переделать ее под свои задачи (где нужно много памяти и вычислений).
Склоняюсь в сторону ХАРР200, похоже, здесь уже многие ее успешно применяли. Хотелось бы услышать краткие мнения и оценки, или замечания.
А может есть другие корки, более надежные, понятные и лучше описанные?



ХАРР200 работает. Но Вам я посоветовал бы взять ее только за основу, разобраться как она работает, выбросить все ненужное лично Вам и составить из тех кусков свой собственный, заточенный под Ваши нужды оптимизированный контроллер.

Недостаток всех готовых корок в том, что они избыточны. Кроме того, подключение к корке со стороны памяти понятно.
А вот что с другой стороны? Вам нужна там AMBA-швамба или какая другая спецовая embedded-шина? Всё зависит от того,
что нужно Вам.
Волощенко
к dvladim
Спасибо. Скачал проект, изучаю.


Цитата(Kompot @ Jan 19 2009, 15:38) *
ХАРР200 работает. Но Вам я посоветовал бы взять ее только за основу, разобраться как она работает, выбросить все ненужное лично Вам и составить из тех кусков свой собственный, заточенный под Ваши нужды оптимизированный контроллер.

Спасибо за оценку.

Цитата(Kompot @ Jan 19 2009, 15:38) *
Недостаток всех готовых корок в том, что они избыточны. Кроме того, подключение к корке со стороны памяти понятно.

Некоторую избыточность я уже тоже заметил. Уже есть 5-6 корок на verilog (с VHDL у меня трудности). Так как корки немного с функциональным избытком, то возникает проблема выбора основы.

Цитата(Kompot @ Jan 19 2009, 15:38) *
А вот что с другой стороны? Вам нужна там AMBA-швамба или какая другая спецовая embedded-шина? Всё зависит от того, что нужно Вам.

Нужен еще один жесткий обработчик, но уже с прямым выходом/входом на SDRAM. У меня все 32Мбайт должны обновляться за каждые 3 сек, а из математики что-то похожее на двумерный фильтр. SDRAM должно как бы непрерывно работать в режиме чтение-запись по 8 слов, с автоувеличением адреса, то есть как бы не очень сложно.
Считывать и подгружать думаю без FIFO, а старым проверенным способом из двух регистровых буферов: пока один загружается, второй выгружается и наоборот.
Работой обработчика будет управлять одна или две FSM, затем результаты сжимаются, передаются в NiosII, а из него в Ethernet-100 пакетами udp.

Вот теперь, поднимавшийся здесь вопрос о считывании из SDRAM. Планирую поставить на выходе SDRAM два переключаемых буфера (и на входе тоже). Каждый буфер состоит из двух очередей, по 4 регистра в каждой. Одна очередь синхронизируется прямым клоком, а другая инверсным. Когда один буфер освобождается от SDRAM, то считывание из него выполняется уже с помощью мультиплексора. То есть, в итоге, все должно работать на жесткий обработчик.
WingLion
Кстати, вопрос такой возник. Сколько занимает контроллер SD-RAM, сгенерироеваный с помощью альтеровского ядра?

Интересно просто для сравнения.

Когда-то сделал себе ядро для SD-RAM, которое еще на ACEX-е работаeт. Занимает оно у меня 145 LE и работает в режиме burst read burst write по 64 слова за одно обращение.

Написано было на AHDL, кому интересно, "ужОсный код" можно посмотреть здесь: http://fforum.winglion.ru/viewtopic.php?t=341
Волощенко
к WingLion
Спасибо за ссылки и коды.
Хотел бы уточнить, контроллеры SDRAM делятся на SDR, DDR, DDR2. Тот, что Ваш, это SDR (single data rate).
Я когда создавал тему, думал о DDR (double data rate), только не ввел это в название топика. У меня микросхема MT46V16M16 с DDR архитектурой.

Особенность контроллеров SDRAM для DDR состоит в том, что нужно иметь внутри дополнительную тактовую частоту, которая в два раза выше тактовой частоты памяти. Для этого потребуется PLL, т.е. для памяти с 100МГц, нужно дополнительно создать 200МГц для управляющей FSM. ИХМО

Теперь вопрос, наверное, к Kompot.
Похоже, что нельзя использовать фронт сигнала DQS для стробирования считываемых данных, это так? Вы указывали на эту проблему? То есть, считывание возможно только под контролем FSM, работающей на частоте 200МГц, и лучше на DQS не уповать, так?
WingLion
Цитата(Волощенко @ Jan 23 2009, 09:47) *
к WingLion
Спасибо за ссылки и коды.
Хотел бы уточнить, контроллеры SDRAM делятся на SDR, DDR, DDR2. Тот, что Ваш, это SDR (single data rate).
Я когда создавал тему, думал о DDR (double data rate), только не ввел это в название топика. У меня микросхема MT46V16M16 с DDR архитектурой.

Особенность контроллеров SDRAM для DDR состоит в том, что нужно иметь внутри дополнительную тактовую частоту, которая в два раза выше тактовой частоты памяти. Для этого потребуется PLL, т.е. для памяти с 100МГц, нужно дополнительно создать 200МГц для управляющей FSM.


Да, коды для обычной SD-RAM с single data rate.

o DDR пока только одни мечты. DDR2, DDR3 - совсем заоблачные.

с DDR сейчас и экспериментировать еще негде (лично мне, а не вообще). Но, думаю, что для DDR надо покупать альтеровскую IP, потому что цены на них сейчас уже не столь высоки, как было тогда, когда я взялся за работу над собственным контроллером SDR. И даже месяц возни с настройкой оказывается дороже чем покупное ядро. Кроме того, возможность бесплатных экспериментов с тестовыми версиями IP сильно все меняет.
Kompot
Цитата(Волощенко @ Jan 23 2009, 10:47) *
к WingLion
Спасибо за ссылки и коды.
Хотел бы уточнить, контроллеры SDRAM делятся на SDR, DDR, DDR2. Тот, что Ваш, это SDR (single data rate).
Я когда создавал тему, думал о DDR (double data rate), только не ввел это в название топика. У меня микросхема MT46V16M16 с DDR архитектурой.

Особенность контроллеров SDRAM для DDR состоит в том, что нужно иметь внутри дополнительную тактовую частоту, которая в два раза выше тактовой частоты памяти. Для этого потребуется PLL, т.е. для памяти с 100МГц, нужно дополнительно создать 200МГц для управляющей FSM. ИХМО

Теперь вопрос, наверное, к Kompot.
Похоже, что нельзя использовать фронт сигнала DQS для стробирования считываемых данных, это так? Вы указывали на эту проблему? То есть, считывание возможно только под контролем FSM, работающей на частоте 200МГц, и лучше на DQS не уповать, так?


1. Защелкивать данные при чтении из ИС памяти лучше всего и правильнее всего именно по DQS. Защелкивать желательно в триггер, расположенный в IO блоке - кстати он может иметь настраиваемую задержку.

2. Вы неправы. Особенность ДДР не в удвоенной тактовой для FSM - Вы будете смеяться, все работает на тех же 100 МГц. Единственное отличие - данные надо передавать (и принимать) НА КАЖДОМ ПЕРЕПАДЕ тактового сигнала. А управление точно такое же как у SDRAM. (Ну, управляющих регистров больше, но сути не меняет).
Очень неплохо иметь в FPGA в IO блоке DDR на вход и на выход. Например Xilinx Спартан3 имеет такие. Очень помогает работать с DDR памятью.

Цитата(WingLion @ Jan 23 2009, 15:54) *
Да, коды для обычной SD-RAM с single data rate.

o DDR пока только одни мечты. DDR2, DDR3 - совсем заоблачные.

с DDR сейчас и экспериментировать еще негде (лично мне, а не вообще). Но, думаю, что для DDR надо покупать альтеровскую IP, потому что цены на них сейчас уже не столь высоки, как было тогда, когда я взялся за работу над собственным контроллером SDR. И даже месяц возни с настройкой оказывается дороже чем покупное ядро. Кроме того, возможность бесплатных экспериментов с тестовыми версиями IP сильно все меняет.


Ну что за пораженческие настроения! crying.gif ей богу!

Самое сложное в таком контроллере - разобраться как работает ИС памяти, и построить управляющую FSM. И то и то Вам в жизни пригодится. Нарисовать datapath - сложности не представляет. ЧТо там еще? Адреса? Вы ведь способны нарисовать 22-разрядный синхронный счетчик с предустановкой и после него поставить 2->1 мультиплексор?
Поверьте, Ваш собственный контроллер получится меньше и быстрее чем купленные корки. Ну и опыт какой- никакой появится.

Удачи!
WingLion
Цитата(Kompot @ Jan 23 2009, 17:33) *
Ну что за пораженческие настроения! crying.gif ей богу!

Самое сложное в таком контроллере - разобраться как работает ИС памяти, и построить управляющую FSM. И то и то Вам в жизни пригодится. Нарисовать datapath - сложности не представляет. ЧТо там еще? Адреса? Вы ведь способны нарисовать 22-разрядный синхронный счетчик с предустановкой и после него поставить 2->1 мультиплексор?
Поверьте, Ваш собственный контроллер получится меньше и быстрее чем купленные корки. Ну и опыт какой- никакой появится.


Ой, да какие настроения? wink.gif SD-RAM то я своими руками победил. Прямо в этой теме ссылка на мой код несколько постов выше.
И с DDR разберусь, не мытьем так катаньем... Вот решит руководство, что месяц моего рабочего времени стоит дешевле чем 500$, и буду сам контроллер клепать. А не решит - значит, купят IP-шку, и работать с ней будем. А могут и плюнуть на DDR, скажут, ставь две SD-RAM, делай шину 32 бита вместо 16 и гони все это дело до 133MHz...
Оно, конечно, все и от меня зависит, но Жареный Петух то имеет дурную привычку клевать тогда, когда ему вздумается, а не тогда, когда выгодно разработчику.
Farsch
Уважаемый WingLion! как я понимаю, ваш SDRAM контроллер не будет даже частично совместим с DDR (даже основной цикл с CASE CT[] IS...), так ведь? то есть просто как-то довесить DQS не получится?

вы случайно не сталкивались с мегафункцией ALTDQS? насколько оправдано её использовать?
torik
Цитата
Когда-то сделал себе ядро для SD-RAM, которое еще на ACEX-е работаeт. Занимает оно у меня 145 LE и работает в режиме burst read burst write по 64 слова за одно обращение


Не знаю, как сравнивать это с ACEX, но альтеровский SDRAM контроллер 16 бит под SOPC Builder (авалоновсикий интерфейс) занимает 325 LC. Кто-нибудь может сравнить?
Kuzmi4
Касательно
Цитата
альтеровского SDRAM контроллер 16 бит под SOPC Builder (авалоновсикий интерфейс)

никто не встречал как альтеровцы предлогают его констренить? Ну короме сдвига на -3нс клока на PLL-е?
В инете не нашёл какой-то вменяемой инфы по SDC констрейнам на сие чЮдо crying.gif

Или типа алгоритм работы с ним такой: поставили PLL, сдвинули клок на -3нс и забили на констрейны ?
des00
Цитата(Kuzmi4 @ Jul 31 2011, 12:28) *
В инете не нашёл какой-то вменяемой инфы по SDC констрейнам на сие чЮдо crying.gif

Constraining SOPC Designs v1.0.doc
там про него все
Kuzmi4
2 des00
не подскажите как понимать самый последний констрейн:
Код
set_output_delay -clock sdram_clk_pin -min [expr 1 – (1.0 + 0.4)] <ports>

По идее можно всандалить (аки сферический конь в вакууме)
set_output_delay -clock sdram_clk_pin -max $tsu <ports>
set_output_delay -clock sdram_clk_pin -min -$th <ports>
И если предпоследний констрейн вписывается в задание $tsu, то не ясно почему для $th такое выражение в документе??
des00
Цитата(Kuzmi4 @ Aug 1 2011, 06:41) *
не подскажите как понимать самый последний констрейн:

кхм
Код
Output maximum delay value = maximum trace delay for data + tSU of external register - minimum trace delay for clock
Output minimum delay  = minimum trace delay for data - tH of external register – maximum trace delay for clock
Kuzmi4
Получается тогда что учёт minimum trace delay for data делаетcя только для случая $th.... Странно как то однако всё равно получается.... blink.gif

Но идея мне товарища ясна - я так и думал констрейнить, но где то в инете встречал упоминание что контролелр еНтоД юзает ещё и falling_edge клока, потому думал что констрейны будут пострашней...

PS.
Роут в 6 дюймов для даты при роуте в 3 для клока+ учёт этого дела только в случае $th кажется странным всё равно blink.gif
des00
Цитата(Kuzmi4 @ Aug 1 2011, 06:03) *
Получается тогда что учёт minimum trace delay for data делаетcя только для случая $th.... Странно как то однако всё равно получается.... blink.gif

дык так и есть, чем короче пути тем сложнее с th, чем длиннее тем сложнее с tsu. природу не обманешь biggrin.gif
Kuzmi4
2 des00
по моему проще было учитывать сразу всё, потому что как то странно получается - там учитываем, там не учитываем (чем то напоминает - "тут работаем, а тут не работаем" biggrin.gif )
des00
Цитата(Kuzmi4 @ Aug 1 2011, 06:31) *
по моему проще было учитывать сразу всё, потому что как то странно получается - там учитываем, там не учитываем (чем то напоминает - "тут работаем, а тут не работаем" biggrin.gif )

все учитывается, для холда minimum trace delay for data более важно чем maximim trace delay for data, для сетапа наоборот. анализируем worst case.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.