Подключение компа к телеку - Yourline Forum

Выход Vga

Vga / Март 8, 2017

Привет хабр — в этой статье я собираюсь поделиться своими успехами в освоении ПЛИС Altera Cyclone III. После мигания лампочками и игр со счетчиками — решил сделать что то более серьезное. Сделал я простейший VGA адаптер. Об основных его частях и пойдет речь. Статья больше ориентирована на начинающих, так как для опытных эта задача не составит труда, но для освоения, на мой взгляд — хорошая тренировочная задача. Эксперименты я свои провожу на отладочной плате Altera DE0. Описывать схему я буду на Verilog, Среда — Quartus II v 12.0. Итак — добро пожаловать под кат:

Структурная схема VGA адаптера
Начнем с того, что разберемся — из чего состоит VGA и с чем его едят
Изначально VGA создавался для мониторов с электронно- лучевой трубкой, поэтому управляем мы тут не матрицой пикселей, как в LCD дисплеях, а электронным лучом, который бегает по экрану и мы в нужные моменты должны его усиливать/ослаблять или выключать вообще. Когда я начал работать с VGA — удивился — как мало подробной информации, описывающей этот стандарт я смог найти — что впрочем и понятно — он уже устарел и от него отказываются производители. Надеюсь моя статья кому то поможет в освоении стандарта.
Вырезка из статьи Вики про VGA:
VGA (так же, как и EGA) состоит из следующих основных подсистем (в народе словом «секвенсер» называли набор регистров управления доступом к плоскостям видеопамяти):

  • Графический контроллер (Graphics Controller), посредством которого происходит обмен данными между центральным процессором и видеопамятью. Имеет возможность выполнять битовые операции над передаваемыми данными.
  • Видеопамять (Display Memory), в которой размещаются данные, отображаемые на экране монитора. 256 кБ DRAM разделены на четыре цветовых слоя по 64 кБ.
  • Последовательный преобразователь (Serializer или Sequencer) — преобразует данные из видеопамяти в поток битов, передаваемый контроллеру атрибутов.
  • Контроллер атрибутов (Attribute Controller) — с помощью палитры преобразует входные данные в цветовые значения.
  • Синхронизатор (Sequencer) — управляет временны́ми параметрами видеоадаптера и переключением цветовых слоёв.
  • Контроллер ЭЛТ (CRT Controller) — генерирует сигналы синхронизации для ЭЛТ.

В роли синхронизатора у нас будет выступать генератор на 50 МГц, присутствующий на отладочной плате.
Видеопамять и обмен данными с процессором пока реализовывать не будем — вместо этого сами будем генерировать поток битов для контроллера атрибутов.
Итак — задача разбивается на реализацию следующих блоков:
  1. Синхронизатор — частота 50 мегагерц для нас не очень удобна, поэтому её придется немного изменить
  2. Контроллер ЭЛТ, который будет выдавать сигналы синхронизации в соответствии с требованиями стандарта VGA
  3. Генератор картинки — будем использовать для отладки — блок будет рисовать простейшую картинку и выдавать её контроллеру ЭЛТ

Синхронизатор

Начнем с того, что лезем на Английскую Вики и смотрим Signal timings для VGA, откуда узнаём, что частота синхрогенератора должна быть 25, 175 МГц.
Вот нам и первая задача — сделать из 50 МГц — 25.175 МГц. Поможет нам в этом деле PLL или ФАПЧ.
При помощи Mega Wizard'а создаём наш PLL с нужными настройками. Для этого идем Tools/MegaWizard Plug-InManager. Там выбираем тип выходного файла Verilog HDL I/O ALTPLL и настраиваем его — устанавливаем входную частоту и затем её преобразовываем. Нам нужно получить частоту 25, 175 МГц, при этом мы можем только умножать и делить на целое число, то есть нам нужно перевести число 0, 5035 в дробь. Можно умножить на 5035 и поделить на 10000, но заметим, что можно сократить оба числа на 5. Получаем дробь 1007 / 2000. При этом визард сам приблизит требуемый множитель доступной ему дробью. Включаем полученный модуль в проект подключаем на его вход наш клок с платы, а для выхода создаём wire, который потом куда нибудь заведем, главная цель этого пункта достигнута — получить частоту 25, 175 МГц.
Генераторы синхроимпульсов
Двигаемся дальше. Теперь нам нужно создать модули, которые выдают синхросигналы, удовлетворяющие таймингам горизонтальной и вертикальной синхронизации, то есть вот этому для горизонтальной синхрониции:
То есть мы должны перед выдачей данных подержать линию синхронизации в высоком состоянии время А, потом прижать к земле на время B, потом перевести в высокое состояние, подождать время C и только потом идет поток данных — лучик начинает пробегать строчку за время D и мы за это время должны успеть установить все пиксели с частотой 25, 175 мегагерц и так для каждой строки. Вертикальная синхронизация работает почти так же, только вместо пикселей мы передаём строчки и за один период синхроимпульса отрисовываем весь кадр.
Задача определилась — создать блок, который реализует описанную выше последовательность, принимая на вход частоту VGA_CLK, из входов еще добавим, пожалуй, сигнал сброса. Реализация такого блока не проста, а очень проста:
При периоде 1/VGA_CLK = 0, 69 микросекунд нам нужно 24 такта на A, 95 на B, 48 на C, и 640 на D. То же самое и для вертикальной синхронизации, но тут удобнее тактироваться не по тактам частоты в 25.175 мегагерц, а по восходящим фронтам сигнала горизонтальной синхронизации, тогда все задержки можно считать в периодах отрисовки строчки. Кроме того у нас есть область «холостого хода» на экране, реально — по тактам экран чуть больше, а рисовать мы должны только в видимой области, поэтому желательно еще, чтобы модуль нам сообщал текущие координаты лучика, да и если мы собираемся назначать каждому пикселю какой то цвет — без знания текущей позиции луча не обойтись.
Модуль синхронизации

Источник: habrahabr.ru