Skip to content

xrip/mc6845-cga-rp2040

Repository files navigation

Техническая Спецификация: CGA-совместимый видеоадаптер на базе RP2040

Версия: 2.1 Дата: 26.09.2025

1.0 Обзор и цели проекта

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.

2.0 Архитектура системы и компоненты

Система состоит из следующих ключевых компонентов, взаимодействующих в рамках двух параллельных потоков данных (символы и атрибуты), которые смешиваются на финальном этапе.

  • 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.0 Взаимодействие компонентов и сигнал-флоу

3.1 Текстовый режим (RP2040 + character.pld + attribute.pld):

Система работает в непрерывном цикле, управляемом тактовым генератором (Dot Clock).

  1. Инициализация системы: RP2040 программирует регистры MC6845 для текстового режима 80x25 и запускает PIO-генератор тактовой частоты (~1.79MHz).
  2. Генерация таймингов: character.pld получает DOTCLK, делит его на 8 и генерирует CHARCLK для MC6845, а также синхронный импульс !LOAD для сдвигового регистра 74HC165.
  3. Адресация: MC6845, тактируемый CHARCLK, выставляет на шину адреса MA и RA.
  4. Эмуляция видеопамяти RP2040:
    • RP2040 мониторит сигналы MA0-MA13 и RA0-RA2 через GPIO
    • По адресу MA: программно генерирует ASCII-код и Байт Атрибута
    • По адресу ASCII+RA: выдает 8-битный пиксельный паттерн из встроенного массива rom.h
  5. Генерация пикселей:
    • RP2040 формирует 8-битный паттерн символа и передает его на 74HC165
    • 74HC165 по сигналу !LOAD захватывает этот паттерн и, тактируемый DOTCLK, начинает выдавать последовательный 1-битный PIXEL_STREAM.
  6. Последовательная обработка в 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.

3.2 Графический режим 320x200x4 (RP2040 + graphics.pld):

  1. Инициализация системы: RP2040 программирует регистры MC6845 для графического режима 320x200 и настраивает параметры разложения.
  2. Прямая адресация видеопамяти: MC6845 напрямую адресует графическую видеопамять, RP2040 мониторит адреса MA0-MA13.
  3. Эмуляция графической видеопамяти: RP2040 программно генерирует графические данные по текущему адресу MA.
  4. Пиксельная распаковка: graphics.pld получает 8-битный байт видеоданных от RP2040 (4 пикселя по 2 бита) и внутренним 2-битным счетчиком выбирает текущий пиксель.
  5. Цветовая генерация: На основе 2-битного значения пикселя, сигналов PALETTE и INTENSITY формируются выходные сигналы R, G, B, I, COMPOSITE.
  6. Оптимизация Де Моргана: Для каналов B и I используется инверсная логика для экономии логических термов в GAL20V8.

4.0 Спецификация программируемой логики (согласно предоставленным файлам)

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.

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 и управления интенсивностью.
    • Композитный выход для любого небакграундного пикселя.

5.0 Статус проекта и рекомендации для следующего этапа

Проект находится на стадии завершения логического дизайна. Архитектура определена для обоих режимов работы:

Завершено:

  • Логический дизайн трех вариантов GAL-микросхем
  • Детальная спецификация пинаутов и логических уравнений
  • Оптимизация под ограничения GAL16V8/GAL20V8
  • Поддержка композитного видеовыхода в обоих режимах
  • Документация архитектуры и сигнал-флоу

Текущая реализация поддерживает:

  • Текстовый режим: 80x25 символов, 16 цветов, аппаратный курсор
  • Графический режим: 320x200 пикселей, 4 цвета, две палитры CGA
  • Совместимость с оригинальными таймингами MC6845/CGA
  • Универсальный интерфейс на базе RP2040 для управления MC6845
  • Версия 2.1: Оптимизированная кодовая база с улучшенной производительностью

Новые улучшения в v2.1:

  • Упрощенная архитектура кода (сокращение объема на ~50%)
  • Оптимизированный главный цикл обработки видеоданных
  • Унифицированная инициализация GPIO
  • Минимизированный отладочный вывод для лучшей производительности
  • Прямое переключение режимов без промежуточных функций

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors