Меня всегда интересовало, как же реализуются видеоадаптеры и искал примеры как их можно реализовать. Я много занимаюсь разной разработкой, в основном программированием, но периодически вспоминаю радиотехнику/схемотехнику. И, исходя из опыта программирования и не только я вспомнил об одной достаточно важной вещи: если хочешь что‑то реализовать, начни с самого простого и потом дорабатывай полученный результат. Таким образом можно будет понять, что же мы всё‑таки хотим сделать и правильным ли путём идём?
Тот вариант, что я рассмотрю, придуман не мной. И, это один из вариантов реализации простейшего видеоадаптера, коих было достаточно не мало, если вы вспомните разнообразные компьютера, приставки, консоли и прочее.
Для понимания. Создание видеокарты/видеоадаптера не просто и не сложно. Надо понять что вы хотите, что будет делать ваша видеокарта.
Маленькое отступление
Можно было бы сказать что мы будем ориентироваться на сопряжение с VGA (с одной стороны это так и есть), но на самом деле в схеме, что будет рассматриваться это будет всё условно. Для данной схемы, можно не основываться на какой-то конкретный порт вывода. В схеме используется "монитор" - "RGB видео", который не подходит под какой-то определённый порт и, если делать реальную схему, то схему надо будет дорабатывать под все выходные сигналы, собираемой схемы. Надо будет доделывать под тот поддерживаемый порт, который вы заходите использовать.
Если это будет VGA, то надо будет переводить цифровой сигнал в аналоговый и производить синхронизацию с монитором.
Начнём
В данном случае наша видеокарта будет выводить изображение независимо от работы процессора. Ни каких ускорителей содержать не будет, делать какие‑либо вычисления данный видеоадаптер так же не будет. Видеоадаптер будет содержать два банка памяти, которые он будет переключать в зависимости от приходящих сигналов: от CPU об окончании прорисовки и VSync от монитора.
Начал я вот с этого (попытка много объяснить, но видимо зазря):
Дублирующая ссылка
Используя те ресурсы что есть сейчас в наших руках, нам не обязательно всё моделировать и тестировать на реальных устройствах. Но, в конечном итоге, это желательно будет произвести схему платы и проверить. То что работает в эмулируемых устройствах, может не работать в реальности, по разнообразным причинам, например потери реальных элементов, шумы, не совпадение сигналов и многое прочее. Такие вещи легко обнаруживаются в реальных устройствах и могут не быть выявлены в виртуальных/разрабатываемых.
Для создания схемы простейшего видеоадаптера я использую Logisim-evolution v 3.8.0. Вы можете использовать любые подходящие для вас средства.
Я потратил достаточно не мало времени на создание идеальных условий для разработки адаптера. Создал блок синхронизации, для эмуляции приходящих сигналов от монитора. Так же пришлось повозится с исходящими сигналами, где координаты и цвет зачастую не совпадали и происходило смещение при выводе на монитор. По окончанию прорисовки в первоначальное значение банка памяти могло записаться последнее значение цвета приходящее от CPU, в одном случае не критично, а в другом, если это не пофиксить, то в дальнейшем может вызвать проблемы при переключении банков памяти, когда в них ни чего не меняли (да, такое тоже может быть). В общем проблем много, а избавится от них достаточно не просто. Если не учесть этих моментов, то потом, на реальном разрабатываемом устройстве будет больше не выявленных проблем.
Схема своего генератора импульсов (обычный счётчик, но под свои задачи), который позже был доработан.
Для реализации схемы видеоадаптера необходимо (условно):
Создать управляющую схему видеоадаптера;
Создать виртуальную схему для согласующих сигналов монитора или схему распределения RGB на составляющие и передачу их через ЦАП на монитор (делать не будем, у нас готовое устройство вывода, с которым и будем работать);
Создать схему вывода данных на монитор (управляемая схема).
Для пункта «2» вы можете или использовать разработанную мной схему, или собрать схему самим, или ни чего не использовать, а просто поставить два счётчика и синхронизации с ТГ (тактовый генератор) выводить информацию согласно данных на счётчиках (не забудьте, второй счётчик должен переключаться когда закончит работу первый).
Давайте займёмся реализацией полной схемы.
Наш видеоадаптер принимает внешние сигналы: сигнал CPU об окончания прорисовки изображения, сигналы синхронизации от монитора (или какого‑то другого выводящего информацию устройства, в дальнейшем будем называть «монитор») VSync и HSync. Все сигналы, в данном случае условны, я буду использовать созданную ранее схему блока синхронизации, это даст нам иллюзию работы монитора.
Прикладываю схему (рис. 1), будем отталкиваться от неё.
На рабочее пространство Logisim выставим элемент «RGB видео», на рис. 1 отображает букву «Т». Для более простого отображения цвета будем использовать 8 бит, это цветовая модель XTerm256. Ширину и высоту выставим на значения 8. Масштаб так же 8, дабы лучше видеть что происходит на нашем маленьком экранчике.
Всё это делается для чистого теста работы нашей видеокарты, потому мы и берём небольшие значения.
Повторюсь. Используя Logisim у нас нет возможности регулировать
Здесь я не буду ни описывать, ни делать схему для вывода изображения на 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
Если есть корректировки, правки, пожелания — то всё готов принять. Я делал схему «наобум», потому что некоторых моментов либо не знаю, либо не нашёл решений. )))
Всем успехов!
Комментарии (20)
da-nie
15.05.2024 13:32Я правильно понял? На монитор, как я понял, не выводятся координаты, там
задаётся цвет со сменой в определённый таймер?! Если это не так,
поправьте меня и я подредактирую схему.Мммммм.... Это перевод или творчество нейросетей?
Вы можете менять значения по своему усмотрению, но желательно помнить, что VSinc = HSinc * (кол-во строк + задержка вертикальной синхронизации * 2). Задержка вертикальной синхронизации должна быть сверху и снизу.
Это про время обратного хода луча (где делается гашение) что ли так сказано? Хм.
Здесь показана конечная схема, постарался разобрать всё что возможно, но наверняка что-то упустил.
Уверен, что вы упустили прочесть описание видеосигнала, приходящего на монитор по VGA. :) Но ведь полно же руководств в инете, что там и зачем...
Seenkao Автор
15.05.2024 13:32Это про время обратного хода луча (где делается гашение) что ли так сказано? Хм.
Может лучше не выдёргивать фразы из контекста? Речь шла про эмуляцию сигналов, а не про реальные сигналы.
Но некоторые термины подправлю в статье.
Уверен, что вы упустили прочесть описание видеосигнала, приходящего на монитор по VGA. :)
уверен что не упустил прочитать описание видеосигнала. При том, что на канале есть ссылки дополнительные, где человек может подсмотреть (читают сейчас, увы, мало) необходимую информацию по VGA-сигналам.
Но опять же статью надо будет дополнить... )))
da-nie
15.05.2024 13:32+2Эти сигналы будут очень даже реальными, если вы всё-таки подключитесь к любому ЭЛТ-монитору. И их назначение вполне конкретное.
А ваше удивление "На монитор, как я понял, не выводятся координаты, там задаётся цвет со сменой в определённый таймер?!" вызывает не меньшее удивление у читателей. Как это можно не знать, что телевизор/монитор делает развёртку изображения!?
Seenkao Автор
15.05.2024 13:32А ваше удивление
Удивление?
Не стоит путать "удивление" и "недопонимание". Написан конкретный вопрос в том, что я могу недопонимать, а не в том, в чём я удивлён. В век цифровой аппаратуры, лично я бы передавал сигнал по широкой шине, где передавались бы и координаты и цвет для данной координаты. Это даст возможность вывода с большей частотой больше информации.
Если есть какая-то конкретная информация, то лучше было поделиться ей, чем разводить демагогию.
da-nie
15.05.2024 13:32+2У меня есть подозрение, что ЭЛТ монитор/телевизор вы не застали. Оттого и недопонимание. Потому что практически любой интересующийся электроникой школьник из 90-х никакого недопонимания от развёртки VGA-сигнала бы не испытал. Он абсолютно естественный. А кстати, вы по какому интерфейсу к монитору подключаетесь-то? А то судя по всему, это всё-таки VGA ("Здесь я не буду ни описывать, ни делать схему для вывода изображения на VGA."). И какая у вас частота строчных и кадровых СИ? А разрешение какое получилось с вашими делителями? И вообще странно от VGA (которому 30 лет в обед и который, кстати, аналоговый) ожидать передачи координат и цветов...
checkpoint
15.05.2024 13:32+1Уверен, что вы упустили прочесть описание видеосигнала, приходящего на
монитор по VGA. :) Но ведь полно же руководств в инете, что там и
зачем...Разработку, как и описание, своего видео адаптера Вам следовало бы начать именно с формулировки куда и как Вы собрались выводить видео сигнал, т.е. с описания VGA интерфейса. Я сначала подумал, что Вы собираетесь выводить на HDMI. Потом глянул на схему и подумал, что на выходе должен быть PAL сигнал. Но оказывается, что у Вас VGA.
checkpoint
15.05.2024 13:32+2Из прочтения статьи не понятно:
Какова частота следования пикселов (pixclk) ?
Каково разрешение видимой области экрана ?
Какой размер памяти видео фреймбуфера ? Вижу два блока по 64К, но как они распределены по фреймбуферу ?
Схема очень мелкая и запутанная, не вижу на ней шины данных.
Как Вы разграничиваете доступ к памяти между центральным процессором и энкодером адаптера ? Можно ли процессору выполнять циклы чтения из видео памяти?
Сколько бит отводится на кодирование цвета точки ?
PS: Сигналы горизонтальной и вертикальной синхронизации принято обозначать как HSync и VSync от английского слова "synchronize" - синхронизировать (сопоставлять во времени).
Seenkao Автор
15.05.2024 13:32Корректировал статью.
Какова частота следования пикселов (pixclk) ?
В статье было изначально написано, что мы не можем менять частоту ни как (точнее можно её делить), сколько бы мы не выставляли ТГ, они все будут работать на одной заданной частоте и синхронно. Потому всё будет происходить с одной заданной частотой (плюс свои созданные задержки).
Каково разрешение видимой области экрана ?
Какой размер памяти видео фреймбуфера ? Вижу два блока по 64К, но как они распределены по фреймбуферу ?
Так же было сказано при создании RGB видео, что размер экрана берётся для простоты 8 на 8.
Исходя из размеров экрана получаем блоки памяти 64 (не тысяч) на 8 байт.
не вижу на ней шины данных.
Да, с одной стороны это моя проблема. Я ни когда не видел шину данных, так как её отображают. Для меня это просто согласующие "провода". Хотя, наверно, я должен был убрать из блока управления мультиплексоры и демультиплексоры и присвоить их шине данных.
Как Вы разграничиваете доступ к памяти между центральным процессором и энкодером адаптера?
Всё делает блок управления, согласовывая приходящие сигналы: от ЦП - EndDraw и приходящих сигналов (якобы приходящих - это эмуляция) VSinc и HSinc. В статье об этом пишется.
Можно ли процессору выполнять циклы чтения из видео памяти?
В данном случае в этом нет необходимости. Но реализуется достаточно просто, надо лишь согласовать из какого банка памяти надо производить чтение. Ну и задать управляющие сигналы.
Сколько бит отводится на кодирование цвета точки ?
8 бит. Так же написано в статье.
Благодарю за конструктив! Данная информация была полезна.
Seenkao Автор
15.05.2024 13:32и опять я неправильно сигналы назвал...
VSync и HSync... я всё пытаюсь "I" использовать...
Oangai
15.05.2024 13:32+2Вот еще пара ссылок касательно таймингов:
http://martin.hinner.info/vga/timing.html
da-nie
15.05.2024 13:32Задержка вертикальной синхронизации
Кстати! На время этой задержки должен выдаваться чёрный цвет. LCD это пофиг, но ЭЛТ монитор вас не поймёт, если вы выдадите что-то другое.
Oangai
15.05.2024 13:32ЭЛТ монитору на самом тоже деле должно быть без разницы, а в композитном сигнале для телевизора там может еще и телетекст передаваться
da-nie
15.05.2024 13:32Не встречал аналогвых ЭЛТ, которым бы это было пофигу. Возможно, это пофиг моделям с цифровой начинкой.
А в телевизорах телетекст передаётся уровнем ниже чёрного (чёрный уровень вовсе не 0 В в композитном сигнале).
Oangai
15.05.2024 13:32давно это было конечно, может запамятовал. А про телетекст как минимум wiki сейчас говорит: The amplitude for a "0" is black level ±2% and a "1" is 66±6% of the difference between black and peak white level
Oangai
15.05.2024 13:32хотя, я про PAL только знаю, может по SECAM он и правда по другому кодировался
da-nie
15.05.2024 13:32Это без разницы, PAL или SECAM или NTSC. Там основа чёрно-белый видеосигнал. У него уровень чёрного 0.3 В. Уровень белого 1 В. Так вот, ниже уровня чёрного идёт синхросигнал. Телетекст как раз и использует уровени ниже 0.3 В (т.е. до 0 В) для кодирования.
Seenkao Автор
15.05.2024 13:32Если это так, то это важно знать при создании блока согласования. Но не очень важно при проектировании самого видеоадаптера. Потому что не известно к какому именно устройству вывода будет подключен видеоадаптер и какие порты будет использовать для подключения.
Guestishe
15.05.2024 13:32Никаких примитивов и символов, пихай туда сразу нейронку которая на основании предыдущего кадра и запроса рисует следующий.
Oangai
может пригодится: была такая до гениального простая машинка, на неё можно посмотреть несколько вариантов схем и всякие любительские дополнения: http://www.jupiter-ace.co.uk/ace_hardware.html
Seenkao Автор
Полезная ссылка! Благодарю!