Как стать автором
Обновить

Создание видеоадаптера своими мозгами

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров4.4K

Меня всегда интересовало, как же реализуются видеоадаптеры и искал примеры как их можно реализовать. Я много занимаюсь разной разработкой, в основном программированием, но периодически вспоминаю радиотехнику/схемотехнику. И, исходя из опыта программирования и не только я вспомнил об одной достаточно важной вещи: если хочешь что‑то реализовать, начни с самого простого и потом дорабатывай полученный результат. Таким образом можно будет понять, что же мы всё‑таки хотим сделать и правильным ли путём идём?

Тот вариант, что я рассмотрю, придуман не мной. И, это один из вариантов реализации простейшего видеоадаптера, коих было достаточно не мало, если вы вспомните разнообразные компьютера, приставки, консоли и прочее.

Для понимания. Создание видеокарты/видеоадаптера не просто и не сложно. Надо понять что вы хотите, что будет делать ваша видеокарта.

Маленькое отступление

Можно было бы сказать что мы будем ориентироваться на сопряжение с VGA (с одной стороны это так и есть), но на самом деле в схеме, что будет рассматриваться это будет всё условно. Для данной схемы, можно не основываться на какой-то конкретный порт вывода. В схеме используется "монитор" - "RGB видео", который не подходит под какой-то определённый порт и, если делать реальную схему, то схему надо будет дорабатывать под все выходные сигналы, собираемой схемы. Надо будет доделывать под тот поддерживаемый порт, который вы заходите использовать.

Если это будет VGA, то надо будет переводить цифровой сигнал в аналоговый и производить синхронизацию с монитором.

Начнём

В данном случае наша видеокарта будет выводить изображение независимо от работы процессора. Ни каких ускорителей содержать не будет, делать какие‑либо вычисления данный видеоадаптер так же не будет. Видеоадаптер будет содержать два банка памяти, которые он будет переключать в зависимости от приходящих сигналов: от CPU об окончании прорисовки и VSync от монитора.

Начал я вот с этого (попытка много объяснить, но видимо зазря):

Дублирующая ссылка

Используя те ресурсы что есть сейчас в наших руках, нам не обязательно всё моделировать и тестировать на реальных устройствах. Но, в конечном итоге, это желательно будет произвести схему платы и проверить. То что работает в эмулируемых устройствах, может не работать в реальности, по разнообразным причинам, например потери реальных элементов, шумы, не совпадение сигналов и многое прочее. Такие вещи легко обнаруживаются в реальных устройствах и могут не быть выявлены в виртуальных/разрабатываемых.

Для создания схемы простейшего видеоадаптера я использую Logisim-evolution v 3.8.0. Вы можете использовать любые подходящие для вас средства.

Я потратил достаточно не мало времени на создание идеальных условий для разработки адаптера. Создал блок синхронизации, для эмуляции приходящих сигналов от монитора. Так же пришлось повозится с исходящими сигналами, где координаты и цвет зачастую не совпадали и происходило смещение при выводе на монитор. По окончанию прорисовки в первоначальное значение банка памяти могло записаться последнее значение цвета приходящее от CPU, в одном случае не критично, а в другом, если это не пофиксить, то в дальнейшем может вызвать проблемы при переключении банков памяти, когда в них ни чего не меняли (да, такое тоже может быть). В общем проблем много, а избавится от них достаточно не просто. Если не учесть этих моментов, то потом, на реальном разрабатываемом устройстве будет больше не выявленных проблем.

Схема своего генератора импульсов (обычный счётчик, но под свои задачи), который позже был доработан.

Для реализации схемы видеоадаптера необходимо (условно):

  1. Создать управляющую схему видеоадаптера;

  2. Создать виртуальную схему для согласующих сигналов монитора или схему распределения RGB на составляющие и передачу их через ЦАП на монитор (делать не будем, у нас готовое устройство вывода, с которым и будем работать);

  3. Создать схему вывода данных на монитор (управляемая схема).

Для пункта «2» вы можете или использовать разработанную мной схему, или собрать схему самим, или ни чего не использовать, а просто поставить два счётчика и синхронизации с ТГ (тактовый генератор) выводить информацию согласно данных на счётчиках (не забудьте, второй счётчик должен переключаться когда закончит работу первый).

Давайте займёмся реализацией полной схемы.

Наш видеоадаптер принимает внешние сигналы: сигнал CPU об окончания прорисовки изображения, сигналы синхронизации от монитора (или какого‑то другого выводящего информацию устройства, в дальнейшем будем называть «монитор») VSync и HSync. Все сигналы, в данном случае условны, я буду использовать созданную ранее схему блока синхронизации, это даст нам иллюзию работы монитора.

Прикладываю схему (рис. 1), будем отталкиваться от неё.

На рабочее пространство Logisim выставим элемент «RGB видео», на рис. 1 отображает букву «Т». Для более простого отображения цвета будем использовать 8 бит, это цветовая модель XTerm256. Ширину и высоту выставим на значения 8. Масштаб так же 8, дабы лучше видеть что происходит на нашем маленьком экранчике.

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

Повторюсь. Используя Logisim у нас нет возможности регулировать

рис. 1
рис. 1

Здесь я не буду ни описывать, ни делать схему для вывода изображения на VGA. Будем надеяться, что многие, кто читает данную статью, знают как реализовывать такие схемы, или хотя бы понимают. Если вы всё же не знаете, то небольшая подсказка. Надо брать на каждый пиксель значение 8-ми битного цвета. Разделять (не делить!) это значение на R, G и B составляющие. Узнавать максимальную амплитуду сигнала любого цвета, делить на максимальное значение каждой из составляющих (R, G или B) и умножать на полученное текущее значение R, G или B. Через ЦАП каждый сигнал передать по своей линии.

