Версия: 2.1 Дата: 26.09.2025
1.1. Цель: Создать гибкий, аппаратно-программный видеоадаптер, совместимый со стандартом CGA. В роли центрального контроллера выступает Raspberry Pi Pico (RP2040), который в реальном времени генерирует видеоданные для контроллера ЭЛТ Motorola MC6845. Система поддерживает как текстовый режим 80x25 (16 цветов), так и графический режим 320x200 (4 цвета), что делает ее полноценной реализацией CGA-адаптера, а не просто текстового контроллера.
1.2. Ключевые функциональные требования:
- Контроллер: Управление таймингами и адресацией осуществляется микросхемой Motorola MC6845 CRTC.
- Видеопамять (эмулируется RP2040): В данной архитектуре физическая микросхема видеопамяти отсутствует. Эту функцию полностью берет на себя RP2040, который в реальном времени генерирует необходимые видеоданные (коды символов, атрибуты или графические данные) в ответ на запросы адреса от MC6845.
- Знакогенератор (эмулируется RP2040): Аналогично видеопамяти, ПЗУ знакогенератора также эмулируется. RP2040 преобразует код символа и номер строки в пиксельный паттерн "на лету".
- Логическое ядро: Вся вспомогательная "клеевая" логика (glue logic), включая генерацию таймингов, обработку курсора и управление цветом, реализуется на программируемых логических микросхемах GAL/ATF.
- Режимы вывода:
- Текстовый режим: 80x25 символов с 16-цветными атрибутами (реализация на двух ATF16V8)
- Графический режим: 320x200 пикселей, 4 цвета (реализация на одной ATF20V8)
- Вывод: Система формирует 4-битный цифровой цветной сигнал (RGBI), который может быть преобразован в аналоговый VGA-сигнал. Дополнительно доступен композитный выход для монохромных мониторов.
- Аппаратный курсор: Система должна поддерживать аппаратный инверсный курсор, управляемый MC6845.
Система состоит из следующих ключевых компонентов, взаимодействующих в рамках двух параллельных потоков данных (символы и атрибуты), которые смешиваются на финальном этапе.
- MC6845: Master-контроллер. Генерирует адреса для видеопамяти (
MA0-MA13) и адреса строк сканирования для знакогенератора (RA0-RA4). Также выдает сигналы синхронизации (HSYNC,VSYNC), разрешения вывода (DE) и активности курсора (CURSOR). - RP2040 (Raspberry Pi Pico): Центральный процессор видеоданных. Он выполняет следующие ключевые задачи:
- Управление MC6845: Инициализация регистров контроллера и генерация его тактовой частоты через PIO.
- Эмуляция видеопамяти (Video ROM): RP2040 выступает в роли единого источника видеоданных для MC6845. В зависимости от режима, он эмулирует:
- Для текстового режима: Память символов (ASCII-коды) и память атрибутов.
- Для графического режима: Видеобуфер (Framebuffer).
- Эмуляция знакогенератора (Character ROM): В текстовом режиме RP2040 на лету преобразует пары "код символа + номер строки" в 8-битный пиксельный паттерн, используя для этого прошитый в него шрифт (файл
rom.h). - Мониторинг шины адреса: Непрерывно считывает адреса памяти (
MA0-MA13) и адреса строк (RA0-RA2) с MC6845 для своевременной выдачи нужных данных.
- 74HC165: 8-битный сдвиговый регистр с параллельной загрузкой. Захватывает 8-битный паттерн от RP2040 (эмуляция Character ROM) и последовательно ("выплевывает") его по одному биту на выход (
PIXELS).
Варианты реализации видеопроцессора:
Вариант А: Текстовый режим (двухчиповая архитектура):
- ATF16V8 "character.pld": Первая GAL. Выполняет функции процессора таймингов и эффектов.
- ATF16V8 "attribute.pld": Вторая GAL. Выполняет функции финального колорайзера и видео-гейта с композитным выходом.
Вариант Б: Графический режим (однчиповая архитектура):
- ATF20V8 "graphics.pld": Единственная GAL для режима 320x200x4. Содержит внутренний пиксельный счетчик, логику распаковки пикселей и генерацию RGBI+композитного сигнала с оптимизацией Де Моргана.
3.1 Текстовый режим (RP2040 + character.pld + attribute.pld):
Система работает в непрерывном цикле, управляемом тактовым генератором (Dot Clock).
- Инициализация системы: RP2040 программирует регистры MC6845 для текстового режима 80x25 и запускает PIO-генератор тактовой частоты (~1.79MHz).
- Генерация таймингов:
character.pldполучаетDOTCLK, делит его на 8 и генерируетCHARCLKдля MC6845, а также синхронный импульс!LOADдля сдвигового регистра 74HC165. - Адресация: MC6845, тактируемый
CHARCLK, выставляет на шину адресаMAиRA. - Эмуляция видеопамяти RP2040:
- RP2040 мониторит сигналы
MA0-MA13иRA0-RA2через GPIO - По адресу
MA: программно генерируетASCII-кодиБайт Атрибута - По адресу
ASCII+RA: выдает 8-битный пиксельный паттерн из встроенного массиваrom.h
- RP2040 мониторит сигналы
- Генерация пикселей:
- RP2040 формирует 8-битный паттерн символа и передает его на 74HC165
74HC165по сигналу!LOADзахватывает этот паттерн и, тактируемыйDOTCLK, начинает выдавать последовательный 1-битныйPIXEL_STREAM.
- Последовательная обработка в GAL:
- Этап 1 (character.pld): Эта GAL принимает
PIXEL_STREAMот 74HC165 и сигналCURSORот MC6845. Она выполняет операциюPIXELS XOR CURSORи выдает на своем выходеVIDEOOUTуже обработанный 1-битный селектор пикселя. - Этап 2 (attribute.pld): Эта GAL является финальным каскадом. Она принимает:
VIDEOOUTот первой GAL на свой входPIXEL.- 8-битный
Байт Атрибутаот RP2040 (разделенный на входыFG0-3иBG0-3). - Сигнал
DEот MC6845.
- Финальное смешивание:
attribute.pldиспользуетPIXELдля выбора между цветом фона и символа, а затем умножает результат наDE, чтобы погасить сигнал в невидимых областях экрана. На выходе формируются 5 готовых сигналов:I, R, G, B, COMPOSITE.
- Этап 1 (character.pld): Эта GAL принимает
3.2 Графический режим 320x200x4 (RP2040 + graphics.pld):
- Инициализация системы: RP2040 программирует регистры MC6845 для графического режима 320x200 и настраивает параметры разложения.
- Прямая адресация видеопамяти: MC6845 напрямую адресует графическую видеопамять, RP2040 мониторит адреса
MA0-MA13. - Эмуляция графической видеопамяти: RP2040 программно генерирует графические данные по текущему адресу
MA. - Пиксельная распаковка:
graphics.pldполучает 8-битный байт видеоданных от RP2040 (4 пикселя по 2 бита) и внутренним 2-битным счетчиком выбирает текущий пиксель. - Цветовая генерация: На основе 2-битного значения пикселя, сигналов
PALETTEиINTENSITYформируются выходные сигналыR, G, B, I, COMPOSITE. - Оптимизация Де Моргана: Для каналов
BиIиспользуется инверсная логика для экономии логических термов в GAL20V8.
4.1. character.pld - Генератор таймингов и эффектов (ATF16V8)
- Назначение: Создает все необходимые для работы системы тактовые сигналы и применяет эффект аппаратного курсора.
- Входы:
CLK/DOTCLK,PIXELS,RESET,HSYNCIN,VSYNCIN,CURSOR. - Выходы:
CHARCLK,/LOAD,VSYNCOUT,HSYNCOUT,VIDEOOUT(промежуточный сигнал дляattribute.pld). - Логика:
- Реализует 3-битный счётчик для деления
DOTCLK. - Выдает
CHARCLKкак старший бит счётчика. - Генерирует
/LOADна основе состояния счётчика. - Инвертирует сигналы синхронизации.
- Вычисляет
VIDEOOUTкакPIXELS XOR CURSOR.
- Реализует 3-битный счётчик для деления
4.2. attribute.pld - Финальный колорайзер текстового режима (ATF16V8)
- Назначение: Раскрашивает 1-битный видеопоток в соответствии с атрибутами и управляет видимостью сигнала.
- Входы:
FG0-3,BG0-3(от Attribute ROM),DE(от MC6845),PIXEL(отVIDEOOUTизcharacter.pld). - Выходы:
R, G, B, I, COMPOSITE. - Логика:
- Реализует 16-цветную палитру CGA путем прямого отображения битов индекса на биты RGBI.
- Использует
PIXELкак селектор в мультиплексоре 2-в-1 для выбора между цветом символа и фона. - Использует
DEкак финальный "вентиль" (gate), чтобы обнулить все выходы в периоды гашения. - Генерирует композитный сигнал яркости, дублирующий канал интенсивности
I.
4.3. graphics.pld - Процессор графического режима CGA (ATF20V8)
- Назначение: Полная обработка графического режима 320x200x4 в одной микросхеме.
- Входы:
DOTCLK,D7-D0(графические данные),PALETTE,INTENSITY,DE. - Выходы:
Q1, Q0(счетчик пикселей),R, G, B, I, COMPOSITE. - Логика:
- Внутренний 2-битный счетчик для выбора пикселя из байта (4 пикселя по 2 бита).
- Прямая генерация каналов
RиGна основе битов текущего пикселя. - Оптимизация Де Моргана для каналов
BиI(инверсная логика для экономии логических термов). - Поддержка двух палитр CGA и управления интенсивностью.
- Композитный выход для любого небакграундного пикселя.
Проект находится на стадии завершения логического дизайна. Архитектура определена для обоих режимов работы:
Завершено:
- Логический дизайн трех вариантов GAL-микросхем
- Детальная спецификация пинаутов и логических уравнений
- Оптимизация под ограничения GAL16V8/GAL20V8
- Поддержка композитного видеовыхода в обоих режимах
- Документация архитектуры и сигнал-флоу
Текущая реализация поддерживает:
- Текстовый режим: 80x25 символов, 16 цветов, аппаратный курсор
- Графический режим: 320x200 пикселей, 4 цвета, две палитры CGA
- Совместимость с оригинальными таймингами MC6845/CGA
- Универсальный интерфейс на базе RP2040 для управления MC6845
- Версия 2.1: Оптимизированная кодовая база с улучшенной производительностью
Новые улучшения в v2.1:
- Упрощенная архитектура кода (сокращение объема на ~50%)
- Оптимизированный главный цикл обработки видеоданных
- Унифицированная инициализация GPIO
- Минимизированный отладочный вывод для лучшей производительности
- Прямое переключение режимов без промежуточных функций