Записная книжка разработчика

Мои проекты

Проект видеоадаптера. Часть 3

| Comments

Продолжение. Часть 2.

Структурная схема видеоадаптера приведена на рис. 1 (кликабельно)

vga-card-big

 

Рис. 1. Структурная схема видеоадаптера.

 

Пояснения к схеме:

В первой версии видеоадаптер будет иметь только текстовый режим EGA, 80 * 25 символов 8 * 14 пикселов каждый символ. Таким образом, экранное разрешение составит 8 * 80 = 640 пикселов по горизонтали и 14 * 25 = 350 пикселов по вертикали. Частота пикселов в этом режиме составляет, по стандарту 25,175 МГц, фактическая частота будет 25 МГц, в связи с тем, что частота тактирования ПЛИС составляет 50 МГц. При этом на любом мониторе происходит нормальная синхронизация.

Для аналогичного тектового видеорежима VGA разрешение составляет 720 * 400 пикселей, т.к. символы имеют размер 9*16 пикселей. Частота пикселов при этом должна быть 28,322 МГц, и нормальная синхронизация с частотой 25 МГц невозможна. Можно получить близкую частоту с помощью PLL, но тогда потребуются блоки для асинхронного сопряжения видеоадаптера с микропроцессорной частью проекта, т.к. микропроцессорная часть будет тактироваться частотой 50 МГц. Это будет следующим этапом проекта, пока вся схема будет тактироваться от 50 МГц.

Графические режимы тоже будут позже, пока будет реализован максимально простой вариант.

Некоторые пояснения по схеме:

sync_gen - генератор синхроимпульсов. Имеет выходы h_coord_reg и v_coord_reg, соответственно, текущие координаты пиксела по горизонтали и вертикали. data_en - сигнал разрешения данных. Этот же сигнал используется для "гашения" выходов ЦАП. hsync_reg и vsync_reg - сигналы горизонтальной и вертикальной синхронизации.

Так как вся схема состоит из нескольких модулей, включенных последовательно, прохождение сигнала по ним занимает несколько тактов. В связи с этим сигналы data_en, hsync_reg и vsync_reg также должны быть задержаны, чтобы приходить на выход синхронно с сигналами соответствующего пиксела.

addr_decoder - так как видеоадаптер будет использовать в качестве видеопамяти внешнюю sdram, которая будет использоваться совместно с основным микропроцессором, необходимо иметь небольшую буферную память, чтобы избежать проблем, связанных с временем доступа к внешней памяти. Этот буфер будет двойным, пока идёт выборка из одного блока памяти, в другой загружаются данные из внешней памяти, затем они меняются местами. каждый блок памяти будет иметь размер 256*16 бит. 16-и битный выход позволит получит сразу и ком символа, и информацию об его цвете. Модуль addr_decoder вырабатывает текущий адрес в буфере buffer_addr_reg, исходя из текущей координаты пиксела и смещения буфера (т.е. адреса, который отображается на начало буфера). Также этот модуль вырабатывает сигналы hmod_reg и vmod_reg, которые являются координатой пиксела в текущем знакоместе (т.е. абсолютной координатой по модулю 8 и 14 соответственно).

buf_mem - буфер памяти, см. предыдущий абзац.

mem_controller - контроллер памяти. Должен обеспечивать подкачку содержимого буфера из внешней SDRAM. Также, в будущем, будет обеспечивать асинхронные взаимодействия видеоадаптера и основной части, при их работе на разной тактовой частоте.

mode_controller - контроллер видеорежима. Пока видеоадаптер будет иметь только один текстовый режим, но в будущем контроллер должен будет обесипечивать установку всех остальных модулей в состояние, соответствующее текущему видеорежиму. Также модуль выделяет код символа (char_code_reg), цвет символа (char_color_reg), цвет фона (back_color_reg) и признак мигания blink.

char_gen - знакогенератор. В данной версии представляет собой ПЗУ с таблицей символов EGA (8*14), но впоследствии будет содержать символы VGA (9*16) и символы 8*8, а также программируемые пользователем символы. На его вход поступает код символа (char_code) и номер строки символа (vmod), на выходе появляется строка текущего знакоместа (char_data_reg).

pixel_data_decoder - на основании сигналов char_data, hmod, char_color, back_color, blink определяет цвет текущего пиксела в палитре.

palette - регистры палитры. В данной версии представляет собой ПЗУ, в дальнейшем будет возможность его изменения пользовательской программой.

Пока это черновик схемы, она будет дорабатываться и изменяться по мере продвижения проекта.