
Поддержка сайта
Продвижение сайтов
Создание сайтов
ZedRipper: ноутбук с 16 процессорами Z80
Посмотрите, как выглядит ZedRipper — 16-ядерный зверь, работающий на частоте 83 МГц, на базе процессоров Z80. Это портативный, непрактичный и очень интересный компьютер. Это моя первая попытка собрать портативную машинку, чтобы удовлетворить сразу несколько желаний:
- Наконец-то, чтобы иметь возможность использовать гигантскую FPGA, которая давно валяется в моих ящиках
- Разобраться в альтернативном рассказе о создании и развитии компьютеров, рассматривая вопросы многозадачности с точки зрения оборудования.
- Сконструировать компьютер, на котором можно будет писать забавные программки во время поездки в метро по дороге на работу.
- Создать платформу, на которой можно проводить простые эксперименты над компьютерными архитектурами.
Несколько картинок
Если у вас нет времени читать много текстов о непрактичной архитектуре…
Так что это за зверь?
ZedRipper — это результат сборки худшего компьютера с операционной системой CP / M 2.2, который имеет:
- 16 процессоров Z80, работающих на частоте 83,33 МГц
- 64 КБ отдельной памяти для каждого Z80
- Соответствующий ANSI терминальный ускоритель с 16 выходами
- Все процессоры и другие устройства подключены через полностью синхронную однонаправленную кольцевую сеть с частотой 83 МГц.
- SD-карта 128 МБ, используемая как диски CP / M 16 на 8 МБ
- «Серверное» ядро, которое загружается в CP / M 2.2 и запускает файловый сервер CP / NET, написанный на Turbo Pascal 3, на том же компьютере и обеспечивает совместное использование SD-карты.
- 15 «клиентских» ядер, загружающих CP / NOS из ПЗУ. Каждый клиент имеет доступ к общему хранилищу, и каждый из них может запускать любые программы CP / M 2.2, не конкурируя за ресурсы с другими программами.
В другой раз
После моих приключений с портированием игр на Kaypro у меня остались очень теплые впечатления от этой примитивной операционной системы 40 лет назад. Мне пришла в голову идея, которую я решил развить: что бы произошло, если бы история повернулась в другую сторону и персональные компьютеры с самого начала пошли по пути использования множества процессоров? Даже в 1980-х процессоры и оперативная память не были дорогими, но многозадачность компьютера была основана в первую очередь на разделении задач на небольшие части, а большие ресурсы ЦП и памяти распределялись между конкурирующими программами. . Оборудование не очень хорошо работало с этим режимом временного разделения, и было слишком сложно заставить программы нормально работать в таком режиме, например, в среде DOS. Но затем настала эпоха 386 компьютеров с более чем 4 МБ оперативной памяти.
Занимаясь этим своим историческим хобби, я наткнулся на кое-что очень интересное: на ранних этапах разработки ОС CP / M также существовала сетевая версия CP / NE. Идеи в нем известны и сегодня: в офисе размещается одна-две мощные машины с большими дисками и принтерами, ресурсы которых разделяют тонкие клиенты — терминалы со своими слабыми процессорами и небольшим объемом памяти. В этом случае каждый пользователь работает так, как будто у него есть собственная машина, на которой работает CP / M, у которой есть доступ к дискам и принтерам большой емкости.
Как я уже сказал, ЦП и ОЗУ (обычный Z80 шел с ОЗУ 64 КБ) были не очень дорогими, но все остальное для действительно полезного компьютера, такое как диски, принтеры и мониторы, стоило совсем недешево. В то время добавление нескольких ЦП / ОЗУ к одному компьютеру казалось декадентским подходом к предоставлению одному пользователю нескольких ЦП и ОЗУ. Фактически, даже CP / M пошел по пути использования временного разделения для MP / M OS.
Ближе всего к этой идее подошла компания Exidy, которая в 1981 году представила свою машину Multi-NET 80, на которой можно было разместить до 16 карт расширения, каждая со своим Z80 и RAM. Однако он был разработан для работы с 16 отдельными пользователями, а не с одним пользователем, который мог бы запускать 16 программ одновременно.
Забегаем на 40 лет вперед — транзисторы стали намного дешевле. После того, как лаборатория, в которой я работал, закрылась, я остался с несколькими довольно большими ПЛИС (Stratix IV 530GX) и задумался, что я могу с ними сделать. Однажды я наткнулся на очень интересный проект Гранта Сирла под названием Multi-Comp. Оказалось, что собрать рабочий компьютер с CP / M и одним процессором очень просто. Сразу решил попробовать свои силы и сделать многоядерную машину под управлением CP / M с реальной многозадачностью.
Программное обеспечение
В этом проекте я сосредоточился в основном на оборудовании и не написал ни строчки ассемблерного кода. Процессор с номером 0 загружается непосредственно из ПЗУ, которое я получил от Гранта, а другие модули загружаются из ПЗУ CP / NOS размером 4 КБ, которое я получил от эмулятора Atari.
Оба ПЗУ ожидают подключения к последовательному терминалу через стандартный интерфейс, а клиенты CP / NOS ожидают другого последовательного порта, подключенного к серверу. На таких больших ПЛИС, как моя, довольно легко спроектировать собственную логику. Я разработал собственную логику декодирования адресов, благодаря которой Z-Ring для каждого процессора занимает свое определенное место в адресации.
Внутри
Сердце ZedRipper — одна из огромных FPGA Stratix IV 530GX. Карта HSMC используется для дисплея, для приема данных с контроллера клавиатуры и с карты памяти SD. Для зарядки прошивки используется Ethernet, поэтому на боковой стороне корпуса есть такой разъем. Также есть адаптер SD-карты и слот для внешнего последовательного интерфейса, которые в настоящее время не используются.
Клавиатура и контроллер для нее
В одном из моих старых проектов у меня была компактная клавиатура PS / 2, и я решил подключить ее к вводу-выводу 2,5 В на моей FPGA. Я решил выбрать более простой способ и использовал контроллер Teensy 2.0.
Таким образом, появилась возможность преобразовывать сигналы PS / 2 в символы ASCII, а также довольно легко помечать некоторые клавиши как функциональные (F1-F12) с помощью команд терминала, что удобно. Этот контроллер подает на Z80 серию байтов через UART со скоростью 9600 бод (с простым делителем напряжения, который выдает 2,5 В для FPGA от 5 В).
Дисплей
Я использую 10,1-дюймовый дисплей с разрешением 1280х800 и интерфейсом VGA. FPGA использует простую сеть резисторов для получения 64 цветов (R2G2B2). Для дисплея требуется таймер с частотой 83,33 МГц (1280 × [защита электронной почты]), и для простоты вся система работает с этой тактовой частотой.
В проекте Grant Multicomp есть код VHDL для очень простого ANSI-совместимого терминала. Я перенес его логику в Verilog, а затем разработал видеоконтроллер с поддержкой 16 независимых терминалов, подключенных через Z-Ring. Дисплей с разрешением 1280×800 пикселей можно рассматривать как дисплей размером 160×50 символов со шрифтом 8×16 пикселей, и каждый из этих терминалов работает как спрайт размером 80×25, который можно перемещать в любое место на экране. ваш список приоритетов, с помощью которого вы можете настроить способы рисования и отображения.
А поскольку каждый терминал работает независимо от других, он имеет собственный конечный автомат и 2 КБ ОЗУ для символов и 2 КБ ОЗУ для атрибутов (информация о цвете, мигание и т. Д.). Каждый символ имеет 4-битный цвет фона и 4-битный цвет символа. А поскольку все терминалы должны иметь одинаковые отступы, а в «ячейке» 8×16 может быть только один символ, все терминалы могут использовать одно и то же ПЗУ размером 2 КБ, в котором написан шрифт. Таким образом, для логики отображения используется около 66 КБ ОЗУ.
В общем, это оказался очень простой оконный менеджер для моих CP / M терминалов, который почти полностью работает только на аппаратном уровне. Это одна из самых богатых областей для исследования. На данный момент только сервер может перемещать терминалы в разные места, но у меня большие планы по добавлению устройства позиционирования, такого как компьютерная мышь, которая перемещает оборудование только аппаратно и выполняет другие аналогичные действия.
Z-кольцо
Как можно подключить и работать вместе большое количество процессоров Z80? Там, где я работаю, я понял одну важную вещь: создание сетей — это сложная задача. Общие цели сети, которую я разрабатываю для этих Z80, заключаются в следующем:
- Простая реализация
- Упрощенный интерфейс
- Произвольное масштабирование
- Адекватная скорость
Как я уже упоминал, мои Z80s ожидают подключения к последовательным портам, и создание правильного интерфейса оказалось простым: его нужно было замаскировать под стандартный последовательный интерфейс. Фактически Z-Ring — это синхронная кольцевая сеть с односторонним движением, которая использует токены для управления общим потоком. Каждый узел в этой сети имеет 1-байтовый буфер для каждого из других узлов в сети. Вначале каждый узел имеет по одному токену для каждого из других узлов. Эта схема легко масштабируется до сотен узлов, добавляя очень мало логических элементов, и сегодня мое Z-Ring поддерживает до 32 узлов, поэтому для каждого узла требуется 32-байтовый буфер.
Шина этой сети использует идентификатор источника, идентификатор приемника и 1-байтовую полезную информацию. Это можно легко сделать с помощью логики TTL, если у вас нет под рукой FPGA. Каждый узел этой сети имеет 2 контейнера для триггеров шины. Сообщения (полезная информация) передаются исходному узлу и перемещаются по кольцу, пока не найдут пункт назначения. Когда сообщение получено, соответствующий токен отправляется, и все может начаться заново. Если сетевой пакет отправляется на несуществующий адрес, токен выдается автоматически, когда пакет совершает полный круг.
В этой сетевой схеме для доставки каждого сообщения требуется не более 2 * (количество узлов) цикла. Моя реализация использует 17 сетевых узлов (15 процессоров плюс контроллер дисплея), а цикл таймера составляет 12 наносекунд. Следовательно, для отправки сообщения и возврата токена требуется около 400 нс. Получается, что каждый процессор имеет пропускную способность 2-2,5 Мбит / с (шина достаточно быстрая для всех 16 процессоров), и это довольно быстро для терминалов.
Блок питания
ПЛИС требует от 12 до 20 В, дисплею — 12 В, а клавиатуре и контроллеру — 5 В. Я решил подключить микросхему FPGA напрямую к литий-полимерному аккумулятору емкостью 5000 мАч и напряжением 14,4 В. Удобно, что В ПЛИС есть стабилизаторы на 3,3, 5 и 12 В, и естественно было использовать эту микросхему для распределения напряжения.
В моих путешествиях батарея длится 3 часа без каких-либо проблем, но видно, что она легко может работать без каких-либо оптимизаций 6 часов. Но такой способ подключения не позволяет использовать и заряжать компьютер одновременно, что для меня не проблема.
Скорость
Думаю, есть тесты скорости специально для CP / M, но я не пытался их найти. С тех пор как я собрал этот компьютер на Turbo Pascal, я провел свои собственные тесты. Я получил 15-35 000 операций с плавающей запятой в секунду, используя 48-битное Real в Turbo Pascal, и 1 миллион целочисленных операций в секунду, используя 16-битное Integer. Неплохо для 8-битного процессора с достаточно комфортной средой программирования.
В будущем он может разработать ускоритель для операций с плавающей запятой.
Собранный таким образом компьютер мне очень нравится. Экран хороший и все хорошо видно. Клавиатура удобная, аппарат помещается в рюкзак, с которым я езжу на работу и обратно.
Но главное другое. Думаю, я на правильном пути. Возможность открыть текстовый редактор в окне программы и в то же время оптимизировать код с помощью отладчика Turbo Pascal чрезвычайно удобна. Я даже могу записывать свои идеи, играя в Zork. Действительно, такой подход к созданию недорогих многозадачных компьютеров с CP / M может оказаться чрезвычайно успешным. История компьютеров действительно могла пойти другим путем. Как вы думаете?