Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SDR SDRAM память
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Интерфейсы
Flip-fl0p
Возник вопрос по SDR памяти в части регенерации.
Вот что нарыл по поводу регенерации( http://www.dsioffe.narod.ru/mysdram/MyMicronSDRAM.htm#top )

Цитата
Автоматическая регенерация используется во время нормальной работы SDRAM и аналогична регенерации CAS-BEFORE-RAS в обычной DRAM. Эта команда не постоянна, её надо подавать каждый раз, когда требуется регенерация. Перед её выполнением все активные банки должны быть деактивированы. Команда AUTO REFRESH должна быть подана не менее, чем за время tRP после команды PRECHARGE, как показано в разделе описания работы.
Адресация производится встроенным контроллером регенерации. Поэтому при автоматической регенерации состояние адресных входов безразлично.

64 Мб SDRAM требует 4096 циклов автоматической регенерации каждые 64 мс (tREF) независимо от ширины слова. Выполнение команды автоматической регенерации каждые 15625 мкс необходимо и достаточно для полной регенерации всех рядов. В качестве альтернативы 4096 команд автоматической регенерации могут выполняться одним пакетом с минимальным временем цикла tRC каждые 64 мс.


Совсем непонятно что такое автоматическая регенерация, и когда её включать. Какие банки она регенерирует ? Какие строки ?

Так-же неясна фраза

Цитата
64 Мб SDRAM требует 4096 циклов автоматической регенерации каждые 64 мс (tREF) независимо от ширины слова.
Т.е каждые 64 мс мы запускаем регенерацию. Сначала одну строку, потом вторую .... и.т.д. Доходим до нуля, и снова регенерируем (Мне это напомнило движение единицы в кольцевом сдвиговом регистре). Или это не так ?

Вот эта фраза совсем непонятна
Цитата
В качестве альтернативы 4096 команд автоматической регенерации могут выполняться одним пакетом с минимальным временем цикла tRC каждые 64 мс.


Можете помочь разобраться ?

Den64
Лучше читать с первоисточника. Читайте лучше даташит к вашей микросхеме памяти и апноты.
jcxz
Цитата(Flip-fl0p @ Sep 19 2016, 15:07) *
Совсем непонятно что такое автоматическая регенерация, и когда её включать. Какие банки она регенерирует ? Какие строки ?

Чтобы её включить (если речь идёт о SDRAM подключенной к МК) достаточно в контроллере внешней памяти МК прописать период регенерации. Ну по-крайней мере для LPC1788 это справедливо. Ну и остальные параметры правильно проинитить. Дальше контроллер всё делает сам.

Цитата(Flip-fl0p @ Sep 19 2016, 15:07) *
Т.е каждые 64 мс мы запускаем регенерацию. Сначала одну строку, потом вторую .... и.т.д. Доходим до нуля, и снова регенерируем (Мне это напомнило движение единицы в кольцевом сдвиговом регистре). Или это не так ?

Нет, не так. 64мс - это время, за которое весь чип должен быть регенерирован. Т.е. - если в чипе 8192 строк, то период регенерации должен быть <= 64мс/8192.
Хотя в реальности чип держит данные без регенерации гораздо дольше чем 64мс.

Цитата(Flip-fl0p @ Sep 19 2016, 15:07) *
Вот эта фраза совсем непонятна

А что непонятного? При чтении данных они одновременно и регенерируются. Т.е. - можно не включать автоматическую регенерацию силами контроллера памяти, а просто программно как минимум раз в 64мс считать данные из всех строк чипа. Именно поэтому в некоторых областях применения памяти автоматическую регенерацию не делают, например - для видеопамяти, так как она и так вся не менее чем раз за один кадр считывается.
Flip-fl0p
Цитата(Den64 @ Sep 19 2016, 13:00) *
Лучше читать с первоисточника. Читайте лучше даташит к вашей микросхеме памяти и апноты.

Да я читал первоисточник. Там то-же самое написано, только на английском. Мне бы разобраться с этими командами. Чтобы меня навели на мысль, подсказали, где я туплю.
Смысл команды мне ясен - подзарядить конденсаторы. А вот как это правильно делать я не понял. Просто в datashit'е есть картинка как это делать.

В то-же время есть другое требования что время обновления 4096 строк 64 мс. Вот я и пытаюсь понять как происходит рефреш. Зачем нужны эти два требования. Что будет если во время обновления строки туда писать/читать данные. В datashit'е я ответов на эти вопросы не увидел.




Цитата(jcxz @ Sep 19 2016, 14:55) *
Чтобы её включить (если речь идёт о SDRAM подключенной к МК) достаточно в контроллере внешней памяти МК прописать период регенерации. Ну по-крайней мере для LPC1788 это справедливо. Ну и остальные параметры правильно проинитить. Дальше контроллер всё делает сам.


Нет, не так. 64мс - это время, за которое весь чип должен быть регенерирован. Т.е. - если в чипе 8192 строк, то период регенерации должен быть <= 64мс/8192.
Хотя в реальности чип держит данные без регенерации гораздо дольше чем 64мс.


А что непонятного? При чтении данных они одновременно и регенерируются. Т.е. - можно не включать автоматическую регенерацию силами контроллера памяти, а просто программно как минимум раз в 64мс считать данные из всех строк чипа. Именно поэтому в некоторых областях применения памяти автоматическую регенерацию не делают, например - для видеопамяти, так как она и так вся не менее чем раз за один кадр считывается.

Меня вот это вот и смущает
Цитата
то период регенерации должен быть <= 64мс/8192.

Как я понял, регенерация происходит построчно. В этом случае при таком периоде у нас получиться, что как только мы подзаридили последнюю строку у нас прошло 64 мс. И настало время снова регенирировать первую строку. Тогда зачем дана картинка ? (выложил сообщением ранее).
jcxz
Цитата(Flip-fl0p @ Sep 19 2016, 18:16) *
Как я понял, регенерация происходит построчно. В этом случае при таком периоде у нас получиться, что как только мы подзаридили последнюю строку у нас прошло 64 мс. И настало время снова регенирировать первую строку. Тогда зачем дана картинка ? (выложил сообщением ранее).

64 мс (или менее) должно быть не между последней строкой и первой, а между первой и снова первой (в след. цикле регенерации). За 64мс все строки должны быть регенерированы.
А зачем Вам это надо? Контроллер SDRAM разрабатываете?
Flip-fl0p
Цитата(jcxz @ Sep 19 2016, 15:28) *
64 мс (или менее) должно быть не между последней строкой и первой, а между первой и снова первой (в след. цикле регенерации). За 64мс все строки должны быть регенерированы.
А зачем Вам это надо? Контроллер SDRAM разрабатываете?

Да. Я пытаюсь сделать собственный SDRAM контроллер. Хочу организовать фреймбуфер для LVDS матрицы. Знаю, что есть готовые варианты контроллеров. Но я хочу научиться , а не брать готовое.
Так у нас и получается что регенерация выглядит как-будто единица "бегает" по кольцевому сдвиговому регистру.
0001
0010
0100
1000
0001
Период регенерации каждой строки расположенному по конкретному адресу получается 64 мs. Как я понял надо каждые 64мс/8192 выдавать сигнал регенерации. А встроенный контроллер уже сам будет выбирать строки. Так опять же накой фиг нужна картинка, выложенная мной ? Или она говорит лишь о минимальном времени регенерации и о том как должна выглядеть команда авто-регенерации ?
Код
1. После команды PRECHARGE
2. Подождали  время TRP
3. Выдали команду AUTO REFRESH
4. Подождали время TRFC
5. Выдали команду AUTO REFRESH
6. Подождали время TRFC
7. Можно работать со строкой

И что делать если строка в которую я читаю\пишу данные выбрана контролером для регенерации. Как я узнаю, что контроллер в это время работает со строкой ?
jcxz
Цитата(Flip-fl0p @ Sep 19 2016, 18:49) *
Период регенерации каждой строки расположенному по конкретному адресу получается 64 мs. Как я понял надо каждые 64мс/8192 выдавать сигнал регенерации. А встроенный контроллер уже сам будет выбирать строки. Так опять же накой фиг нужна картинка, выложенная мной ? Или она говорит лишь о минимальном времени регенерации и о том как должна выглядеть команда авто-регенерации ?

Ну да - не более 64мс. Контроллер SDRAM просто выдаёт сигнал авторегенерации (определённый набор сигналов RAS,CAS,CS,WE,CKE). Номер регенерируемой строки SDRAM получает из внутреннего своего счётчика, который после инкрементируется.

Цитата(Flip-fl0p @ Sep 19 2016, 18:49) *
И что делать если строка в которую я читаю\пишу данные выбрана контролером для регенерации. Как я узнаю, что контроллер в это время работает со строкой ?

Что значит "я пишу"? Все операции производит контроллер SDRAM. Он и читает и пишет и сигналы авторегенерации выдаёт. Если процессор запрашивает доступ к SDRAM (через контроллер), то на это время все циклы авторегенерации могут например откладываться, накапливаясь где-то, а когда будет интервал простоя в запросах CPU, в это время контроллер может все эти задержанные авторефреши быстро и провести. А можно и не задерживать рефреши, а задерживать обслуживание запросов CPU на время авторефреша - тут воля Ваша как реализовать, раз Вы сами и делаете этот контроллер. Можете вообще пакетно один раз за 64 мс сразу все строки регенерировать, приостановив нормальный обмен на это время. Можно даже учесть алгоритм работы ПО с этой памятью и не обновлять те строки, которые явно должны быть считаны CPU за время 64мс - сэкономить таким образом на бюджете времени SDRAM.
А ещё можно использовать Self Refresh.
Flip-fl0p
Цитата(jcxz @ Sep 19 2016, 16:07) *
Ну да - не более 64мс. Контроллер SDRAM просто выдаёт сигнал авторегенерации (определённый набор сигналов RAS,CAS,CS,WE,CKE). Номер регенерируемой строки SDRAM получает из внутреннего своего счётчика, который после инкрементируется.


Что значит "я пишу"? Все операции производит контроллер SDRAM. Он и читает и пишет и сигналы авторегенерации выдаёт. Если процессор запрашивает доступ к SDRAM (через контроллер), то на это время все циклы авторегенерации могут например откладываться, накапливаясь где-то, а когда будет интервал простоя в запросах CPU, в это время контроллер может все эти задержанные авторефреши быстро и провести. А можно и не задерживать рефреши, а задерживать обслуживание запросов CPU на время авторефреша - тут воля Ваша как реализовать, раз Вы сами и делаете этот контроллер. Можете вообще пакетно один раз за 64 мс сразу все строки регенерировать, приостановив нормальный обмен на это время. Можно даже учесть алгоритм работы ПО с этой памятью и не обновлять те строки, которые явно должны быть считаны CPU за время 64мс - сэкономить таким образом на бюджете времени SDRAM.
А ещё можно использовать Self Refresh.

А можно поподробнее поведать про режим пакетной регенерации в двух словах ?
jcxz
Цитата(Flip-fl0p @ Sep 19 2016, 19:17) *
А можно поподробнее поведать про режим пакетной регенерации в двух словах ?

Один раз за период не более 64мс делаете NR (NR - число строк) последовательных чтений с шагом, определяемым организацией карты адресов чипа.
Но это для регенерации силами внешнего Bus Master-а, обращающегося к памяти через контроллер SDRAM. Если силами контроллера SDRAM, то лучше NR раз подать команду автоматической регенерации.

PS: Вы задаёте вопросы, ответы на которые очевидны. Значит не читали вообще никаких док по работе SDRAM. Поищите в инете - таких док полно и ознакомьтесь хотя-бы с базовыми понятиями.
Flip-fl0p
Цитата(jcxz @ Sep 19 2016, 20:27) *
Один раз за период не более 64мс делаете NR (NR - число строк) последовательных чтений с шагом, определяемым организацией карты адресов чипа.
Но это для регенерации силами внешнего Bus Master-а, обращающегося к памяти через контроллер SDRAM. Если силами контроллера SDRAM, то лучше NR раз подать команду автоматической регенерации.

PS: Вы задаёте вопросы, ответы на которые очевидны. Значит не читали вообще никаких док по работе SDRAM. Поищите в инете - таких док полно и ознакомьтесь хотя-бы с базовыми понятиями.

Спасибо !
PS. Я честно искал информацию по работе с SDRAM памятью. Но нарыл информации недостаточно, чтобы получить ответы на свои вопросы. То что я нарыл почти всё на английском. У меня с ним беда (надеюсь временная). Поэтому обратился за помощью к знающим людям.
jcxz
Прикладываю сюда достаточно хорошие доки по операциям SDRAM. Они конечно на англ. Но вроде и на русском встречал много инфы по SDRAM в сети.
Нажмите для просмотра прикрепленного файла Нажмите для просмотра прикрепленного файла
iosifk
Цитата(Flip-fl0p @ Sep 20 2016, 10:59) *
PS. Я честно искал информацию по работе с SDRAM памятью. Но нарыл информации недостаточно, чтобы получить ответы на свои вопросы. То что я нарыл почти всё на английском. У меня с ним беда (надеюсь временная). Поэтому обратился за помощью к знающим людям.

Я думаю, что это просто треп ленивого...
Регенерацию динамической памяти можно найти в любом учебнике и студенты это должны учить... В конце концов можно взять описание любой отечественной микросхемы начиная с 30-ти летней давности...
jcxz
Цитата(iosifk @ Sep 20 2016, 14:27) *
Регенерацию динамической памяти можно найти в любом учебнике и студенты это должны учить... В конце концов можно взять описание любой отечественной микросхемы начиная с 30-ти летней давности...

Согласен. Набираешь в гугле - и кучу ссылок даёт, только отсеивай. В том числе и на русском.
Flip-fl0p
Цитата(iosifk @ Sep 20 2016, 11:27) *
Я думаю, что это просто треп ленивого...
Регенерацию динамической памяти можно найти в любом учебнике и студенты это должны учить... В конце концов можно взять описание любой отечественной микросхемы начиная с 30-ти летней давности...

К моему большому сожалению Вы не правы. Студентов этому не учат(их вообще мало чему учат...) Я учился в достаточно хорошем институте (ГУАП). Даже окончил его с красным дипломом. Но к сожалению я понимаю, что по сути я почти за 5 лет учёбы практически ничему не научился, и по факту мой диплом ни о чем не говорит.
То, что я читаю в книгах по ПЛИС, схемотехнике, читаю на форумах, нам даже не говорили. Максимум что нам дали - это основы AHDL( совсем базовый уровень). Никаких интерфейсов, нам не давали за 5 лет обучения. Как ни странно, но большую часть учебного времени занимали гуманитарные предметы, хотя специальность техническая.
Вот и приходится всё изучать с нуля самому в свободное от работы время.
XVR
Цитата(Flip-fl0p @ Sep 19 2016, 15:49) *
Да. Я пытаюсь сделать собственный SDRAM контроллер. Хочу организовать фреймбуфер для LVDS матрицы.
Я правильно понимаю, что ваш контролер будет постоянно сканировать SDRAM и выдывать ее содержимое в LVDS матрицу? Если это так, то регенерация вам возможно вообще не понадобится (если правильно расположить данные в SDRAM)

Flip-fl0p
Цитата(XVR @ Sep 20 2016, 13:28) *
Я правильно понимаю, что ваш контролер будет постоянно сканировать SDRAM и выдывать ее содержимое в LVDS матрицу? Если это так, то регенерация вам возможно вообще не понадобится (если правильно расположить данные в SDRAM)

Согласен, что если читать фрейм буфер чаще чем частота регенерации, то регенерация в этом случае не нужна. Но тут есть "спортивный" интерес сделать полноценный контроллер. Мало ли в других проектах пригодиться. Моя задача не сделать готовое устройство, а научиться полноценно работать с памятью. Сейчас хочу просто записать в память какое нибудь значение, и прочитать его и зажечь светодиоды на макетной плате. Вот смогу это реализовать, начну делать обычную фоторамку. Благо выводить данные на матрицу я научился ( во всяком случае генератор цветных полос работает как положено)
XVR
Цитата(Flip-fl0p @ Sep 20 2016, 13:34) *
Но тут есть "спортивный" интерес сделать полноценный контроллер. Мало ли в других проектах пригодиться. Моя задача не сделать готовое устройство, а научиться полноценно работать с памятью.
Тогда возьмите откуда нибудь (с opencore например) готовый контролер, и посмотрите, как он сделан. Потом можете написать свой (если процесс важнее результата sm.gif )

Flip-fl0p
Цитата(XVR @ Sep 20 2016, 13:43) *
Тогда возьмите откуда нибудь (с opencore например) готовый контролер, и посмотрите, как он сделан. Потом можете написать свой (если процесс важнее результата sm.gif )

Собственно я сейчас этим и занимаюсь. Контроллер нашел. Разобрал его по полочкам. И сейчас пытаюсь написать модуль, который при помощи данного контроллера загружает\читает данные с памяти.

Алгоритм работы моего модуля такой (реализую на автомате Мили):

1. Ждем пока проинициализируется память и загрузятся настройки в регистр.
2. Затем по адресу "000000000000" в банк "00" пишем значение x"FF".
3. Затем по нажатию кнопки на макетной плате мой модуль должен загрузить записанное значение в регистр, и хранить его там, пока я не нажму кнопку сброса этого регистра.
4. Если в регистре храниться значение FF, то я зажигаю светодиод на макетной плате.
iosifk
Цитата(iosifk @ Sep 20 2016, 11:27) *
Я думаю, что это просто треп ленивого...
Регенерацию динамической памяти можно найти в любом учебнике и студенты это должны учить... В конце концов можно взять описание любой отечественной микросхемы начиная с 30-ти летней давности...

В продолжение
http://www.ord.com.ru/files/book3/p234.html
http://www.155la3.ru/datafiles/kr1810vt3.pdf

и много много других...
Flip-fl0p
Цитата(iosifk @ Sep 20 2016, 15:04) *
В продолжение
http://www.ord.com.ru/files/book3/p234.html
http://www.155la3.ru/datafiles/kr1810vt3.pdf

и много много других...

Спасибо большое. Буду изучать и разбирать.
Вы как-то говорили, что можете по Skype показать как правильно работать в Modelsim'e. Был бы очень признателен, если вы покажите. Как с Вами связаться ?
iosifk
Цитата(Flip-fl0p @ Sep 20 2016, 15:10) *
Спасибо большое. Буду изучать и разбирать.
Вы как-то говорили, что можете по Skype показать как правильно работать в Modelsim'e. Был бы очень признателен, если вы покажите. Как с Вами связаться ?

Так по скайпу и связаться... Хоть сейчас...

jcxz
Интересно, что хоть и везде пишут про 64мс - необходимый минимальный период регенерации SDRAM, но вот у меня сейчас на столе плата с K4S561632N-LC75. Отключаю регенерацию её, но информация в ней держится без разрушения вплоть до 6 секунд. То есть - почти 100-кратный запас. Конечно условия тепличные, но всё же.....
Flip-fl0p
Моделирование памяти работает, но меня очень смущает тот факт, что модель памяти отрабатывает не так как должна: у памяти выставлен параметр CL= 2. Соответственно между командой чтения и появлением данных должно пройти как минимум 2 такта, вот картинка производителя памяти, всё просто и понятно:



Но вот моделирование показывает, что данные появляются сразу на следующем такте, что расходиться с картинкой производителя:



Посмотрел я немного код модели памяти, не нашел ничего, что говорит о том, что данные должны выдаваться через 2 такта. Но сильно не пинайте, Verilog я знаю плохо, мог и не увидеть.....
Вот я и думаю: то ли я лыжник плохой, то ли лыжи не едут.



Вот код модели любезно скачанный на сайте производителя памяти:

UPD

Данные должны быть на 1/4 периода дальше, чем я накорябал.
Flip-fl0p
С проблемой моделирования разобрался. Судя по работе железа ошибка действительно в модели памяти.

Хотелось бы услышать совет по организации чтения и записи в память, с последующим выводом этих данных на LVDS матрицу.

Ситуация какая:
Контроллер запустился на частоте 50 Мгц.
LVDS матрица разрешением 800х480 по Datasheet работает на частоте 33 Мгц (но по факту запускается спокойно и на 2 МГц, но видно как обновляется экран). Для упрощения работы с памятью я планирую применять только по 5 разрядов каждого цвета(15 битный цвет), т.к ячейка памяти имеет размер 16 бит.

На данный момент контроллер может как одиночно обращаться к произвольным ячейкам, так и последовательно считывать/записывать всю строку (256 слов по 16 бит подряд максимум). Затем я обязан закрыть строку, чтобы открыть новую.

Цикл одиночного чтения\записи занимает не менее 7 тактов:
1 такт - запрос чтения\записи.
2 такт - активация строки банка по выбранному адресу
3 такт - ожидание один такт
4 такт - команда чтения\записи по выбранному адресу
5 такт - ожидание один такт
6 такт - команда закрытия банка (precharge) 1041664
7 такт - ожидания один такт.
На восьмом такте я могу снова произвести чтение\запись в любую ячейку.

Такой режим меня не устраивает т.к. читать данные я могу со скоростью примерно 50/7 Мгц, что очень медленно. Хотя фактически я могу так читать данные, но изображение на матрице будет сильно мерцать.
Так-же есть маленькая проблема: в качестве синхросигнала для матрицы я хотел бы применять внутренний сигнал ready_valid, формируемый контроллером, когда данные прочитаны с памяти. Но для полноценной работы матрицы мне необходима частота в 7 раз больше частоты данных для работы серилайзеров, чтобы выдавать данные в LVDS. Как её получить я не знаю. Встроенных умножителей на ПЛИС EP3C10E144C8 нет. Как будет работать матрица если в качестве опорной частоты PLL задать частоту 50Мгц/7 я не представляю. Если подумаю немного может, что и смогу придумать. Но этот вариант применять не хочется, поскольку он заведомо неправильный.

Более интересен режим последовательного считывания всей строки. Ширина матрицы 800 пикселей(или 800 слов, где каждое слово - это отдельный пиксель), каждый из которых должен читаться со скоростью 34 МГц, а ширина банка 256 слов, каждое из которых может читаться со скоростью почти 50 Мгц ( почти потому, что часть времени уйдет на активацию банка, ожидания, и деактивацию банка) то, полноценно вывести данные на матрицу я опять же не смогу, из-за того что если я и запущу память и матрицу на одной частоте, то в этом случае будут паузы между переключением строк.
Так как данные я могу читать быстрее матрицы, есть мысль сначала данные из памяти читать в асинхронный FIFO буфер а уже из буфера выводить на матрицу.

Есть ещё мысль запустить память на частоте матрицы и применять BURST режим чтения всей страницы с командой BURST TERMINATE. Команды подавать во время "обртного хода луча", т.е когда данные на матрицу не выводятся. Но тут немного не хватает знаний в области работы памяти: не нашел информации про режим полностраничного чтения. Есть ли паузы между переходом строк ? Есть подозрение что пауз нет, т.к. встроенный в память контроллер сам все делает.

UPD
Забыл уточнить, что в памяти будет записано изображение, которое соответствует разрешению матрицы. Задача вывести изображение на матрицу.

Хотелось бы услышать мнение специалистов.
Flip-fl0p
Поскольку задача вывода изображения на матрицу решена, и простенький контроллер работает, хотелось бы расширить функционал контроллера. Поскольку я планирую память использовать в качестве видеобуфера.
Прошу помощи в поиске литературы по работе с SDRAM памятью. Например какой-либо толковой информации по SDRAM Bank Interleave я не нашел. Про теневую регенерацию так-же почти нет информации. Да и тема правильной организации обращений к памяти для максимизации её пропускной способности очень актуальна (во всяком случае для меня). Прошу не закидывать тапками, а подсказать литературу.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.