Всем привет! Рад, что понравился мой предыдущий пост про ZX Spectrum. Решил также сделать небольшую вырезку о том, как сделан компьютерный монитор (устройство для вывода плоского изображения). Также мы с вами попробуем построить некое его подобие из подручных средств.
Наш монитор, в общем то, состоит из: - Матрицы (непосредственно превращающей электрический сигнал в световой) - Схемы управления (содержит задающий генератор, устройство синхронизации, дешифратор, видеобуфер). Давайте начнём с матрицы. Возьмём для примера LED-матрицу 8 на 8 пикселей. Вот она:
При разрешении всего лишь 8 на 8, в данной матрице, не много ни мало, 64 светодиода - и 128 проводов! Их необходимо адресовать (соединить). Благо, разработчики всё продумали - вертикальные и горизонтальные ряды можно объединить в линейку, сократив общее количество проводов до 16 штук. При этом, мы не теряем возможность зажечь каждый светодиод по отдельности. Вот, как это выглядит:
А для создания платы управления монитора, возьмём ещё несколько деталей:
Верхняя плата - тактовый генератор (формирует стробирующий сигнал, иначе говоря, задаёт темп работы схемы). Для того, чтобы увидеть изображение, нам необходимо выполнить его развёртку. То есть, прочёсывание экрана из одной стороны в другую (либо слево направа, либо сверху вниз, это роли не играет). В этом нам поможет синхронизация монитора. Для синхронизации вводится микросхема "синхронный счётчик", выполненный на отечественной микросхеме К555ИЕ5. Каждый такт генератора он добавляет +1 к своему численному значению. Давайте настроим и проверим данный счетчик:
Как можно видеть, светодиод стробирующего сигнала (в правом верхнем углу) мигает, а в нашей схеме в такт ему происходит счет от 1 до 8, пока что в двоичной системе. В конце счет сбрасывается, и всё начинается по кругу. Таким образом реализуется "прочёс" экрана, за каждый такт - сдвиг на 1 линейку. Теперь, данный сигнал необходимо расшифровать. Нам поможет микросхема К555ИД7, дешифрующая сигнал из линий (синие светодиоды), в сигнал из 8 линий, который мы подключим к нашей матрице. Смотрим, как она работает:
Мы собрали типичную схему "бегущие огни". Здесь осуществляется "прочёс" светодиодов по кругу. Тот, который соответствует текущей цифре на счетчике, выключается. Теперь давайте попробуем подключить данную линию к нашей матрице, и посмотреть, что получится:
Мы сделали горизонтальную синхронизацию. К слову, в компьютерных мониторах и телевизорах синхронизация тоже очень важна - обычно, для неё выделяется отдельный провод. Так как тактовые генераторы в источнике видеосигнала и мониторе изначально не согласованы, данный сигнал (H-SYNC или CLK) и позволяет отследить, с какого момента и с какой скоростью начать прочёс, чтобы изображение не было сдвинуто или сжато/растянуто. Давайте я продемонстрирую вам, каким образом будет происходить пиксельная развёртка:
Как я ранее упоминал, мы можем зажигать отдельные пиксели по очереди. Для этого, нужно в такт генератору и горизонтальной развёртке включать/выключать соответствующие, теперь уже вертикальные сигналы колонок. Похожим образом работает, в том числе, кинескопный телевизор, да и любой другой. Осталось сформировать вертикальный сигнал. Давайте установим видеобуфер. Пока в качестве него вместо ОЗУ у меня будет ПЗУ (такая большая микросхема, т.к. других не было, но задействуем мы всего лишь первые 8 байт от неё). Эти 8 байт - наша экранная память (кадр), в которой хранится изображение. Это при том, что уровня яркости всего лишь два, и дисплей "монохромный" -не содержит цветов. Двоичный выход со счетчика дублируется, и подается на адресные входы ПЗУ. Давайте соберём, и посмотрим, как будет себя вести наше устройство:
Я ускоряю частоту тактового генератора, и таким образом, изображение становится "статичным" - оно по-прежнему построчно мерцает, но глазу и камере этого уже не заметно. В ПЗУ был записан какой-то мусор. Но картинка стабильна с течением времени, пиксели не мерцают, значит, схема собрана верно. Давайте попробуем нарисовать какой-нибудь кадр, и вывести его на монитор.
Данная картинка (bmp) 1-бит - конвертируется в набор HEX-значений. Вот он: 3C 42 91 85 85 91 42 3C Это и будет наш кадр. Теперь давайте пропишем его в наш импровизированный "видеобуфер". Для этого я воспользуюсь китайской платой Mega 2560 и самодельным переходником под память.
К слову, с программированием данного ПЗУ тоже не всё так просто. Сначала, нужно передать код разблокировки ПЗУ, а лишь затем, информацию. Это тема для отдельного поста. Вот, что по итогу получается:
Как можно видеть, наш код успешно внесён в ПЗУ. Давайте попробуем запустить:
В общем, таким образом формируется наш кадр. А для вывода информации с источника сигнала в реальном времени, видеобуфер следует несколько усложнить - применив, например, двойную буферизацию: в одну микросхему загружается информация из компьютера, тогда как из другой она отображается. Затем эти микросхемы быстро переключаются между собой. Таким образом, не возникает проблем ни с доступом к памяти, ни с мерцанием пикселей - картинка есть всегда. Всем спасибо за внимание, с вами был Kekovsky, 2023 г.