
Выбор чипа для фреймбуфера фоторамки оказался не простым. Изначально был соблазн использовать статическое ОЗУ. Оно имеет очень простой интерфейс - данные, адреса, и, практически один управляющий сигнал - "разрешение записи" (WE).
Могут быть еще какие- нибудь управляющие сигналы, типа CS и/или OE, но при использовании всего одного чипа они не нужны. Но, после продолжительных поисков в компьютерном хламе и изучения множества даташитов, ничего подходящего найти не удалось - либо недостаточный объем, слабое быстродействие или +5В питание.
Пришлось думать дальше..
Из динамического ОЗУ первых поколений (асинхронного) тоже ничего не подошло.
В конце концов решено было использовать синхронное динамическое ОЗУ (SDR SDRAM).
Что оно из себя представляет, можно почитать, например, в Википедии. В настоящее время такое ОЗУ используется в различной компьютерной периферии или в сетевом оборудовании. Какое-то время назад оно использовалось в качестве "основного" на материнских платах. Для этого, из отдельных чипов, делают специальные модули - димы (DIMM).
Один такой модуль мы и собираемся использовать.

После припаивания проводов и "отсечения" лишнего получился такой шилд.
Вид снизу:

Вид сверху:

Конкретно на этот чип мне даташит найти не удалось, но в интернете есть много даташитов на подобные чипы от других производителей. Я пользовался вот этим 42s16800.pdf от "ISSI" (
). Мне он показался наиболее полным.К сожалению интерфейс у SDRAM довольно сложный. Напомню, что адресное пространство первого динамического ОЗУ, в отличие от статического, перестало быть "линейным". Оно было представлено в виде плоскости, состоящей из некоторого количества строк и столбцов. Поэтому адресная шина стала "мультиплексной", а к управляющим сигналам добавились сигналы фиксации строки и столбца (RAS, CAS).
C одной стороны, это уменьшило количество адресных линий, с другой - усложнило интерфейс. У синхронного динамического ОЗУ интерфейс еще сложнее. Появился тактовый сигнал (CLK), а основные управляющие сигналы RAS, CAS и WE потеряли свой изначальный смысл и являются тремя битами кода операции. Кроме того, появилась необходимость в процедуре инициализации, которая необходима для настройки режимов работы.
Для подключения к нашей платке Марсоход понадобилось 19 сигналов, четыре управляющих (RAS, CAS, WE и CLK), 12 адресов (A0-A11) и три бита данных. Цоколевку дима SDR SDRAM-168 легко найти в интернете, но для удобства пайки, я выкинул лишнее (практически все нужное, кроме клока, находится в седней части, между двумя ключами) и расположил контакты в два столбца.
1 85
. .
10 94
====================================
11 DQ8 95 DQ40
12 VSS 96 VSS
13 DQ9 97 DQ41
14 DQ10 98 DQ42
15 DQ11 99 DQ43
16 DQ12 100 DQ44
17 DQ13 101 DQ45
18 VDD 102 VDD
19 DQ14 103 DQ46
20 DQ15 104 DQ47
21 n/c 105 n/c
22 n/c 106 n/c
23 VSS 107 VSS
24 n/c 108 n/c
25 n/c 109 n/c
26 VDD 110 VDD
27 /WE 111 /CAS
28 DQMB0 112 DQMB4
29 DQMB1 113 DQMB5
30 /S0 114 /S1
31 DU 115 /RAS
32 VSS 116 VSS
33 A0 117 A1
34 A2 118 A3
35 A4 119 A5
36 A6 120 A7
37 A8 121 A9
38 A10/AP 122 BA0
39 BA1 123 A11
40 VDD 124 VDD
====================================
41 VDD 125 CK1
42 CK0 126 A12
43 VSS 127 VSS
44 DU 128 CKE0
. .
84 168
Кроме сигналов, подключенных к платке Марсоход, есть и другие важные сигналы, которые нельзя оставлять "в воздухе"
Кратко опишу их назначение ( и куда нужно подключить ):
- CS - чип селект, нужен когда чипов больше одного ( на "0")
- CKE - разрешение клока ( на "1")
- DQMx - имеют смысл в чипах с разрядностью более 8 бит, чтобы иметь доступ к каждому байту отдельно (все на "0")
- BA0, BA1 - номер банка (оба на "0")
- A12 - старший адрес (на "0")
Для заполнения фреймбуфера нужными данными, первое, что пришло в голову - подключить к компьютеру через COM-порт. Что собственно и было реализовано в нашем проекте (
).В каждом, посылаемом в последовательный порт байте, младшие шесть бит - это два рядом стояших пикселя. Седьмой
бит не используется. Восьмой сбрасывает счетчик принятых байт, его нужно установить один раз только в салом начале.
Необходимый для записи в порт файл можно сделать с помощью простенькой программки code (она так же есть в архиве с проектом). Она преобразует 24-битный битмап с разрешением 1280х800 в файл описанного формата.
Сначала мы пробовали подключать к стандартному COM-порту на компьютере. Даже на скорости 115200 получалось не очень быстро, весь экран заполняется секунд за 40.
Гораздо "живее" все работает через наш замечательный программатор mbftdi. Используемый в нем чип - двухканальный. Один канал уже занят под JTAG , а второй просто выведен на "гребенку", и его можно использовать для связи с нашей платкой Марсоход.
Под COM-порт в нашем проекте используется пин DN, а на программаторе Tx второго канала (на фотографии я его подписал).

