EdigE
← ЛЕНТА

Motorola 68000 работает с 32-битными PCI-картами через FPGA

PCI-карта VGA ожидает, что хозяин прочитает configuration space, назначит ей адреса, дёрнет нужные регистры и будет соблюдать протокол параллельной шины. Motorola 68000 всего этого мира никогда не видел: его внешняя шина 16-битная, порядок байтов big-endian, а сам процессор вышел задолго до PCI. Piotr Grzesik собрал между ними аппаратного дипломата на Xilinx Spartan-II XC2S100 — и заставил эту пару работать.

На макетной плате размером 18×12 см стоят MC68000P на 10 МГц, 1 МБ SRAM, 4 КБ ROM, CPLD XC95144XL, FPGA Spartan-II и два 32-битных 5-V PCI-разъёма. Ноги разъёмов автор вручную загнул под сетку 2.54 мм и соединил плату эмалированным проводом. ATmega128 здесь нужен только для загрузки конфигурации FPGA при старте; сам мост реализован на VHDL.

Слово «32-битный» требует точности. AD[31:0] и слоты у PCI действительно 32-битные, однако 68000 не выдаёт один 32-битный доступ. Мост преобразует каждый его 8- или 16-битный цикл в отдельную PCI-транзакцию с нужными C/BE#. Поэтому регистры шириной 32 бита процессор обслуживает несколькими обращениями. Это медленнее нативного PCI-host, зато сохраняет настоящую электрическую и протокольную природу шины: карта видит обычные PCI memory, I/O и configuration cycles.

Самая коварная часть моста лежит в байтах. 68000 хранит старший байт первым, PCI-периферия почти всегда ждёт little-endian представление. Для configuration-регистров мост применяет перестановку, сохраняющую числовое значение. Для I/O и framebuffer выбран режим, сохраняющий адреса байтов; там, где устройство требует 16- или 32-битный регистр, перестановку выполняет код процессора. Так FPGA переводит одновременно сигналы шины и смысл адресуемых данных.

maniek86 / Piotr Grzesik, автор проекта

Автор замедлил PCI до 10 МГц вместе с CPU. Conventional PCI допускает тактирование от nominal DC до 33 МГц, хотя для режима ниже 16 МГц спецификация оставляет совместимость конкретных карт на усмотрение их разработчика. Поэтому успешный запуск старых карт здесь особенно ценен как эксперимент, но не обещает, что в слот заработает любая PCI-плата из ящика.

Эксперимент уже вышел далеко за пределы обнаружения устройства. Мост конфигурирует двухпортовую последовательную карту MosChip NM9835 и принимает её аппаратные прерывания. Запущены Cirrus Logic GD5440, S3 Trio64V2/DX и частично IGS IGA1680; VGA-карты приходится будить ручной записью регистров, поскольку исполнить их x86 VBIOS на 68000 невозможно. Получены текстовый режим 80×25 с 16 цветами и графика 320×200 с 256 цветами. RTL8029 позволила машине отвечать на ICMP, Telnet и HTTP: 10-МГц процессор действительно отдал веб-страницу через PCI-сетевуху.

У моста пока нет bus mastering и DMA. PCI-карта не может сама ходить в системную SRAM, поскольку у Spartan-II не хватило выводов для нужной логики и сигналов. Это сразу отсекает множество устройств, завязанных на DMA, включая значительную часть USB-, SCSI- и звуковых карт. Но в этом ограничении хорошо видна инженерная честность проекта: FPGA не прячет старую машину за готовым одноплатником, она терпеливо растягивает её 16-битные циклы в язык PCI и оставляет на виду каждый компромисс.