VGA видеоадаптер [Незавершенный эксперимент]

В статье [AVR, ARM, CPLD и VGA…] я нашел для себя оптимальное решение видеоадаптера для Arduino Due и других устройств с параллельным интерфейсом. Однако ничего не стоит на месте, поэтому я стал дальше развивать проект.


Устройство выполнено на ПЛИС серии MAX II — EPM570T144C4N, которая генерирует сигналы развертки, а также управляет видеопамятью и принимает входящие данные.

Характеристики видеоадаптера:

  • Формат изображения: 640×480, 60Гц.
  • Разрешение: 288×208 px.
  • Количество цветов: 1074 млн. :-)
    • Одновременно на экране: 256.
  • Интерфейс: параллельный.
  • Формат данных: bitmap 8Бит с палитрой.
  • Аппаратное ускорение вывода спрайтов.
  • Эффект scanline.

Заметьте, это весьма неплохое улучшение старого видеоадаптера. Кстати, этот «видеоадаптер» постепенно переходит к «видеопроцессору», ввиду появления аппаратного ускорителя. А вот двойной буферизации, к сожалению, по-прежнему нет.
Используемые компоненты:

  • EPM570 (TQFP144)
  • CY7C1018DV33 — память 128Kx8, 10ns
  • ADV7123 — Видео-ЦАП, 10бит на каждый цвет.
  • AD1580 — Шунт 1.2v для ЦАП
  • Генераторы: 25.175MHz, 100MHz
  • Резистровые сборки SMD 30Ом во избежание ВЧ гадостей на шинах.

Все пассивные компоненты выпаивались со старых плат CD-приводов, видеокарт и прочих.

Схема

Общей схемы я не рисовал, большинство подключений вы можете увидеть в assigment-editor-е. Все просто: CPLD + SRAM + DAC + два генератора.

Плата

Разводка производилась в редакторе Sprint-Layout. Самому изготовить плату мне не удалось, поэтому я привлек узкоглазых друзей к этому делу.

DSCN5716

DSCN5719

Плата предусматривалась как модуль, но для простых проектов можно переделать разводку, упростив конструкцию. Выведены шины адреса/данных (снизу), разъем JTAG и сам VGA вывод (провода сбоку). Некоторые выводы на гребенке не используются.

Генератор видеоизображения

Он состоит из двух XY счетчиков, пересчитывающих область экрана с половинной частотой от 25.175MHz. Когда пересчитываемая область принадлежит определенному промежутку, то генерируются импульсы синхронизации или сигналы начала и конца кадра.

screen3

Как вы могли заметить, горизонтальное разрешение в два раза меньше стандарта, но вертикальное остается прежним, поэтому его нужно будет поделить позже на этапе вывода. Модуль вывода состоит из двух счетчиков адресов видеопамяти и системы палитры.
Ashampoo_Snap_2014.10.13_20h19m08s_006_
Первый счетчик работает все нечетные строки, второй — только четные. Таким образом, вертикальное разрешение снижается. Также, когда считает второй счетчик, строка выводится с половинной яркостью для достижения эффекта scanline,  при этом, не теряя ни бита качества, тк. ЦАП — 10бит-ный. Система палитр работает не сложнее:

Ashampoo_Snap_2014.10.13_20h56m45s_007_

По тактовой частоте 100MHz (пошагово) происходит запрос индекса пикселя в видеопамяти, вычисляется смещение адресов, затем запрашиваются составляющие компоненты RGB палитры.

Забыл упомянуть: для получения разрешения 288×208 необходимо сделать рамку, тк. при преобразовании стандарта 640×480, ближайшее, которое мы можем получить — 320×240.

screen4

Этим ограничением займется модуль синхронизации. А вот такое разрешение я выбрал не случайно. Ввиду отсутствия двойной буферизации, доступ к видеопамяти будет ограничен по времени, и это время зависит от продолжительности VBLANK периода. Уменьшая разрешение, мы продлеваем этот период, тем самым выделяем больше времени на операции с экраном.

Интерфейс

Для передачи данных используется синхронный параллельный интерфейс с разделением на шины данных и адреса, подобный этому — /. 
Полностью совместим с EBI интерфейсом многих ARM микроконтроллеров.

Передача данных происходит только в одну сторону. Используются сигналы:

  • 8Бит шина данных.
  • 17Бит шина адреса.
  • Управляющие: WE, CS.
  • Тактовый сигнал.
  • Сигнал конца кадра.

Максимальная стабильная частота передачи 60MHz, при тактовой 120. Если у вас нет свободных портов для шины адреса, то можно использовать только часть: 4 младших бита и 1 старший при использовании аппаратного ускорителя.

По сигналу конца кадра, видеопроцессор открывает доступ к памяти подключенному к нему устройству, но лишь на ~3мс. В это время должны пройти все задуманные операции. Рассмотрим адресное пространство:

С 0x0000 до 0xED000 транслируется вся видеопамять, включая палитру. Это и есть основная область работы с видеоадаптером.

Формат изображения: Bitmap, разрешением 288×208 (1байт на пиксель) + цветовая палитра 1байт на канал, формата [r1 r2…r256]-[g1 g2…g256]-[b1 b2…b256]. Пример изображения -/. (загружаем его напрямую в область 0x000000xED000)

Аппаратный ускоритель

Ускоритель вывода графики упрощает вывод растровых изображений на экранный буфер, однако из-за отсутствия двойной буферизации его роль уходит на второй план. Но с помощью аппаратного ускорителя можно заметно сократить шину адреса.

Acc

Теперь вспомним как происходит вывод ограниченного изображения в определенную область видеопамяти с использованием процессора: возьмем изображение 32×16 и выведем на координаты 56;30.

1
2
3
4
5
6
unsigned int Addr = (56*288)+30; //Вычисляем смещение адресов в памяти на точку 56:30
for (uint16_t i=0;i<16;i++) {
memcpy(VRAM+Addr, bmp, 32); //Копируем строку
bmp+=32;
Addr+=288;
}

Заметьте, как много операций! Ускоритель же разгружает процессор от большинства вычислений, оставляя два конфигурирующих регистра:screen3

  • Размер строки — определяет ширину копируемого изображения.
  • Смещение — смещает все адреса для вывода изображения на определенные координаты: (y*288)+x

Сами данные мы отправляем потоком в регистр:

  • Данные — регистр, занимающий 4 байта в памяти. Пересылка возможна на любой из четырех, без задержки.

Таким образом наша программа копирования упрощается:

1
2
3
4
unsigned int Addr = (y*288)+x;
VRAM[65540] = Addr;
VRAM[65544] = 32;
moveline(VRAM+65536, bmp, 32*16);;

Но тут требуется модифицированная версия memcpy без инкремента конечного адреса, что, кстати, также повышает производительность. Либо используйте DMA.

Также ускоритель использует альфа-цвет с индексом 255, т.е эта точка не будет выводиться в видеопамять, что позволяет выводить изображения с прозрачностью.

Результаты

Ч/б изображение.

DSCN5730

Далее — цветные изображения, в экспериментальном режиме 320×240, который я решил убрать. Нужна чрезмерно высокая скорость загрузки изображения.

DSCN5741

DSCN5745

Работа ускорителя вывода графики. (Прошу извинить меня за помехи на изображении, я неправильно подвел сигнал тактовой частоты. :-) )

Файлы проекта:

PS: Это лишь незавершенный эксперимент, надеюсь, эти наработки помогут кому-нибудь.

0

About Кирилл Васин

Прохожий из шапки сайта

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *