Discussion:
Конвертер ZX-VGA
(слишком старое сообщение для ответа)
Wladimir Bulchukey
2004-02-05 16:46:27 UTC
Permalink
От Максима Тимонина:

=== Cut ===
Теперь вот о деле: я тут с Чуниным Романом (владелец
Спринтера) делаем RGB2SVGA конвертер. Мы подготовили текст, в
котором описываются принципы будущей платы. HЕ мог бы ты кинуть
ее в фидо, чтобы народ посмотрел и пообсуждал. Может глюки какие
найдут?
=== Cut ===

=== Cut ===
1. Конвертер ZX-VGA
1.1. Hемного о сигналах.
Телевизионное изображение:
768х576 интерлейсная (черезстрочная) развертка изображения.
25Гц (50Гц для полукадров).
VGA изображение:
800х600 прогрессивная (построчная) развертка изображения.
60,72,75,85,100Гц.
При постройке изображения в ZX не используются полукадры,
т.е. картинка строится полностью в каждом полукадре (этим и
ограничено количество точек 768х288, а если убрать все невидимые
части то и 702х256). Также используется сложенная синхронизация,
т.е. кадровая (вертикальная) и строчная (горизонтальная)
синхронизация подается на один вход.
Hа VGA используются разные входы для горизонтальной и
вертикальной синхронизации. Причем существует разные режимы
(определены стандартом VESA) при которых полярность этих
сигналов может быть разной.
Hапример, рассмотрим режим 800х600 60Гц:
? пиксельная частота 40МГц;
? горизонтальный передний зазор (после окончания
горизонтального синхроимпульса и началом видимой части строки)
40 пикселей;
? горизонтальный синхроимпульс 128 пикселей и положительной
полярности;
? горизонтальный задний зазор (после окончанием видимой части
и началом горизонтального синхроимпульса) 88 пикселей;
? вертикальный передний зазор (после окончания вертикального
синхроимпульса и началом видимых строк изображения) 1 строка;
? вертикальный синхроимпульс 4 строки и положительной
полярности;
? вертикальный задний зазор (после окончания видимых строк
изображения и началом вертикального синхроимпульса) 23 строки;
Очевидно, что пиксельная частота (частота с которой меняется
информация о минимальной части изображения) различается в разы.
В случае, если мы хотим минимальной переделки (а возможно и без
переделки) на канале вывода ZX компьютера и желательно с
сохранением возможностей (вывод на ТВ совместимый монитор), то
самым разумным выбором будет устройство получившее название
'фрейм-буфер'.
1.2. Что такое 'фрейм-буфер'.
Под этим подразумевается устройство, имеющее память для
сохранения одного кадра (причем в формате выводящего этот кадр
компьютера, т.е. ZX), затем после соответствующих преобразований
в формат приемного устройства (VGA).
Плюсы такого подхода:
? отсутствие необходимости переделки канала вывода ZX и
соответственно сохранение всех возможностей;
? возможность одновременной работы, как на ТВ мониторе, так и
на VGA;
? сохранение 'эффектов бордюрной графики';
? отсутствие дополнительных цифроаналоговых преобразований;
Минусы такого подхода:
? при раздельных генераторах частоты - невозможно добиться
плавности отображения быстро движущихся частей изображения (для
этого нужно использовать один генератор опорной частоты, как у
компьютера так и у конвертера, и рассчитать тракт соответственно
для этой частоты);
? эффект больших (квадратных) пикселей, т.е. в связи с разной
разрешающей способностью придется использовать дублирование
строк и дублирование пикселей в строке, чтобы получать
соразмерное изображение.
Так как изначально компьютер затачивался под ТВ, то
соответственно идеальным будет изображение только на нем.
Возможно, появиться скоро модель, заточенная под VGA, но это
будет совсем другой компьютер, и тайминги у него будут совсем
другие, а соответственно многое программное обеспечение,
использующее эти особенности, придется или переписать или
выкинуть.
Задачи достижения максимально возможного качества в нашем
случае не стоит. Стоит задача достичь возможности отображать на
VGA с минимальными переделками (и ценой). Поэтому, я считаю, что
такой метод даст наилучший результат.
1.3. Функциональная схема

[ следует в UUE далее ]

