Простая самодельная VGA видеокарта

Насколько мне известно, довольно многим интересно подключить микроконтроллер к обычному монитору и попробовать что-либо вывести на экран. В этой статье пойдёт речь о создании простейшей VGA-видеокарты на базе микроконтроллера atmega168–20.
Вообще говоря, этому проекту сто лет в обед. Но когда-то я обещал рассказать про эту видеокарту и здесь, но всё было лень. Теперь пришло время исполнить обещанное.
Данная видеокарта выдаёт картинку разрешением 254×240 точек при 256 цветах. Работает вся эта штука в стандартном VGA режиме 640×480 при 60 Гц развёртки. Испытывал я эту видеокарту с 6 мониторами (1 ЭЛТ и 5 ЖК), при этом на всех мониторах карта работала, за исключением монитора фирмы Acer. Чем ему не понравился сигнал, я так и не понял.

В макетном исполнении видеокарта выглядит вот так:
flwa9fxyeihxhnrnhi0idbgdfbu.jpeg

Видеокарта состоит из двух модулей: модуля памяти и модуля ЦАП'а.
Модуль памяти просто формирует сигналы синхронизации (HS, VS) и гашения луча (BL) и выдаёт наружу код цвета (D0…D7), который модуль ЦАП'а преобразует в уровень 0–0.7 В и подаёт на монитор. Микроконтроллер модуля памяти просто перебирает адреса статического ОЗУ, а данные из ОЗУ и есть цвета точек. С использованием микроконтроллера Atmega168 с частотой 20 МГц требуется 2 такта на одну точку, поэтому эта часть программы написана на ассемблере и развёрнута в повторяющийся фрагмент для каждой точки строки. Я позволю себе не описывать развёртку VGA-сигнала во времени, тем более, что в интернете полно информации на этот счёт (хоть и часто не совпадающей друг с другом), а я за давностью лет уже порядком подзабыл, какую временную диаграмму я реализовал в этой видеокарте.

dvtu5stjwwwm5wooomtknzce4c4.gif
Схема модуля памяти (открыв в новом окне можно увеличить).

Модуль ЦАП'а состоит из трёх обычных R-2R ЦАП'ов с ключами и выходным эмиттерным повторителем (из-за которого несколько «зарезается» диапазон цветов). Если кто придумает, как дёшево и сердито исправить это «зарезание» — милости прошу в комментарии. На радиокоте мне посоветовали заменить эмиттерный повторитель на истоковый, но я этот совет так и не проверил. Как видно их схемы, я отвёл 3 бита на красный, 3 бита на зелёный и 2 бита на синий цвет. Транзисторы я взял КТ-315. :)

9xnfxdqsavvxbo_rtdxpfhhotb0.gif
Схема ЦАП'а.

Что именно будет отображать видеокарта определяет управляющий контроллер. Его задача — выставлять адрес на шину адреса (A0…A15), выставлять данные на шину данных (D0…D7), выставлять сигналы WR (запись по низкому уровню), OE (разрешение вывода данных при низком уровне) и выставлять сигнал A/B (переключение памяти на работу с управляющим контроллером по низкому уровню). Управляющий контроллер получает от платы памяти сигнал гашения луча (BL), который может быть использован для синхронизации записи в память видеокарты.

Работает такая видеокарта вот так:

Печатные платы и прошивки с их исходниками.

Удачи в развитии проекта!

© Habrahabr.ru