реклама на сайте
подробности

 
 
> Контроллер SDRAM, Вопросы и детали синтеза
Волощенко
сообщение Jan 16 2009, 10:57
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377



Всем привет!
Намерен синтезировать собственный контроллер 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 нужно гарантированно задержать. Кто и как решил эту задачу?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
Kompot
сообщение Jan 16 2009, 11:04
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 10-06-08
Из: Хочу в пампасы...
Пользователь №: 38 192



Цитата(Волощенко @ 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 буфера, питая его сдвинутым клоком.

Запись - не самое страшное. Что Вы будете делать с чтением?
Go to the top of the page
 
+Quote Post
Волощенко
сообщение Jan 16 2009, 11:37
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377



Цитата(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. Так?
Go to the top of the page
 
+Quote Post
Kompot
сообщение Jan 16 2009, 13:40
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 10-06-08
Из: Хочу в пампасы...
Пользователь №: 38 192



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



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

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

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

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

Удачи.
Go to the top of the page
 
+Quote Post
Postoroniy_V
сообщение Jan 17 2009, 08:08
Сообщение #5


МедвеД Инженер I
****

Группа: Свой
Сообщений: 816
Регистрация: 21-10-04
Пользователь №: 951



Цитата(Волощенко @ 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)
для начальной инициализации пишется автомат, который после ресета и делает ту самую инициализацию.
а почему нельзя взять готовый и его использовать?


--------------------
Cogito ergo sum
Go to the top of the page
 
+Quote Post
Волощенко
сообщение Jan 17 2009, 18:28
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377



к Kompot и Postoroniy_V
Спасибо за советы!
Я сейчас в поиске открытой корки под verilog, чтобы переделать ее под свои задачи (где нужно много памяти и вычислений).
Склоняюсь в сторону ХАРР200, похоже, здесь уже многие ее успешно применяли. Хотелось бы услышать краткие мнения и оценки, или замечания.
А может есть другие корки, более надежные, понятные и лучше описанные?
Go to the top of the page
 
+Quote Post
dvladim
сообщение Jan 17 2009, 19:25
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 654
Регистрация: 24-01-07
Из: Воронеж
Пользователь №: 24 737



Цитата(Волощенко @ Jan 17 2009, 21:28) *
А может есть другие корки, более надежные, понятные и лучше описанные?

des00 делал корку. На opencores поищите и здесь ее обсуждали неоднократно.
Go to the top of the page
 
+Quote Post
Kompot
сообщение Jan 19 2009, 12:38
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 10-06-08
Из: Хочу в пампасы...
Пользователь №: 38 192



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



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

Недостаток всех готовых корок в том, что они избыточны. Кроме того, подключение к корке со стороны памяти понятно.
А вот что с другой стороны? Вам нужна там AMBA-швамба или какая другая спецовая embedded-шина? Всё зависит от того,
что нужно Вам.
Go to the top of the page
 
+Quote Post
Волощенко
сообщение Jan 19 2009, 14:10
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377



к 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, то считывание из него выполняется уже с помощью мультиплексора. То есть, в итоге, все должно работать на жесткий обработчик.
Go to the top of the page
 
+Quote Post
WingLion
сообщение Jan 22 2009, 19:24
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 18-11-06
Из: St.Petersburg
Пользователь №: 22 470



Кстати, вопрос такой возник. Сколько занимает контроллер SD-RAM, сгенерироеваный с помощью альтеровского ядра?

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

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

Написано было на AHDL, кому интересно, "ужОсный код" можно посмотреть здесь: http://fforum.winglion.ru/viewtopic.php?t=341


--------------------
С уважением, WingLion.
http://fforum.winglion.ru
Go to the top of the page
 
+Quote Post
Волощенко
сообщение Jan 23 2009, 06:47
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377



к 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 не уповать, так?
Go to the top of the page
 
+Quote Post
WingLion
сообщение Jan 23 2009, 11:54
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 18-11-06
Из: St.Petersburg
Пользователь №: 22 470



Цитата(Волощенко @ 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 сильно все меняет.


--------------------
С уважением, WingLion.
http://fforum.winglion.ru
Go to the top of the page
 
+Quote Post
Kompot
сообщение Jan 23 2009, 14:33
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 10-06-08
Из: Хочу в пампасы...
Пользователь №: 38 192



Цитата(Волощенко @ 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 мультиплексор?
Поверьте, Ваш собственный контроллер получится меньше и быстрее чем купленные корки. Ну и опыт какой- никакой появится.

Удачи!
Go to the top of the page
 
+Quote Post
WingLion
сообщение Jan 23 2009, 16:47
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 18-11-06
Из: St.Petersburg
Пользователь №: 22 470



Цитата(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...
Оно, конечно, все и от меня зависит, но Жареный Петух то имеет дурную привычку клевать тогда, когда ему вздумается, а не тогда, когда выгодно разработчику.


--------------------
С уважением, WingLion.
http://fforum.winglion.ru
Go to the top of the page
 
+Quote Post
Farsch
сообщение Nov 10 2010, 12:46
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 2-11-10
Из: СПб
Пользователь №: 60 600



Уважаемый WingLion! как я понимаю, ваш SDRAM контроллер не будет даже частично совместим с DDR (даже основной цикл с CASE CT[] IS...), так ведь? то есть просто как-то довесить DQS не получится?

вы случайно не сталкивались с мегафункцией ALTDQS? насколько оправдано её использовать?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th June 2025 - 12:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01517 секунд с 7
ELECTRONIX ©2004-2016