Для людей которые решили в реальности провести испытания схемы (и не только!):

Все совершаемые вами действия, вы делаете на свой страх и риск. Я ни как не отвечаю за порчу вашего имущества, в следствии совершаемых вами действий!

Я надеюсь люди, которые решили произвести «полевые испытания», понимают что делают, и читают спецификацию и документацию аппаратуры, для того чтоб производить подобные действия!


Конечная реализация видеоадаптера (на данный момент), возможно по видео будет легче ориентироваться:

Дальше надо добавить в нашу схему два банка памяти: выставьте разрядность адреса = 3, разрядность данных = 8; в итоге получим блок 64*8 байт.

Блок управления видеоадаптером

Это достаточно важная часть общей схемы, хотя она не так велика. В первую очередь нужно определиться с приходящими сигналами. Самое простое это получать сигналы от ЦП об окончании прорисовки кадра - EndDraw, промежуточные сигналы от ЦП: координаты - XIn, YIn и цвет - InColor. И сигнал синхронизации от монитора VSync (если используется разработанная мной схема, то это OutVSync).

Блок синхронизации (если вы не используете его, пропустите эту информацию).

Вы можете не использовать блок синхронизации, для проверки работы данной схемы можно просто выставить два счётчика и снимать с них данные. Один счётчик будет показывать изменения по X, второй по Y. Не забудьте согласовать их между собой.

Я не буду расписывать принципы работы блока синхронизации. Для понимания, мне пришлось создать свой собственный счётчик, который работает только на увеличение, и добавить в него схему сравнения, для того чтоб можно было регулировать количество тактов работы счётчика (мне не понравилось количество входов на схеме предлагаемой Logisim).

Сам блок синхронизации состоит из нескольких созданных мной счётчиков и элементов согласования приходящих сигналов от ТГ.

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

Саму схему можете просто взять и использовать по необходимости.

Для данной схемы выставьте все значения как я поставил: 12, 120, 2, 1, 8, 8 (смотрите либо рисунок, либо видео, и выставьте для данного монитора такие же параметры). Последние два значения это разрешение монитора. 12 — это горизонтальная синхронизация, 2 — это задержка для горизонтальной синхронизации. 120 — вертикальная синхронизация, 1 — задержка для вертикальной синхронизации.

Вы можете менять значения по своему усмотрению, но желательно вычислить время обратного хода луча (в данном примере для VGA):

VSync = HSync * (кол‑во строк + задержка вертикальной синхронизации * 2).

Задержки вертикальной синхронизации должна быть сверху и снизу, поэтому и производится умножение на 2.

На основной схеме я расписал сигналы. Если приравнивать их к реальным условиям, то мы должны получить все параметры от монитора: все разрешения, частоты для этих разрешений, возможно ещё какие‑то дополнительные параметры. И, на основе этих параметров задать все согласующие сигналы: задержки, смену координат (для нашей схемы) и выводить заданный цвет в определённое время.

Я правильно понял? На монитор, как я понял, не выводятся координаты, там задаётся цвет со сменой в определённый таймер?! Если это не так, поправьте меня и я подредактирую схему.

Тут всё же стоит упомянуть, что если вы будете использовать VGA порт, то вам не нужно будет передавать координаты для записи данных на монитор, достаточно будет послать цвет в определённый промежуток времени. Если будете использовать какие-то другие порты (хотя к VGA это так же относится), то в любом случае надо делать свою схему согласования с монитором.

По сути наша схема видеоадаптера готова к работе. Но некоторым моментам стоит всё‑таки уделить внимание. В схему я добавил два регистра, хотя их там не должно быть, но схему задержки сигнала я не нашёл, а методом проб и ошибок узнал что регистр порождает задержку и потому добавил в схему эти два регистра. Нужно это только для того устройства, на которое мы сейчас выводим изображение «RGB видео». И при всё при этом, ту же процедуру нам не надо делать с цветом, блок ОЗУ выводит как раз данные с задержкой (но честно говоря, если бы этой задержки не было, то и добавлять регистры бы не пришлось).

Здесь показана конечная схема, постарался разобрать всё что возможно, но наверняка что‑то упустил.

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

Дальнейшее развитие видеоадаптера.

После всех этих действий, можно приступать к простейшим ускорениям, таким как:

  • символьный вывод

  • вывод примитивов

  • вывод спрайтов

  • реализовать 3D визуализацию (но это если вы сами захотите, я же пока остановлюсь на 2D графике)

В общем, если сравнивать на первоначальном этапе, то на процессор это ни как не похоже. Процессор и видеоадаптер достаточно разные вещи, в которые заложены разные задачи.

Плюсы данной схемы:

По сути он один, это независимый от ЦП вывод графики.

Минусы?

Мне просто хотелось бы знать, что можно требовать от простейшей видеокарты, которая должна только изображение выводить? )))

Надеюсь информация была полезна, я буду готовить «новый видеоадаптер» и позже поделюсь как всё прошло.

И конечно же я забыл выложить саму схему... исправляюсь — sourceforge.net/projects/logisim‑videoadapter

Если есть корректировки, правки, пожелания — то всё готов принять. Я делал схему «наобум», потому что некоторых моментов либо не знаю, либо не нашёл решений. )))

Всем успехов!

Теги:
Хабы:
Всего голосов 13: ↑10 и ↓3+13
Комментарии20

Публикации