Верилог

Цветной композитный сигнал PAL на Altera DE1

Vector06cc теперь умеет генерировать цветной композитный видеосигнал, что дает возможность подключать его к телевизорам, проекторам и прочим устройствам без VGA-входа, или подключать ко второму входу мониторов с функцией PIP. Сигнал формируется теми же VGA ЦАП-ами, что и обычный VGA-видеосигнал. Из-за того, что выходное сопротивление видеовыхода DE1 относительно высоко, три выхода R,G,B приходится объединять в один. В противном случае, нагруженный на 75 Ом видеосигнал заметно проседает и качество изображения становится неприемлемым. Больше никаких соединений делать не нужно, синхронизация уже подмешана в тот же сигнал.

Как кодируется цвет

Очень краткий экскурс в кодирование цветов в системе PAL: сначала цветовое пространство RGB отображается в пространство YUV. Это делается по формулам:

Y = 0.299R' + 0.587G' + 0.114B'
U = 0.492(B' − Y)
V = 0.877(R' − Y)

Затем составляющие U и V кодируются квадратурно-амплитудной модуляцией на цветовой поднесущей Fsc, частота которой равна 4433618.75 Гц. За 0° принимается фаза вектора U, вектор V поворачивается на ±90° каждую строку. Светимость Y прибавляется без изменений. Таким образом, результирующий сигнал PAL равен:

P = Y + Usin(ωt) ± Vcos(ωt)

В начале каждой строки передается colourburst, сигнал цветосинхронизации: не менее 10 периодов немодулированной поднесущей, повернутой на ±45° относительно 180°. Для фазы V=+90°, фаза colourburst равна 225°, для V=-90° фаза colourburst равна 135°. По этому сигналу телеприемник определяет наличие цветности и настраивает ФАПЧ декодера цветности.



В настоящем PAL число строк 625, а поля состоят из 312 и 313 строк. Таким образом, фаза V чередуется не только каждую строку, но и каждое поле. В Векторе все немного нестандартно: он генерирует "прогрессивную развертку", в которой в каждом поле 312 строк. Это надо учитывать при генерации сигнала.

Более полноценный экскурс в генерацию композитных видеосигналов и кодирование цвета можно прочитать в источниках, указанных в конце статьи.

Особенности реализации в ПЛИС

Целесообразно заранее развернуть все выражения для пересчета RGB в YUV. Сразу же можно ввести в выражения и значения синусов для всех доступных углов: фактически заранее целиком просчитаны выражения U*sin(ωt) ± V*cos(ωt) в зависимости от R,G,B. Они превращаются в сумму трех произведений вида R*c0 + G*c1 + B*c2. Такая сумма вынесена в отдельный модуль uwsum, причем коэффициенты с0, c1, c2 задаются параметрами инстанциации модуля, а текущие значения R,G,B являются его входными сигналами. В качестве опорной частоты взята 4×Fsc, что дает всего 4 отсчета на 2π. Таким образом, получается 4 инстанциации uwsum для V=90° и 4 для V=-90°, итого 8 умножителей-сумматоров.

Четыре отсчета на 2π не дают возможности передать поднесущую со сдвигом фазы на 45°. Зато можно повернуть все векторы сразу. Опорный сигнал самый важный, его передавать надо точно: на него будет опираться ФАПЧ декодера цветности. Поэтому поднесущая передается со сдвигом 0 и 90 градусов, а относительное смещение фаз для векторов U и V задано при расчете коэффициентов: -2π*5/8 и -2π*3/8 соответственно. Вместо синуса передаются прямоугольные импульсы: это нежелательно, но допустимо благодаря входным фильтрам композитного входа.

В зависимости от порядкового номера строки и номера поля выбираются результаты выражений uvsum0..uvsum3 для фазы V=+90°, или uwsum0..uwsum3 для -90°. Полученное значение tv_chroma складывается с яркостным сигналом tvY. Получившийся сигнал смешивается с синхроимпульсами и сигналами цветосинхронизации и получается полный CVBS видеосигнал, который и выдается на все три ЦАП-а платы DE1 одновременно.

Опорная частота Fsc = 17734475 Гц получается с помощью 32-битного фазового аккумулятора с опорной частотой 300 МГц. Формула расчета приращения фазового аккумулятора:
ΔФ = 4*Fsc/Fmclk*2width

При том, что на бумаге все выглядит просто, реализация вызвала у автора немало затруднений. Две наиболее существенные проблемы были таковы:
  1. Генерация опорной частоты 4*Fsc:
    В идеале Fsc находится в жесткой связке с частотой кадров и строк. На практике это трудно реализовать потому, что частота кадров в Векторе не соответствует телевещательному стандарту. Самое главное в опорной частоте это фазовая чистота. Фазовый аккумулятор должен работать постоянно и никаких поправок от строки к строке и кадра к кадру вносить в него не нужно (хотя некоторые источники могут навести на мысль о том, что это могло бы быть полезным). В действительности, если фаза Fsc начинает плыть, ФАПЧ телевизора теряет привязку к сигналу и сигнал считается черно-белым.
  2. Переполнение и ограничение значений:
    В распоряжении имеется всего 4 бита, то есть 16 уровней. Трудно удержаться в таких узких рамках и возникает соблазн ограничить сигнал сверху в случае переполнения. В случае квадратурной модуляции переполнения и ограничения воспринимаются декодером цветности как фазовые отклонения и в результате цвет оказывается далек от ожидаемого. Надо подбирать множители так, чтобы переполнение не могло возникнуть при всех возможных значениях R,G,B.

Все расчеты находятся в скрипте pal.py. Подробно детали реализации можно рассмотреть в модулях clockster.v и video.v.

Результат

Результат оценивался с помощью таблицы цветов PAL и цветового градиента, включающего в себя все возможные на Векторе-06ц цвета. На двух современных мониторах, имеющих CVBS вход, сигнал декодируется хорошо. Все 256-цветовое пространство Вектора адекватно передается в композитном сигнале. В целом цвета насыщенные, с хорошим контрастом. Искажения цвета заметны преимущественно при сравнении изображений градиентов с RGB монитором. Хорошо видны цветовые артефакты на горизонтальных контрастных узорах, pixel crawl.  На впечатлении от игр негативные эффекты кодирования не сказываются. Сложности вызывает только восприятие мелкого текста в режиме 512 пикселей в строке.

На некоторых телевизорах заметны проблемы с цветами. Вероятно, они связаны с кодированием кода поля и чередованием фазы между полями. Для компенсации этих проблем чередование фазы между полями сделано опциональным.

Примеры полученных изображений

Все кадры сняты с экрана LCD-монитора с матрицей S-PVA и композитным входом. Баланс белого выставлен по белой области в кадре с таблицей цветности.


Фотографии в более крупном виде можно посмотреть в альбоме.

Рекомендовано к прочтению и изучению









—-—
Адрес этой статьи: http://sensi.org/~svo/verilog/palencoder/
Просьба указывать ссылку на первоисточник.
Updated: Tue Sep 29 02:15:59 MSD 2009