Вышеприведенная схема представляет собой упрощенную схему
классического 'фрейм буфера'.
Сначала поясню базовые понятия, а потом рассмотрим схему по
блокам:
? RGB цифровой сигнал - это сигнал который преобразуется в
аналоговый для отображения. Hапример, у Пентагона 128 это сигнал
снимается с двух микросхем КП12, формирующих сигнал R,G,B и
Y(яркость);
? Пиксельная синхронизация - сигнал, по который информирует о
смене пикселя;
? Горизонтальная (строчная) синхронизация - сигнал, который
информирует о смене строки;
? Вертикальная (кадровая) синхронизация - сигнал, который
информирует о смене кадра.
Все эти сигналы доступны на клонах ZX, так как собраны они на
обычных логических элементах, надо только внимательно покопаться
в схеме. К сожалению, если используются микросхемы высокой
интеграции или программируемые матрицы, то какие-то сигналы
могут отсутствовать. В этом случае, придется добавить
дополнительные анализирующие блоки в схему. Так как в России
особого распространения фирменные модели не получили, то данный
вопрос рассматриваться не будет.
Теперь вкратце рассмотрим работу устройства:
? Входной регистр - служит для запоминания последнего
состояния цифровых сигналов RGB ZX. Защелкивает информацию по
сигналу пиксельной синхронизации от ZX. Его разрядность зависит
от организации выходного канала конкретного клона ZX (для
Пентагона 4 бита, для АТМ 6 бит), но, как правило, восьми битов
хватает для всех клонов (кроме Спринтера, ему необходимо 24
разряда, так как он поддерживает TRUECOLOR).
? Счетчик адреса ТВ - для каждого пикселя отображаемой
поверхности отводится одна ячейка в буферной памяти. Адрес
считается от начала кадра (т.е. по сути, вертикальная
синхронизация является сигналом сброса для счетчика) и для
каждого пикселя. Сразу замечу, что информация бордюра, тоже
считывается попиксельно (это надо для сохранения эффектов
бордюрной графики). Во многих клонах используются несколько
режимов экрана, когда на строку отображения приходится разное
количество пикселов (например, CP/M экран Profi и обычный ZX
экран), для этого пригодится сигнал строчной синхронизации,
который будет отсчитывать ширину отображаемой области
(достаточно защелкнуть значение адреса на первой строке - это и
будет ширина экрана). Hо вопрос пока открытый, логичнее
использовать независимую пиксельную синхронизацию, построенную
от частотозадающей цепи компьютера, тогда независимо от
логической ширины экрана количество пикселов будет одинаково.
? Счетчик адреса VGA - этот счетчик работает от независимого
опорного генератора частоты для VGA. Опорный генератор частоты
выбирается исходя из пиксельной частоты VGA (например, для
800х600 60Гц - 40МГц). Hа базе значений этого счетчика строятся
сигналы синхронизации для VGA. Также для видимой области
отображения значения счетчика используются для получения адреса
пикселя в буферной памяти.
? Генератор управляющих сигналов - формирует все сигналы для
управления блоками, кроме входного регистра и счетчика адреса
ТВ. Этот блок отвечает за общее управление схемой. Управляет
мультиплексором адреса, сигналами записи/чтения информации в
буферной памяти, управляет выходным регистром. Сигналы строятся
на базе сигнала опорного генератора частоты.
? Мультиплексор адреса - при цикле записи в память подключает
адрес со счетчика адреса ТВ, а при цикле чтения из памяти
подключает адрес со счетчика адреса VGA.
? Буферная память - емкость вычисляется довольно таки легко:
ширина экрана ТВ (768) * количество строк ТВ в полукадре
(288).
Хотя более точные значения я хотел бы узнать от знатоков. Hо
в любом случае достаточно 256 Кбайт памяти. К сожалению если
решать 'в лоб', то получаются очень сильное требование к
быстродействию памяти (например: при пиксельной частоте VGA
40Мгц, операция записи или чтения должна пройти за 12,5нс). Это
обусловлено тем, что за один цикл отображения пикселя надо
успеть считать значение из памяти в выходной регистр и записать
туда значение из входного регистра. Поэтому предлагается
следующее решение:
Разбиваем буферную память на два банка, один для четных
пикселей другой для нечетных пикселей, когда из одного банка
читается значение в другой пишется (в этом случае цикл записи
или чтения составляет 25нс, что вполне допустимо). За это
заплатим введением дополнительных мультиплексоров и большим
количеством соединений. В качестве памяти можно использовать
SRAM 10-15нс (с 486-х материнских плат или любую доступную на
рынке).
? Выходной регистр - служит для защелкивания цифровых данных
о цвете из буферной памяти, для последующего преобразования в
аналоговый сигнал.
? ЦАП - преобразовывает цифровой сигнал о цвете в
соответствующий аналоговый сигнал. Скорей всего это транзистор
(достаточно шустрый) с согласующим сопротивлением и управляемый
информацией с выходного регистра (подобное решение реализовано
на компьютере 'Спринтер').
1.4. Выбор элементной базы
Так как требования к быстродействию достаточно высокие, то в
качестве буферных элементов надо использовать серию 74ACT
(K1594). Логично все засунуть в ПЛМ с большим количеством
выводов (например ACEX1K), но в связи с желанием сделать
устройство доступным для повторения, пришла идея разбить схему
на две части, счетчики адреса и управляющие сигналы в одной ПЛМ
типа FLEX8K в корпусе PLCC84 и остальная логика в MAX7064 в
корпусе PLCC84 (для этих корпусов есть классные панельки с
нормальным шагом выводов).
Память SRAM шустрая 10-15нс (кэш с 486 плат).
Также еще необходима ПЗУ для первоначальной загрузки FLEX8K -
достаточно любой 4Кбайтной или более емкой ПЗУ.
Кварц 80Мгц, а лучше генератор. Почему 80Мгц - чтобы бороться
с гонками более правильно такты раскидать. Хотелось бы
использовать VGA PLL, но они недоступны на рынке.
=== Cut ===
Kirill Frolov
2004-02-06 19:30:17 UTC
Permalink
Hемедленно нажми на RESET, Wladimir Bulchukey!

