В первой статье посвященной самодельному 8-разрядному компьютеру я рассказал о том ЗАЧЕМ вообще собирать подобный компьютер в настоящее время. хотя собирать или нет - каждый вправе решать сам. Во второй части расскажу о компьютере более подробно
Концепция
Даже в наше время разработок восьмиразрядных компьютеров достаточно много. Это и клоны известных компьютерных марок, например ZX Spectrum, широко распространённых в конце 80-х годов, в журнале "Радио" описана блестящая разработка Василия Лисицына, многочисленные разработки на основе готовых процессоров и микроконтроллеров в роли контроллеров периферии, проект THE $4 Z80 SINGLEBOARD COMPUTER и т. п. Сеть Интернет позволяет найти много интересных примеров и проектов.
Эти разработки прекрасно справляются с поставленными задачами, но у них есть и общий недостаток: изначально взятая за основу платформа на первых порах является преимуществом, но по мере расширения спектра задач потихоньку становится "узким местом", ограничивающим полёт фантазии. А хочется иметь полноценный компьютер с разумной поддержкой стандартной периферии, прозрачной внутренней архитектурой, легко модифицируемый отдельными блоками и с открытым кодом. Предлагаемая разработка направлена на то, чтобы заполнить эту "нишу".
Сформулируем базовые требования, которые были положены в основу разработки:
— полностью восьмиразрядная архитектура, никакого "шаманства" в части оверклокинга и т. п., полное соответствие стандартам и протоколам поддерживаемых устройств;
— максимально возможная унификация со стандартными и доступными на сегодняшний день периферийными устройствами и методами передачи и хранения данных;
— модульная внутренняя архитектура с внутренней стандартизацией шин и протоколов;
— программная архитектура, включающая поддержку стандартных процессоров (на уровне эмуляции), операционных систем, совместимости с реальными устройствами для лучшей переносимости программ.
После многочисленных экспериментов, критического анализа требований и доступных опций была определена следующая архитектура:
— базовая эмуляция процессора Z80 и поддержка ОС СР/М;
— системное ОЗУ объёмом 64 Кб показалось достаточным;
— видеоадаптер VGA в монохромном буквенно-цифровом режиме (почему именно так — об этом дальше);
— поддержка клавиатуры PS/2 и, желательно, мыши;
— коммуникационный интерфейс RS-232 и, желательно, Ethernet для работы с простыми протоколами;
— использование SD-накопителя для хранения данных.
Общая посылка была простая: можно стараться сделать относительно быстрый компьютер с какой-то графикой, с USB- хостом и т. п., но зачем? Такая разработка по определению не будет простой и понятной либо будет сильно ограниченной функционально. А вот простой компьютер с классической архитектурой будет куда интереснее, проще и полезнее. Реальных возможностей у такого устройства, на самом деле, гораздо больше.
Таковы были базовые предпосылки разработки. В качестве вычислительной базы выбор остановился на микроконтроллерах семейства AVR как надёжной и честной восьмиразрядной платформе, а интерфейсы реализованы на базе стандартных специализированных микросхем.
Отдавая дань временам, когда такие устройства были популярны, устройство изначально разрабатывалось под DIP-компоненты, но все элементы имеют SMD-исполнение или функциональные аналоги для поверхностного монтажа, поэтому портирование не составит труда. Но монтаж выводных элементов проще и легче для большинства не слишком опытных любителей плюс не требует специализированного (и дорогого) оборудование вроде паяльной станции с феном и микроскопа. Кроме этого, важно, чтобы аппаратная часть была легко тиражируемой, лёгкой в повторении (при желании даже в домашних условиях) платой, устанавливаемой в легко доступный на рынке корпус и иметь "товарный" вид.
Компьютер КРИСС
Прежде чем продолжить, немного поговорим о терминологии в статье, а именно — о терминах "программный" и "аппаратный". Далее по тексту подразумевается, что все функции, реализованные на уровне "базовых" микропрограмм для МК, считаем "аппаратными". "Программными" будут называться функции, которые можно реализовать на уровне специальных "пользовательских" программных блоков на языке программирования AVR или в программе, выполняемой под эмулятором центрального процессора.
В результате устройство, получившее название "КРИСС СР/М", разместилось на одной плате размерами 10x13 см, выполнено в формате моноблока и имеет следующие параметры:
— система команд: z80 (Zilog) в режиме эмуляции, расширенная, скорость выполнения команды регистр— регистр 1 мкс;
— память: статическое ОЗУ 64 Кб, системное ПЗУ 128 Кб, буферный банк ОЗУ 2 Кб;
— видеоадаптер: VGA, 640x480 точек, монохромный, буквенно-цифровой с разрешением до 25x80 символов;
— внешний накопитель: SD-карта, программная поддержка стандартных образов дискет;
— часы реального времени;
— аппаратная поддержка клавиатуры PS/2;
— коммуникационные интерфейсы: RS-232, системный UART;
— контроллер Ethernet;
— однотональный синтезатор мелодий с памятью, встроенным усилителем и динамической головкой;
— поддержка GPIO (до 128 линий ввода/вывода, внешний блок расширения) или указателя мыши PS/2;
— операционная система СР/М версии 2.2 и выше.
Компьютер питается от сети переменного тока 230 В, потребляемая мощность — не более 5 Вт. На компьютере работают практически все программы, написанные под "чистую" СР/М, в частности программы, написанные для очень популярного в СССР компьютера Robotron 1715. Но предусмотрена возможность и эмуляции платформеннозависимых особенностей.
Структурная схема
Компьютер построен по стандартной, в общем-то, схеме: центральный процессор (ЦП) реализован на микроконтроллере (МК) ATmega1284P ,контроллер периферии — на МК ATmega328, контроллер VGA — на двух МК ATmega328 и ATtinyl 3, контроллер Ethernet — на специализированной микросхеме ENC28J60 (Microchip), часы реального времени — на DS1305 (Dallas Semiconductor). Внешнее ОЗУ 64Кх8 —W24512 (Winbond). Внутренняя шина — SPI. Общая структурная схема компьютера показана на рис. 2.
Сразу сделаем оговорку, что функциональная схема не соответствует один к одному набору микросхем: так, например, микросхема центрального процессора исполняет частично функции контроллера периферии, а микросхема контроллера периферии является, кроме прочего, частью VGA-koht- роллера. По ходу описания это распределение будет раскрыто подробно.
Несколько слов о том, почему было решено ограничить себя такими скромными, на первый взгляд, рамками. Ответ "в целом" — этого на самом деле более чем достаточно для решения 80 % реальных задач, а конкретно было принято во внимание следующее:
— расширение ОЗУ для "не игровых" задач большого смысла не имеет: для работы ПО СР/М 64 Кб вполне достаточно, нет сложностей с выбором страниц, а кроме того, в этом компьютере реально в распоряжении разработчика гораздо больше памяти, чем на стандартном СР/М устройстве, о чём поговорим в разделе про типы и организацию памяти;
— полноценная графика требует большого объёма видео-ОЗУ (посчитайте хотя бы для режима 640x480x16 цв.) и реально (игры и просмотр картинок исключаем) требуется больше для отображения специальных символов (сразу вспоминается компьютер "Микроша"), что в данном случае было решено другим путём (см. раздел про видеоадаптер);
— монохромность, на самом деле — это разумная достаточность, а кроме того, она имеет как минимум два преимущества: позволяет сконцентрироваться на содержании, а не на оформ, а кроме того, она имеет как минимум два преимущества: позволяет сконцентрироваться на содержании, а не на оформлении (не секрет, что, набирая текст в Word'e, часто больше думают, что и как выделить, чем над содержанием) и сильно упрощает работу программиста, сокращая при этом программный код и улучшая производительность. Для учебного компьютера это то, что надо. Реализация атрибутов к тому же ведёт либо к появлению пустых символов на экране, либо при скрытых символах атрибутов разрушает организацию видеопамяти. Но, при желании, это можно добавить, о чём будет разговор далее.
Общая схема может показаться несколько усложнённой, но так сложилось по ходу разработки: все МК работают на пределе возможностей, дальнейшая оптимизация и объединение задач выглядела уже нецелесообразной.
Рассмотрим блоки и элементы схемы подробнее.
Принципиальная схема
Устройство содержит встроенный блок питания (внутреннее напряжение — 5 В), набор внешних коммуникационных разъёмов и индикаторных светодиодов. Индикаторные светодиоды подключены аппаратно и отображают физический доступ к соответствующему интерфейсу. Отдельные части и компоненты описаны дальше в статье.
Питается компьютер от модульного преобразователя, установленного на плате. Блок имеет выходную мощность 5 Вт, обеспечивая максимальный выходной ток 1 А.
Примерное потребление модулей
- Микроконтроллеры и вспомогательная логика 100 мА
- ОЗУ 200 мА
- SD-карта в режиме чтения/записи 50/100 мА
- Контроллер Ethernet в режиме покоя / передачи 50/250 мА
- Синтезатор мелодий при воспроизведении 70мА
- Клавиатура 150 мА
Загрузка источника питания близка к предельной, поэтому при использовании коммутационных цепей на плате GPIO рекомендуется использовать внешнее питание. В случае, если при повторении устройства что-то будет изменено и добавлены, например, цепи работы с манипулятором мышь, синтезатор мелодий и пр., от встроенного блока питания можно отказаться, использовав с пользой освободившееся место.
Цепи питания платы защищены самовосстанавливающимся предохранителем F1 на 1,1 А, а для обеспечения качества питания содержат дополнительный фильтрующие цепи — дроссель L1 и расположенные на плате конденсаторы. Два разъёма на плате позволяют в режиме отладки питать устройство от внешнего источника стабилизированного напряжения питания 5 В (рекомендуемая мощность источника — не менее 10 Вт, соответственно ток — 2 А).
Выключатель питания устанавливают на питающем проводе. Желающие могут разместить выключатель на лицевой панели устройства, но в низковольтной части, включив его вместо предохранителя или фильтрующего дросселя, — есть возможность вместо дросселя установить контактную группу. Но реальной надобности в этом нет, поскольку сброс компьютера реализован аппаратно на уровне контроллера клавиатуры.
Учитывая, что модуль питания работает практически на пределе, при его монтаже необходимо оставить зазор 1...2 мм до поверхности платы, а контактные площадки, на которых присутствует высокое напряжение, рекомендуется изолировать термоклеем. Также следует изолировать термоклеем оголённые части терморезистора мягкого старта RK1, выступающие со стороны установки элементов.
Вход RESET МК ЦП имеет цепь формирователя сигнала стартового сброса DR2.1 и С1, все входы RESET имеют внешние подтягивающие к плюсовой линии питания резисторы. Кроме этого, все сигналы контролируются управляемыми программно цепями: МК ЦП имеет возможность сформировать сигнал сброса контроллеру внешних устройств (КВУ) и, наоборот, КВУ формирует сигнал сброса МК контроллера VGA, контроллер VGA — блока формирователя синхроимпульсов.
В системе задействовано несколько источников тактовых сигналов. ЦП, МК КВУ и основной МК контроллера VGA работают на частоте 20 МГц, которую формирует МК КВУ (кварцевый резонатор ZQ2), это линия 15 жгута, сигнал выведен на контрольную точку КТ1 "F". Микросхемы формирователя синхроимпульсов VGA и контроллер Ethernet имеют собственные источники тактовых частот 25,175/2 МГц (G1) и 25 МГц (ZQ3) соответственно. Кроме того, часы реального времени имеют собственный низкочастотный кварцевый резонатор ZQ1. Подробнее см. описание конкретных узлов.
Рассмотрим узлы и элементы подробнее.
Системная шина
Внутренняя системная шина последовательная SPI — Serial Peripherial Interface. Это синхронная четырёхпроводная шина передачи данных типа мастер—ведомый, в которой линии разделены функционально:
— CS — линия выбора устройства Chip Select, своя для каждого ведомого устройства;
— SCK — System Clock, линия тактирующих импульсов, общая для всех устройств, импульсы всегда формируются мастер-устройством;
— MOSI — Master Out Slave In — шина передачи данных от мастер-устройства к выбранному ведомому устройству, общая для всех устройств, управляется мастером;
— MISO — Master In Slave Out — шина передачи данных от выбранного ведомого устройства к мастеру, захватывается ведомым устройством при выборе последнего.
Протокол SPI относится к категории общепринятых протоколов без жёсткой спецификации. Общий принцип работы шины показан на Выбор устройства осуществляется сигналом SS, по сигналу тактового импульса передаются данные по шинам MOSI и MISO. Обратите внимание, что передача данных в обоих направлениях идёт параллельно. Существуют несколько вариаций работы шины в зависимости от полярности тактового сигнала и направления фронта выборки, их обсуждать не будем, отметим только, что в этой разработке все устройства работают в режиме "О", как на рисунке: полярность импульсов положительная, рабочим является нарастающий фронт тактового импульса. Рабочая частота шины зависит от возможностей ведомого устройства. Размер фрейма — всегда восемь бит.
Ведомые устройства подключены через диспетчер, выполненный на дешифраторе "3 в 8" на микросхеме 74НС138. Эта микросхема выбрана по нескольким причинам:
— активный уровень — низкий, что является стандартным для большинства ведомых устройств;
— несколько входов разрешения работы;
— в состоянии "запрета" вывода на всех выходах поддерживается высокий уровень, что позволяет не подключать подтягивающие резисторы.
Микросхема диспетчера управляется сигналами выбора адреса ВАО—ВА2 МК ЦП и двумя сигналами разрешения /СЕ: один — с выхода CS штатного интерфейса SPI МК (мастер-устройст-ва) и отдельного сигнала разрешения шины. Это необходимо, поскольку выводы управления шиной SPI объединены с адресной шиной доступа к ОЗУ и требуется разделение режимов работы.
Кроме задачи выборки устройств, диспетчер отвечает за некоторые дополнительные задачи, которые нужны, но выводов МК не хватило: управление системным индикатором HL3 "SYS", звуковым оповещателем НА1, формирование сигнала сброса МК контроллера периферии. Оповещатель — электромагнитный co встроенным генератором, подключён через эмиттерный повторитель на транзисторе структуры PNP VT1, поскольку потребляемый им ток — около 20 мА.
Назначение сигналов шины и назначение выводов ЦП приведены на рисунке
Выводы CS, SCK, MISO, MOSI используются также при ISP-программировании микроконтроллера, поэтому выведены (вместе с сигналом сброса /RESET) на наплатный разъём ХРЗ. Особенности его использования будут описаны в разделе про программирование устройства.
Номера устройств шины приведены на рисунке. Обратите внимание, что для упрощения платы разводка выполнена так, что логический номер устройства, т. е. номер, выставляемый на шину при выборе устройства, не совпадает с номером физического выхода микросхемы диспетчера. Для управления важен именно логический номер устройства, номер выхода микросхемы диспетчера приведён для лучшей ориентировки на схеме.
ОЗУ
Системное ОЗУ выполнено в виде отдельной микросхемы статического ОЗУ объёмом 64 Кб DS1. Применена микросхема W24512A производства Winbond. Причины выбора этой микросхемы:
— паспортное время полного цикла чтения (выборка адреса плюс отработка сигнала разрешения выхода) от 30 нс (для индекса W24512А-15) до 70 нс (для микросхемы с индексом 35);
— микросхема выпускается в компактном 32-выводном корпусе DIP300;
— легко доступна для приобретения.
Для МК, работающего на частоте 20 МГц, время одного такта равно 50 нс, что должно обеспечивать работу без потери производительности. По факту всё оказалось немного хуже, но не сильно.
Микросхема ОЗУ подключена к МК напрямую, без использования регистра-защёлки, и работа с памятью организована на аппаратном уровне без использования штатных механизмов МК AVR. Такой подход выбран по соображениям упрощения разводки платы и не очень удобной логики работы штатного механизма. Кроме этого, в таком формате память программ эмулятора процессора и внутренней микропрограммы разделена физически, что упрощает логику микропрограмм.
Для работы с ОЗУ выделены три полных порта центрального МК: порты РА и PC как адресные шины и порт РВ как шина данных, объединённый с шиной SPI. Дополнительно задействованы две команды управления: разрешение вывода при операциях чтения /ОЕ (порт PD4) и команда записи /WE (порт PD5). Эти выводы соединены с плюсовой линией питания через внешние резисторы, поскольку при их отсутствии микросхема ОЗУ может по случайным наводкам выводить что-то на шину данных и сбивать процессы ISP-программирования МК. Сигналы выбора кристалла не использованы и установлены в состояние "выбрано". В случае модификации устройства с целью расширения памяти они могут быть задействованы для переключения между банками. Выбранная микросхема имеет сигналы выборки разной полярности, что позволяет переключаться между двумя микросхемами одним сигналом без дополнительной логики.
Цикл работы с памятью включает в себя следующие операции:
— выставить старший байт адреса (один такт);— выставить младший байт адреса (один такт);
— выставить направление порта данных (один такт);
— установить сигнал /ОЕ (один такт);
— прочитать данные из порта данных (один такт);
— снять сигнал /ОЕ (один такт).
Предполагается, что сигнал /ОЕ формируется выводом предустановленного значения в порт, а не командой cbi/sbi, поэтому посчитан как один такт. На практике оказалось, что для стабильной работы микросхемы необходимо добавить минимум один такт после выборки адреса и один такт после установки сигнала /ОЕ. Возможно, это было связано с конкретной партией микросхем, поскольку контроль сигналов показал идеальную форму всех фронтов. Из-за этого цикл чтения занимает восемь тактов вместо теоретических шести. Но это в реальности не влияет на общую производительность, в этих тактах выполняются вспомогательные операции, например инкрементирование счётчика команд.
Накопитель на SD-карте
Приятная особенность накопителя на SD-карте в том, что он умеет работать по протоколу SPI, благодаря чему использовано стандартное подключение к системной шине.
Само подключение накопителя (на схеме обозначен как разъём XS1) особенностей не имеет. Он питается от отдельного стабилизатора DA1 (78L33), для контроля работоспособности предусмотрена контрольная точка КТ2 "3,3 В". Для сопряжения с уровнем основной платы установлены диоды сопряжения VD3—VD5, а выводы карты соединены резисторами с линией питания +3,3 В. Вывод MISO (DO) подключён напрямую, поскольку в большинстве случаев он имеет выход с открытым коллектором и не требует преобразователя. Тем не менее встречаются карты, у которых выход DO внутри соединён с плюсовой линией питания, это немного повышает напряжение питания примерно до 3,9 В, но работоспособность карты при этом сохраняется.
В устройстве применён простой, не совмещённый держатель SD-карт, имеющий десять рабочих выводов и размер от выводов до края около 25 мм, обратите на это внимание. Рекомендуется использовать нажимные "push-push” держатели ATTEND 104D-TCC0-R06, эти устройства хоть и дороже обычных, но имеют высокое качество. Альтернативно можно применять более простые держатели HTB1TK9DHF, в ассортименте продающиеся на aliexpress, но удобство работы будет ниже. Плата разработана с учётом обеих модификаций.
Контроллер SD-накопителя поддерживает все виды карт, но рекомендуется использование карт небольшого объёма, автор использует карты 128 Мб. На карте хранятся данные по начальной загрузке системы (блоки по 64 Кб) и образы дисков (дискет) в соответствии с настройками выбранной ОС, максимальный размер дискеты — 2 Мб. Типичный для СР/М диск имеет размер 819 Кб. Структура SD-карты будет описана в разделе по программированию устройства. Программирование карты выполняется через специализированное приложение под ОС Windows.
В этой версии работа с картой имеет ряд особенностей:
— предполагается, что весь сеанс работы идёт с одной картой, замена предусмотрена только при начальной (стартовой) загрузке;
— для пользовательских программ доступ к данным SD-карты ограничен стандартным адресным блочным доступом к 128-байтным секторам образов дискет, возможность доступа к карте на физическом уровне отсутствует.
Есть, конечно, возможность обойти эти ограничения, но уже на уровне системного программирования. В процессе работы есть возможность "менять дискеты в дисководах" через системную консоль.
Контроллер работы с картой реализован програмно на уровне микропрограммы МК ЦП, передача данных осуществляется через внутренний буфер размером 512 байт в ОЗУ МК с прямым доступом к внешнему ОЗУ (режим DMA). Контроллер выполняет следующую последовательность команд (упрощённо):
— инициализация: 80 импульсов wakeup — CM D00 — CMD08 — CMD58 — ACMD41 — CMD58;
— чтение: CMD17 — DATA;
— запись: CMD24 — DATA.
Стандартный размер блока для SD-карты — 512 байт, в то время как стандартный сектор СР/М — 128 байт. По этой причине введена буферизация на уровне ОЗУ МК, например, при чтении считывается сразу 512 байт, далее, если запрашиваемый сектор принадлежит блоку, чтение не производится. При записи сначала читается блок 512 байт, корректируется сектор 128 байт и записывается обратно.
Часы реального времени
Часы реального времени (RTS) выполнены на специализированной микросхеме DS1305, поддерживающей работу по SPI-шине (при установленном высоком уровне на выводе SM), и стабилизированы отдельным кварцевым резонатором 32768 Гц (ZQ1).
Несколько особенностей, которые нужно иметь в виду.
Эта микросхема имеет встроенные конденсаторы для резонатора и рассчитана на кварцевые резонаторы ёмкостью 6 пФ. На практике дешёвые резонаторы редко обеспечивают приемлемую точность хода, помочь может либо установка резонатора от неисправной материнской платы, либо можно попробовать улучшить точность дополнительными внешними конденсаторами ёмкостью 2—14 пФ (С17, С18), на схеме они показаны штриховыми линиями .
Выводы /INTx с низким рабочим уровнем объединены по схеме ИЛИ диодами VD1, VD2, они формируют сигнал /INTC (PD6) МК ЦП (см. раздел про прерывания). Микросхема ЧРВ имеет нестандартный, высокий уровень сигнала выбора CS, поэтому подключена к диспетчеру устройств SPI через инвертор микросхемы DD3 (74НС00).
Для работы часов при отключённом питании предусмотрен резервный элемент напряжением 3 В. Печатная плата рассчитана на установку элемента питания CR2032 SLF или аналогичных. Можно установить вертикальный держатель KLS5-CR2032-04, но высота корпуса буквально на 1 мм не позволяет использовать стандартные элементы CR2032. В качестве решения можно немного профрезеровать крышку корпуса или использовать элемент меньшего диаметра CR1632, зафиксировав его небольшим куском термоусаживаемой трубки. Как альтернативный вариант, на плате вместо держателя можно установить контакты и подключать внешний элемент с проводными выводами.
Микросхема DS1305 имеет возможность использовать в качестве резервного перезаряжаемый источник питания, у неё есть внутренние цепи для его подзарядки. Такие аккумуляторы подключают к выводу VCC2. Например, можно применить литий-полимерные серии LP40*** напряжением 3,7 В. При желании идти по такому пути на плате предусмотрена возможность установки контактов для подключения батареи, но нужно будет перерезать дорожку, соединяющую контакты VCC2 и GND, и установить перемычку в отверстия для подключения обычного элемента. Подробнее об этом можно прочитать в документации на микросхему.
В этой конструкции микросхема RTS использована не только как часы, но и как системное ПЗУ объёмом 96 байт, которое используется для хранения системных настроек, в частности МАС-адреса устройства. Эта память считывается при загрузке устройства, и данные доступны прикладным программам.