Максимальная скорость, на которой может работать UART на FTDI 12мбит, но получить такую частоту из 100Мгц имеющихся на плате Марсоход в проекте нельзя. Ближайшее, что нам подошло - 5мбит.
В результате получилось вот так:
В дальнейшем, думаю, можно попробовать подключить нашу фоторамку, через какой-нибудь другой интерфейс, например через Ethernet.

Если сдрам можно тактировать на пониженной частоте, то ддр только на заданной (за редкими исключениями).
То есть по частоте в частности не проходим. Так что все на марсоход3!
Насколько я понял, это для тех модулей памяти, что в народе называли "PC-133".
А есть ли подобные проекты для подключения модулей "РС-400"?
Также очень интересно, можно ли пустить в дело планки от ноутбуков SO DIMM DDR-2 1GB?
Сравнил дату с описанием в статье - все сходиться. Только осталось 2 вопроса:
1: Для работы с ОЗУ обязательно использовать только резервированные для этого пины , или можно сконфигурироват ь любые доступные?
2: Как правильно развести плату под ОЗУ, чтобы избежать глюков. На многих компьютерных платах дорожки идут как бы зигзагами, на сколько я знаю это и есть защита сигнальных линий. Как правильно расщитать такие проводники?
Странно?! Сейчас проверил еще раз результат компиляции Ваш и мой на верилоге - результат один в один 29LE.
Правда я вчера переписывал его так сказать "на чистовую". Сделал его параметризируем ым на предмет тактовой частоты и бод-рэйта + проверил в железе на скоростях 9600 и 115200
Если кому нужно могу выложить код где нибудь.
Скорее всего получилось не "один-в-один".
Посмотрите на свой модуль RTL-VIWERом, я думаю, будет видна разница.
Взял у вас из проекта модуль UARТ приемника и переписал его на verilog'e (к сожалению нельзя приложить код к комментарию).
Пробовал сравнить затраты ресурсов для обоих вариантов: получилось 22LE у вас и 29LE у меня. Логика работы переписана со схемы 1-в-1.
С чем может быть связана такая разница в расходе ресурсов камня? Неужели использование мегафункций всегда эффективнее написания модуля на verilog'e?
У меня этой памяти просто дофига от ноутов....
Хотел использовать для видеоплаты.
И ещё вопрос, вот вы использовали самый младший макс2 + SDRAM , сколько свободных ячеек осталось там?? или можно туда дополнительно впихнуть 2 алу 24бит ??.
Тоесть сам проект вывода картинки+2алу.. .
1.Частота и длины проводов не очень большие, поэтому
все работает стабильно.
2.Ограничений на нижний предел тактовой частоты для SDR нет. Насколько я помню, такие ограничения есть для DDR и DDR2.
Если линии названы одинаково, то они соединены, и
если линия и пин с одинаковыми именами, то они тоже соединены.
Спасибо.
Удалите примитив "OUTPUT" с именем "f3[7..5]", и
вместо него поставьте "BIDIR" c именем "f3[7..5]".
А генератор на 100 МГц стоит на платке "марсохода" последней версии (v1.3).
Спасибо.
Вопрос - на какой недорогой FPGA я могу сделать этот модуль с минимальными затратaми времени и нервов.
Пример - в Spartan6 есть железный контроллер DRAM , аналогичное IP ядро дял Сyclone использовать не так просто.
Рассматриваются FPGA Altera , Actel, Lattice, Xilinx.
Если есть опыт реализации чего-то подобного - посоветуйте пожалуйста.
На любой FPGA подобные проэкты реализуются гораздо проще чем на CPLD,
поскольку есть внутренняя память и гораздо больше LE. Нужно только подобрать
девбоард с достаточным количеством внешнего ОЗУ.
Про "30fps с переключением двух видео входов " - не понял.
то в регенерации необходимости нет.
Так, а можно вообще поподробнее ?
Рефрешите память ?
Кстати, вопрос... Как я понял, если я писал или читал область памяти не реже периода обновления, то её рефрешить не надо ?
Обмен с ОЗУ происходит циклами по 32CLK.Частота CLK 100мгц.
За каждый чикл считывается 16 слов (3х-битных) и можно записать одно.
Таким образом скорость чтения данных - 50М слов а скорость записи около 3М.
1.Скорее привычка. Я этими квадратиками "думаю".
Но практически все проекты синхронные и довольно просто переводятся в верилог.
2.На диплей выводится только три бита, как в
предыдущем поекте.Но фотографии специальным образом подготовлены.За счет уменьшения разрешения (в два раза) получилось немного увеличить количество цветов.
Чем обусловлен выбор схемотехническо го проектирования?
И мне одному кажется,что на видео гораздо больше цветов чем 8 ?