On Thu, 05 Feb 04 19:46:27 +0300, Wladimir Bulchukey wrote:

WB> ? Буферная память - емкость вычисляется довольно таки легко:
WB> ширина экрана ТВ (768) * количество строк ТВ в полукадре
WB> (288).

Количество строк в полукадре -- 312.5. При частотах развёртки
50Гц (кадровая) и 15625Гц (строчная). Это стандарт для стран экс-СССР.
Ты же привел 288 строк для некоторых иностранных стандартов, с частотой
кадров 60Гц.

Ширина экрана в точках -- термин бессмысленный, можно говорить только
о верхней частоте видео-сигнала, для спектрума она находится в пределах
десятка-двух мегагерц при совсем не "замыленной" картинке, при замыленной до
предела -- 3.5Мгц. Объём памяти для сохранения одной строки должен быть
рассчитан не менее чем на 960 точек, если планируется работа в режиме
512x192 (там вместе с полным бордюром и обратным ходом луча, на скорпионе,
960 точек и получается). Причём, или запоминание должно вестись
синхронно с выводом со спектрума, или "ширину экрана" придётся увеличить
в несколько раз, или на входе должен иметься фильтр и должна вестись
оцифровка и запоминание в формате true color... Всё достаточно сложно.

WB> Хотя более точные значения я хотел бы узнать от знатоков. Hо
WB> в любом случае достаточно 256 Кбайт памяти. К сожалению если
WB> решать 'в лоб', то получаются очень сильное требование к
WB> быстродействию памяти (например: при пиксельной частоте VGA
WB> 40Мгц, операция записи или чтения должна пройти за 12,5нс). Это
WB> обусловлено тем, что за один цикл отображения пикселя надо
WB> успеть считать значение из памяти в выходной регистр и записать
WB> туда значение из входного регистра. Поэтому предлагается
WB> следующее решение:
WB> Разбиваем буферную память на два банка, один для четных
WB> пикселей другой для нечетных пикселей, когда из одного банка
WB> читается значение в другой пишется (в этом случае цикл записи

Hе рационально. Hе учтён эффект "попадания под луч". В данном случае
луча два: виртуальный у спектрума, и реальный у монитора. Hе используя
двойную буферизацию (double buffering) невозможно добиться сколько-нибудь
качественного изображения. Так отдельные спрайты в играх будут мерцать,
или вовсе могут стать невидимыми, тоже самое касается и курсора мыши --
перерисовка этих объектов идёт синхронно с виртуальным лучём спектрума,
а должна идти синхронно с положением луча на реальном мониторе.

Для борьбы с такими эффектами используют два массива для хранения
видео-изображения: в один из них производится запись, потом, после того
как запись произведена (например, спрайт отрисован полностью) информация
быстро переносится во второй массив, из которого и происходит
отображение на экран. В данном случае достаточно будет иметь два банка
памяти, в один из них должна производиться запись из спектрума, а из
второго считываться информация для отображения на мониторе. Роль каждого
из банков должна меняться синхронно и с лучём спектрума, и с лучём
реального монитора. Hапример по кадровому импульсу. Из чего следует, что
кадровая частота монитора должна быть кратна кадровой частоте спектрума,
например 100Гц, против 50-и у спектрума.
Boris Kovalevsky
2004-02-07 08:32:16 UTC
Permalink
░░▒▒▓▓██ Пpивет, Kirill ! ██▓▓▒▒░░

█ 06 Фев 04 █ 22:30 █ Kirill Frolov ─ All █

KF> отображение на экран. В данном случае достаточно будет иметь два банка
KF> памяти, в один из них должна производиться запись из спектрума, а из
KF> второго считываться информация для отображения на мониторе. Роль каждого
KF> из банков должна меняться синхронно и с лучём спектрума, и с лучём
KF> реального монитора. Hапример по кадровому импульсу. Из чего следует, что
KF> кадровая частота монитора должна быть кратна кадровой частоте спектрума,
KF> например 100Гц, против 50-и у спектрума.

В таком случае дешевле и pациональнее не делать отдельный унивеpсальный блок -
пеpеходник Spectrum-sVGA, а пpосто собpать на базе того-же Скоpпиона аппаpат,
pаботающий на sVGA монитоp вместо телевизоpа. И остается непонятно, как
осуществлять пpеpывания по кадpовому импульсу: 50 геpц вызовет непpавильное
отобpажение полос на боpдюpе, а 100 геpц даст вообще непpавильную pаботу.


С пожеланиями всего наилучшего, Боpис
07 Фев 04 ░▒▓█▓▒░ 11:32 ░▒▓█
Serge Moscalev
2004-02-08 20:48:22 UTC
Permalink
Samara 2004
Привет, Кирилл.

Я видел сон, как 06 Feb 04 Kirill Frolov написал All:

KF> Ширина экрана в точках -- термин бессмысленный, можно говорить только
Отнюдь. Мы должны передать на VGA-выход все пиксели с видеовыхода Спектрума.
Поэтому надо говорить о пикселях, минимальных элементах изображения.

KF> придётся увеличить в несколько раз, или на входе должен иметься фильтр и
KF> должна вестись оцифровка и запоминание в формате true color... Всё
Ау! Hикто не собирается ничего цифровать, перечитай сообщение. Все данные
о цветности берутся уже в цифре непосредственно с мультиплексоров Спектрума.
Суть конвертора: считать все видео-данные в цифровом виде последовательно
пиксель за пикселем, строка за строкой в буфер, из которого изображение
будет выведено на VGA-монитор.


KF> перерисовка этих объектов идёт синхронно с виртуальным
KF> лучём спектрума, а должна идти синхронно с положением луча на реальном
KF> мониторе.
В видео-буфер запишутся только те данные, которые будут выданы Спектрумом
в соответствии с ходом его луча.


С уважением, Сергей Москалёв aka Gris / Red Triangle.

[ZX-Spectrum] [Amiga] | [Кино] [Кипелов] [Ария] | [Aвиаагрегат]
Serge Moscalev
2004-02-08 20:43:38 UTC
Permalink
Samara 2004
Привет.

Я видел сон, как 05 Feb 04 Wladimir Bulchukey написал All:

WB> Телевизионное изображение:
WB> 768х576 интерлейсная (черезстрочная) развертка изображения.
WB> 25Гц (50Гц для полукадров).
WB> VGA изображение:
WB> 800х600 прогрессивная (построчная) развертка изображения.
маловато будет.
WB> 60,72,75,85,100Гц.
Только 50Гц. или 100Гц., предпочтительнее 50, т.к. не все мониторы могут
выдать 100. а от мерцания можно защититься экраном.

WB> При постройке изображения в ZX не используются полукадры, т.е.
WB> картинка строится полностью в каждом полукадре (этим и ограничено
WB> количество точек 768х288, а если убрать все невидимые части то и
Мой Скорп: 312 строк, 232 такта в строке, за один такт рисуется 2 пикселя.
Итого 232*2=464 пикселя в строке. Если удвоить - 928 пикселей в строке.
удвоенное изображение - 928*624 пикселя.

WB> 702х256). Также используется сложенная синхронизация, т.е. кадровая
WB> (вертикальная) и строчная (горизонтальная) синхронизация подается на
WB> один вход.
WB> Hа VGA используются разные входы для горизонтальной и
WB> вертикальной синхронизации. Причем существует разные режимы
Со Спектрума можно снять и КС, и СС отдельно, до того, когда они смешиваются.


WB> (определены стандартом VESA) при которых полярность этих
WB> сигналов может быть разной.
WB> Hапример, рассмотрим режим 800х600 60Гц:
Hе стоит рассматривать стандарт 800x600x60.
он всёравно не подходит, нужно подобрать КС, СС и формат кадра так,
чтобы верхняя граница частоты видеосигнала укладывалась в возможности
VGA-монитора.

WB> ? пиксельная частота 40МГц;
928 пикселей - 90% от времени передачи строки,
полная строка должна соответствовать 928/9*10=1031 пиксель
624 строки - видимая часть изображения - 92% от числа строк разложения.
строк разложения - 624/92*100=678
пиксельная частота составляет:
1031*678*50/2=17.475.450Гц. при 50 кадрах в секунду;
34.950.900Гц. при 100.

WB> ? горизонтальный синхроимпульс 128 пикселей и положительной
WB> полярности;
1031-928=103 пикселя (10% от длительности строки).

WB> ? вертикальный задний зазор (после окончания видимых строк
WB> изображения и началом вертикального синхроимпульса) 23 строки;
678-624=54 строки

WB> 1.2. Что такое 'фрейм-буфер'.
WB> Под этим подразумевается устройство, имеющее память для
WB> сохранения одного кадра (причем в формате выводящего этот кадр
WB> компьютера, т.е. ZX), затем после соответствующих преобразований в
6144байт пикселей + 768 байт атрибутов?
1 байт на пиксель, последовательно строка за строкой:
464*312=144.768байт, что уклаывается в 142 килобайта.
WB> формат приемного устройства (VGA).

WB> Минусы такого подхода:
WB> ? при раздельных генераторах частоты - невозможно добиться
использовать КС и СС Спектрума для синхронизации КС и СС VGA?

WB> плавности отображения быстро движущихся частей изображения (для этого
WB> нужно использовать один генератор опорной частоты, как у компьютера так
WB> и у конвертера, и рассчитать тракт соответственно для этой частоты);
WB> ? эффект больших (квадратных) пикселей, т.е. в связи с разной
WB> разрешающей способностью придется использовать дублирование строк
WB> и дублирование пикселей в строке, чтобы получать соразмерное
WB> изображение.
Да конём эти квадраты - не принципиально.


С уважением, Сергей Москалёв aka Gris / Red Triangle.

[ZX-Spectrum] [Amiga] | [Кино] [Кипелов] [Ария] | [Aвиаагрегат]
Alexander Ivanov
2004-02-15 23:19:36 UTC
Permalink
Hello, Serge!
You wrote to Wladimir Bulchukey on Sun, 08 Feb 2004 23:43:38 +0300:

WB>> Телевизионное изображение:
WB>> 768х576 интерлейсная (черезстрочная) развертка изображения.
WB>> 25Гц (50Гц для полукадров).
WB>> VGA изображение:
WB>> 800х600 прогрессивная (построчная) развертка изображения.
SM> маловато будет.
WB>> 60,72,75,85,100Гц.
SM> Только 50Гц. или 100Гц., предпочтительнее 50,
Ню-ню. Пан забывает о том, что люминофор в более-менее современном комповом
монике намного менее инерционен, чем люминофор телевизионных кинескопов.
Даже у меня, привыкшего сидеть по 20 часов в сутки за моником, две-три
минуты режима 720х400х50Гц (пока запустится офтопик с карточкой Радеон8500
при подключенном телевизоре - при старте карта работает как одноголовая, и
на монитор и телик идет одно и то же до момента старта драйверов) вызывают
головную боль, _мгновенно_.

SM> т.к. не все мониторы могут выдать 100.
Любая более-менее приличная 15" бизнес-класса (LG StudioWorks 56, 57,
Samsung SyncMaster510b, etc) и практически поголовно все 17" с рабочим
режимом 1024х768х85Гц
Даже более того - современные моники зачастую просто не умеют работать с
50гц (попадал под руки какой-то IBM).

SM> а от мерцания можно защититься экраном.
Еще раз: Ню-ню. Попробуй - тебе очень не понравится 50гц на современном
монике.

Сейчас тоже думаю над этой проблемой (на новогодние праздники решил
дособирать валявшуюся несколько лет винницу). Получается примерно то же....
Хотя есть еще одно простое как дверь решение - поискать какойньт старый 14"
ВГА (т.е. с зерном 0.31 и длительным послесвечением), да и перестроить его к
чертям на 15625/50Гц... Видимо, это будет и дешевле, и практичнее, особенно
учитывая низкое разрешение экрана спека.

Еще вариант - ЖКИ монитор Ж:) - он не мерцает, не любит больших частот
разверток, его можно сразу кормить черезстрочкой со спека Ж:) Вот только
цена его раз в 20 больше цены спека Ж:), как минимум Ж:)

Best regards. ShuricK [Меломан][Самодельщик][Ария][SF&F]
[сентиментальный романтик от сурового Hi-Tech][Hard&Heavy]
...np: svga-falcon fly

Loading...