Обзор PPU
PPU (Picture Processing Unit) - специальная микросхема для генерации видеосигнала.
Примерная картинка, которую может выдать PPU:
Существует 3 основные версии PPU:
- 2C02: применялась в Famicom и американской версии NES. Генерирует NTSC сигнал.
- 2C07: PAL-версия PPU для европейских NES
- 2C03, 2C04, 2C05: RGB-версии для аркадных автоматов на базе NES (PlayChoise-10, Vs. System)
Возможно существуют:
- 2C06: такую никто не видел.
- Также возможно существует и отладочная версия 2C01
На этом сайте мы изучаем версию 2C02, так как это единственная версия PPU, на которую есть микрофотографии. Всё дальнейшее описание будет идти в контексте 2C02.
Архитектура
Основные компоненты PPU:
- VIDEO OUT: содержит схему формирования NTSC-сигнала и ЦАП, для преобразования его в аналоговую форму. То есть по сути PPU является полу-аналоговой микросхемой, так как с контакта VOUT выходит уже готовый к употреблению аналоговый сигнал (композитное видео).
- Рядом со схемой VOUT находится блок управления, который на базе двух счетчиков H и V формирует пачку управляющих сигналов, для остальных компонентов.
- Палитра. Содержит 16 цветов бекграунда и 16 цветов спрайтов. По индексу в палитре в COLOR BUFFER загружается цвет пикселя, который будет выведен на экран.
- Мультиплексор (MUX). Выбирает что будет выводиться на экран: точка бекграунда или точка спрайта, на основе их приоритетов. Также есть возможность подмешать цвет с внешних контактов EXT.
- Регистры. Всего адресное пространство PPU позволяет адресовать 8 внутренних регистров. Разработчики очень хитро подошли к вопросу организации регистров и чтение/запись по одному адресу может делать 2 разных действия.
- Спрайтовая память (OAM). Содержит данные 64 спрайтов, а также дополнительное место для хранения выбранных 8 текущих спрайтов.
- Спрайтовая логика. На базе H-счетчика выбирает 8 текущих спрайтов, которые в процессе сравнения помещаются в дополнительную память OAM.
- Спрайтовая FIFO (OAM FIFO). Содержит схему, которая активирует вывод 8 выбранных спрайтов в нужный момент, а также схему контроля их приоритета.
- Схема управления адресной шиной. Управляет адресацией VRAM.
- Схемы выборки данных (data reader). Схема для выборки исходных данных из VRAM: тайлов и атрибутов.
Видеосигнал NTSC
Форма видеосигнала выглядит следующим образом:
- На этой картинке представлена развертка одной строки
- Вначале находится импульс вертикальной синхронизации (HSYNC), чтобы луч был установлен в начало строки
- После импульса HSYNC находится "задняя часть" (Back porch), которая содержит специальную "вспышку": 8-10 импульсов поднесущей, для автоподстройки фазового детектора (ФАПЧ).
- Затем идёт непосредственно сигнал изображения
- Завершается сигнал строки "передней частью" (Front porch)
Теперь немного пояснений, что тут за херня.
Во-первых - стандарт NTSC был создан с учётом совместимости с черно-белым телевидением. В Ч-Б сигнале можно было задать только яркость сигнала, которая тупо изменялась в зависимости от амплитуды. Back porch и front porch - это чёрные рамки с левой и правой стороны экрана.
Чтобы добавить цветовую составляющую разработчики добавили фазовую модуляцию:
При этом средняя амплитуда оставалось яркостью, а сдвиг по фазе внутри фазового "пакета" представлял собой цветность. При этом черно-белые телевизоры не воспринимали фазовую составляющую и работали только по амплитуде.
Чтобы сказать декодеру где находится 0o была добавлена специальная "вспышка" (color burst). Сдвиг по фазе считается относительно колебаний этой вспышки.
В свою очередь цветовая составляющая состоит из двух компонентов: насыщенности (Saturation) и тона (Hue). Насыщенность определяется амплитудой фазовой составляющей, а тон - сдвигом по фазе.
Формирование кадра
Теперь поговорим о том, как формируется 1 кадр изображения.
Нужно брать в расчёт тот факт, что разложение видеосигнала в строку пикселей не обязывает телевизор иметь фиксированное количество пикселей. У телевизора вообще нет пикселей в обычном понимании. У него есть "зёрна". Сигнал может "размазаться" как на 100 зёрен в ширину, так и на 1000. Это особенность работы электронно-лучевой трубки.
Поверхность кинескопа старых цветных телевизоров выглядит следующим образом:
Насыщенность и тон закодированные в фазовой составляющей поднесущей задают яркость трёх электронных лучей: красного, синего и зеленого. Лучи падают на зерна, которые покрыты люминофором. У люминофора есть послесвечение: после прохождения луча по зерну оно продолжает светиться ещё некоторое время (обычно несколько миллисекунд). Поэтому на черном фоне могут появляться "хвосты" от перемещающихся объектов.
В отличии от ширины, количество строк 1 полного кадра чётко фиксирована стандартом NTSC и составляет 525 строк. Из этих 525 строк непосредственно под изображение выделяется примерно 480, а остальные используются для вертикальной синхронизации (обратного хода луча).
"Примерно 480", потому что разные модели телевизоров могут выводить на самом деле меньше, из-за устройства трубки и конструкции телевизора. При этом часть изображения может быть скрыта за границей экрана. Ну такая вот была раньше технология в каменном веке аналогового телевидения )))
Другие особенности
Кадр выводится двумя половинками, методом черезстрочной развертки. Вначале выводятся чётные строки 0, 2, 4 итд, а затем нечётные 1, 3, 5 итд. Но в общем не важно в какой последовательности начинать вывод, при формировании изображения это не имеет значения. После включения телевизора луч его начинает сканировать экран (все помнят "войну микробов"?) и формирование кадра может начаться в любом месте экрана, после того, как приёмник получит адекватный видеосигнал.
Строчная частота NTSC составляет 15734 Гц, а кадровая (точнее - полукадровая) - 59.94 Гц. Сделано это было для того, чтобы уменьшить помехи от биения поднесущей и звукового сигнала. Но помехи окончательно не исчезли и проявляются в виде "волн".