Фоторамка. Часть3. Фреймбуффер.

E-mail Печать PDF

Фоторамка с платой Марсоход

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

Пришлось думать дальше..

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

DIMM

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

Вид снизу:

модуль памяти к плате Марсоход

Вид сверху:

модуль памяти к плате Марсоход

Конкретно на этот чип мне даташит найти не удалось, но в интернете есть много даташитов на подобные чипы от других производителей. Я пользовался вот этим 42s16800.pdf  от "ISSI" (icon 42S16800B Synchronous DRAM (857.27 Кбайт)). Мне он показался наиболее полным.

К сожалению интерфейс у 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-порт. Что собственно и было реализовано в нашем проекте (icon Фоторамка, проект с фреймбуффером (371.67 Кбайт)).

В каждом, посылаемом в последовательный порт байте,  младшие шесть бит - это два рядом стояших пикселя. Седьмой
бит не используется. Восьмой сбрасывает счетчик принятых байт, его нужно установить один раз только в салом начале. 

Необходимый для записи в порт файл можно сделать с помощью простенькой программки code (она так же есть в архиве с проектом). Она преобразует 24-битный битмап с разрешением 1280х800 в файл описанного формата.

Сначала мы пробовали подключать к стандартному COM-порту на компьютере. Даже на скорости 115200 получалось не очень быстро, весь экран заполняется секунд за 40.

Гораздо "живее" все работает через наш замечательный программатор mbftdi. Используемый в нем чип - двухканальный. Один канал уже занят под JTAG , а второй просто выведен на "гребенку", и его можно использовать для связи с нашей платкой Марсоход.

Под COM-порт в нашем проекте используется пин DN, а на программаторе Tx второго канала (на фотографии я его подписал).

 Фоторамка, проект с фреймбуффером

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

В дальнейшем, думаю, можно попробовать подключить нашу фоторамку, через какой-нибудь другой интерфейс, например через Ethernet.

 

 

Комментарии 

 
0 #15 Ю р и й 22.03.2012 10:32
Цитирую SAMY:
Спасибо! Кажись скомпилилось. Ещё маленький вопросик а получается в графическом педакторе если разводки не нарисовано а просто линии названы одинаково то получается они как бы соединены?
Спасибо.

Если линии названы одинаково, то они соединены, и
если линия и пин с одинаковыми именами, то они тоже соединены.
Цитировать
 
 
0 #14 SAMY 22.03.2012 10:05
Спасибо! Кажись скомпилилось. Ещё маленький вопросик а получается в графическом педакторе если разводки не нарисовано а просто линии названы одинаково то получается они как бы соединены?
Спасибо.
Цитировать
 
 
0 #13 Ю р и й 22.03.2012 05:47
Цитирую SAMY:
Здравствуйте Юрий. Очень заинтересовал ваш проект. Скачал, в квартусе 11 веб эдишин не компилится. Можете посмотреть что там да как? Откуда берёте клок 100 МГц?

Спасибо.

Удалите примитив "OUTPUT" с именем "f3[7..5]", и
вместо него поставьте "BIDIR" c именем "f3[7..5]".
А генератор на 100 МГц стоит на платке "марсохода" последней версии (v1.3).
Цитировать
 
 
0 #12 SAMY 21.03.2012 16:32
Здравствуйте Юрий. Очень заинтересовал ваш проект. Скачал, в квартусе 11 веб эдишин не компилится. Можете посмотреть что там да как? Откуда берёте клок 100 МГц?

Спасибо.
Цитировать
 
 
0 #11 pixar 07.03.2012 23:47
Цитирую Ю р и й:
[quote name="pixar"]Про "30fps с переключением двух видео входов " - не понял.
Задача - модуль должен коммутировать два видeoканала HD 1920x1080 30fps на один выход. Источники видео - не синхронные , один из каналов должен идти в буфер, чтобы выровнять их по кадровой синxронизции. Буфер н а один кадр = 1920х1080х24бит = 49.8 Мбит, поток 49.8Мbх30fps = 1_492_992_000 bps.
Вопрос - на какой недорогой FPGA я могу сделать этот модуль с минимальными затратaми времени и нервов.
Пример - в Spartan6 есть железный контроллер DRAM , аналогичное IP ядро дял Сyclone использовать не так просто.
Рассматриваются FPGA Altera , Actel, Lattice, Xilinx.
Если есть опыт реализации чего-то подобного - посоветуйте пожалуйста.
Цитировать
 
 
0 #10 Ю р и й 07.03.2012 10:36
Цитирую pixar:
Можно ли реализовать HD frame buffer 1920x1080 30fps с переключением двух видео входов на Cyclone_2-3-4 ? На что лучше смотреть - Cyclone или Spartan_6 в плане максимально просто реализовать ?

На любой FPGA подобные проэкты реализуются гораздо проще чем на CPLD,
поскольку есть внутренняя память и гораздо больше LE. Нужно только подобрать
девбоард с достаточным количеством внешнего ОЗУ.
Про "30fps с переключением двух видео входов " - не понял.
Цитировать
 
 
0 #9 pixar 07.03.2012 09:57
Можно ли реализовать HD frame buffer 1920x1080 30fps с переключением двух видео входов на Cyclone_2-3-4 ? На что лучше смотреть - Cyclone или Spartan_6 в плане максимально просто реализовать ?
Цитировать
 
 
0 #8 Ю р и й 08.11.2011 05:25
Поскольку ОЗУ используется только в качестве фреймбуфера и регулярно перечитывается,
то в регенерации необходимости нет.
Цитировать
 
 
0 #7 Петрович 07.11.2011 20:14
Цитирую Ю р и й:
Цитирую A.P.:
Я чего-то недопонимаю. Как вы пишите и читаете во фреймбуфер одновременно?? Я так решил, потому что одна картинка плавно замещается второй. Или вы пишете только во время обратного хода луча. Поясните пожалуйста.

Обмен с ОЗУ происходит циклами по 32CLK.Частота CLK 100мгц.
За каждый чикл считывается 16 слов (3х-битных) и можно записать одно.
Таким образом скорость чтения данных - 50М слов а скорость записи около 3М.


Так, а можно вообще поподробнее ?
Рефрешите память ?
Кстати, вопрос... Как я понял, если я писал или читал область памяти не реже периода обновления, то её рефрешить не надо ?
Цитировать
 
 
0 #6 Ю р и й 07.11.2011 09:43
Цитирую A.P.:
Я чего-то недопонимаю. Как вы пишите и читаете во фреймбуфер одновременно?? Я так решил, потому что одна картинка плавно замещается второй. Или вы пишете только во время обратного хода луча. Поясните пожалуйста.

Обмен с ОЗУ происходит циклами по 32CLK.Частота CLK 100мгц.
За каждый чикл считывается 16 слов (3х-битных) и можно записать одно.
Таким образом скорость чтения данных - 50М слов а скорость записи около 3М.
Цитировать
 

GitHub YouTube Twitter

Подписка RSS

marsohod.org - лента

Последние комментарии: