|
SDR SDRAM память, Регенерация данных |
|
|
|
Sep 20 2016, 10:57
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Цитата(XVR @ Sep 20 2016, 13:43)  Тогда возьмите откуда нибудь (с opencore например) готовый контролер, и посмотрите, как он сделан. Потом можете написать свой (если процесс важнее результата  ) Собственно я сейчас этим и занимаюсь. Контроллер нашел. Разобрал его по полочкам. И сейчас пытаюсь написать модуль, который при помощи данного контроллера загружает\читает данные с памяти. Алгоритм работы моего модуля такой (реализую на автомате Мили): 1. Ждем пока проинициализируется память и загрузятся настройки в регистр. 2. Затем по адресу "000000000000" в банк "00" пишем значение x"FF". 3. Затем по нажатию кнопки на макетной плате мой модуль должен загрузить записанное значение в регистр, и хранить его там, пока я не нажму кнопку сброса этого регистра. 4. Если в регистре храниться значение FF, то я зажигаю светодиод на макетной плате.
|
|
|
|
|
Sep 29 2016, 11:06
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
Моделирование памяти работает, но меня очень смущает тот факт, что модель памяти отрабатывает не так как должна: у памяти выставлен параметр CL= 2. Соответственно между командой чтения и появлением данных должно пройти как минимум 2 такта, вот картинка производителя памяти, всё просто и понятно:  Но вот моделирование показывает, что данные появляются сразу на следующем такте, что расходиться с картинкой производителя:  Посмотрел я немного код модели памяти, не нашел ничего, что говорит о том, что данные должны выдаваться через 2 такта. Но сильно не пинайте, Verilog я знаю плохо, мог и не увидеть..... Вот я и думаю: то ли я лыжник плохой, то ли лыжи не едут. Вот код модели любезно скачанный на сайте производителя памяти: UPDДанные должны быть на 1/4 периода дальше, чем я накорябал.
Сообщение отредактировал Flip-fl0p - Sep 29 2016, 11:31
Прикрепленные файлы
sdr.v ( 48.78 килобайт )
Кол-во скачиваний: 26
|
|
|
|
|
Oct 4 2016, 07:52
|

В поисках себя...
   
Группа: Свой
Сообщений: 729
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140

|
С проблемой моделирования разобрался. Судя по работе железа ошибка действительно в модели памяти.
Хотелось бы услышать совет по организации чтения и записи в память, с последующим выводом этих данных на 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 - Oct 4 2016, 09:09
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|