четверг, 31 декабря 2020 г.

Cobalt-68 История проекта

Предыдущая заметка: Cobalt-68: Предыстория проекта
Проект на GitLab: https://gitlab.com/alkid1/cobalt68

Проект по созданию компьютера занял у меня почти три года неспешной работы с большими перерывами. Это был увлекательный квест воина паяльника и клавиатуры, который научил меня многому в отношении создания систем. Особенностью этого проект является то, что я одновременно создавал и отлаживал и аппаратную и программную части системы, которые очень тесно связаны между собой. И если с программной частью для меня всё было более-менее понятно (жизнь в этом смысле меня изрядно покидала, поэтому я не боюсь ассемблера и железа), то разработка и отладка аппаратуры для меня во многом оставалась полем поисков и экспериментов.

Подготовка и заточка инструмента

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

И так, чем же я вооружился для того, чтобы одолеть все трудности? Здесь я опишу аппаратный инструментарий, про мои приключения в разработке программ будет написан отдельный эпос.

Инструментарий проектирования

Начинать разработку надо с проектирования схемы. Раньше мне хватало бумаги, но теперь я решил освоить какую-нибудь CAD-систему. Я перебрал несколько разных вариантов программ, но в итоге остановил свой выбор на онлайн-сервисе EasyEDA. Он привлёк меня своей простотой в работе и отсутствием необходимости устанавливать программу на свой компьютер. Бесплатный аккаунт даёт достаточно возможностей для неискушённого пользователя: можно  рисовать схемы, разводить платы и заказывать их у производителя. Возможно, в будущем я перейду на какой-нибудь Proteus, но пока меня полностью устраивает и этот инструмент.

TIP: При пайке с тыльной стороны платы очень удобно иметь схему, зеркально отражённую по вертикальной оси, тогда на ней расположение контактов у микросхем будет таким же, как и при взгляд с тыльной стороны платы. Это очень сильно облегчает процесс пайки проводков при макетированнии. EasyEDA позволяет получить такую схему с небольшим количеством усилий.

TIP2: EasyEDA имеет функцию автороутинга - автоматической разводки печатных плат. Но доступный в облаке роутер часто бывает недоступен из-за перегрузки. Редактор даёт возможность развернуть роутер локально и использовать мощности компьютера. Очень рекомендую сделать сделать это сразу.

Логический анализатор

Внутри компьютера очень много разных линий соединения по котором с частотой в несколько мегагерц бегают туда-сюда сигналы. Чтобы понять, как работает система, и что в ней не так. надо уметь заглянуть "внутрь"  этого процесса. Отладку предыдущих схем я осуществлял при помощи светодиодов и режима ручного тактирования. Это адски трудоёмкий способ. 


К счастью, есть устройства, позволяющие заглянуть внутрь системы - это логические анализаторы (иногда их называют шинными анализаторами). Доступные в российских магазинах системы неприятно удивляют своей ценой. К счастью есть китайцы и сделанные ими клоны, которые можно приобрести за вполне разумные деньги. Я выбрал Saleae Logic-16 - 16-канальный анализатор с подключением к компьютеру через USB. У него нет многих функций дорогих профессиональных моделей, зато его можно купить за 2500 рублей (на момент написания заметки).

Среди полезных фишек его программного обеспечения - возможность декодирования некоторых протоколов из данных о перехваченных сигналах. Мне очень помогла возможность декодировать UART, SPI, и просто параллельные шины данных.

Программаторы

Микроконтроллер и ПЗУшки компьютера надо чем-то программировать. Традиционно я использовал свой старый добрый WizardProg 87i (российская нелицензионная копия китайского(!) программатора TL866 MiniPro). Он умеет и в параллельное программирование и в ISP-программирование, но его программная оболочка не умеет выполнять операции из командной строки. Без этого заливка прошивки становится операцией в несколько ручных действий. 

Чтобы закрыть этот "пробел" я прикупил копеечный USBAsp 2.0, который можно использовать с утилитой AVRDude. Запуск этой утилиты можно прописать в External Tools в Atmel Studio и прошивать микроконтроллер в один клик.

Паяльная ванна

Предыдущий эксперимент с Z80 показал, что компьютер на макетной плате - это крайне нежное создание, которое имеет тенденцию отказывать в самые неожиданные моменты из-за плохих контактов. Очень увлекательно было несколько раз убить часы на поиск ошибки в программе только чтобы понять, что одна из ножек микросхемы плохо контачит. Поэтому я решил, что в этот раз макетировать буду сразу с использованием перфорированных макетных плат для пайки. 

Чтобы спаять более-менее сложную схему и не получить комок лапши на плате, надо использовать очень тонкий провод. Для этого идеально подходит МГТФ с сечением 0.03 мм. Он тонкий, гибкий, не ломается. Его тефлоновая изоляция хорошо выдерживает нагрев и при пайке не оголяет лишнего провода. У этого провода есть один большой недостаток - его ну ОЧЕНЬ муторно зачищать руками, обычные стрипперы его не берут. 

В качестве выхода подсмотрел в интернете идею использования паяльной ванны. При правильно подобранной температуре достаточно окунуть конец МГТФ в флюс и потом в расплавленный припой, чтобы за один раз зачистить и залудить кончик, подходящий для припаивания к ножкам микросхемы. Это позволяет в два движения сделать то, что без ванны потребует целой серии ручных операций. 

Первые эксперименты

Дождавшись из Китая и ЧипДипа комплектующих и инструментов, я собрал несколько простейших схем с новым процессором на макетной плате. Для микроконтроллеров своего рода аналогом "Hellow World" является мигающий светодиод ("Blinkenlights"), для мира самопальных компьютеров - это "холостой ход" процессора, когда он без всякой памяти циклически исполняет NOP-инструкции. Когда я увидел в логическом анализаторе заветные меандры сигналов на шине, я сел паять первую версию вычислительного ядра. 

Вид тыльной стороны платы при пайке МГТФ.
Оригинальные материнские платы не
сохранились, на фото - макет видеоадаптера
Задумка была простая - сделать плату с микросхемами, на которой будут разведены основные сигнальные пути, оставив возможность подключаться к каждому сигналу через штыревой разъем. Так появилась гибридная схема из паечной и контактной макетных плат. Этот подход позволил мне опробовать много идей, не гадая каждый раз, включится ли ранее работавшая схема, или нет. В этой схеме я ещё использовал в качестве системного контроллера старую добрую Atmega32, но уже в тот момент мне стало понятно, что для нормальной системы потребуется намного больше сигналов.

На одном из этапов работы я бился с непонятным сбоем системы при обращении к памяти. Логический анализатор показывал полную чушь, а я не мог понять что к чему. Проверки пайки показывали, что всё, вроде бы, в в норме. Только дотошный прозвон контактов на замыкания показал, что две сигнальные линии замкнуты. И только потом с лупой наотсвет я почти случайно увидел тонюсенькую ниточку припоя, соединившую соседние контакты.
 
Новый микроконтроллер и новые амбициозные цели - подключение SD-карт - заставили меня перейти на следующий этап проекта и начать паять более полную схему на большой паечной макетной плате. Этот этап проекта стал для меня большим разочарованием - потратив много часов на кропотливый ручной роутинг проводков по гигантской макетной плате, я в итоге пришёл к нестабильно работающей схеме. Что-то я такое хитрое умудрился сделать при пайке, но система более-менее стабильно заводилась, только если на плату в центре нажать пальцем и слегка её прогнуть.

Я перепробовал кучу шаманских плясок с перепайкой контактов и поиском плохих проводков, но тщетно - этот экземпляр был проклят духами и отказывался исправляться. Это было обидно вдвойне, так как я угрохал огромное количество ручного труда на эту схему. Разочарование было столь велико, что я даже всерьёз подумывал забросить проект целиком. 

Китай спешит на помощь

Этот неудачный опыт научил меня тому, что с кустарными технологиями пора завязывать. Лапша из проводов и всё такое - это не для настоящих пацанов, надо разводить и делать нормальную печатную плату. Для других своих проектов я уже начал осваивать ЛУТ-метод производства плат в домашних условиях, но здесь решил не рисковать. 

Поскольку я изначально проектировал всё в EasyEDA, у меня уже была принципиальная схема. Разобравшись с тем, как проектировать платы из ранее подготовленных логических схем, я заказал изготовление материнской платы в Китае. При проектировании платы я заложил несколько особенностей, которые облегчили дальнейшие эксперименты:
  1. Плату я разводил двухслойную, чтобы иметь возможность любую дорожку при необходимости точечно разорвать. Правда, мне пока это не потребовалось.
  2. Для основных сигналов я заложил штыревые разъёмы, чтобы можно было подключать логический анализатор и/или дополнительные схемы.
  3. Сразу заложил в схему шинную архитектуру, разъёмы для SD-карт, PS/2 разъём и достаточно сигналов, чтобы превратить контроллер ещё и в DMA-контроллер.
Тот самый погнутый рычаг ZIP-панели.
Ещё и развернул его на 180 градусов.
Бонусом можно видеть припаянный
проводок - обход ещё одной
ошибки в схеме.
Платы мне делали примерно месяц и обошлось это не очень дёшево -  из-за выбора двухслойной технологии платы получились весьма большие (иначе дорожкам места не хватало). Зато когда я смонтировал на новой плате все компоненты и запустил тестовую прошивку, она заработала с первого раза. Это было очень неожиданно после всех моих предыдущих упражнений с макетными платами и шаманским бубном.

Естественно, что я накосячил в схеме, а как иначе? Но самой смешной ошибкой стало то, что рычажок ZIF-панели для ПЗУ упирался в соседнюю микросхему, не давая полностью защёлкнуться. Это была настолько глупая и очевидная ошибка, но она стала возможной из-за того, что я слишком фокусировался на схеме и логике, упустив более комплексный взгляд на систему. К счастью, все ошибки я так или иначе сумел обойти, применив смекалку и грубую силу (да-да, этот рычажок я просто согнул). На этой плате я пока и продолжаю развивать проект, так как она в целом делает всё, что я от неё хочу. 

Отдельная весёлая история приключилась с платой видеоадаптера, которую я спаял для своего компьютера. Схема уже была ранее опробована на макетной плате, поэтому я не ожидал сюрпризов. Но, видимо, что-то забылось из-за долгого перерыва а работе над проектом, и я допустил одну маленькую ошибку, из-за чего схема не запускалась. Юмор ситуации был в том, что я перебрал почти все варианты "сложных" ошибок и даже собирал на стенде макеты, воспроизводившие корректную работу контроллера. На деле же оказалось, что я банально забыл про некоторые особенности микросхемы  программируемой логики и забыл задействовать ножку, которая включала бы выходные буферы запрограммированной схемы. И только после нескольких недель мучений, меланхолично перечитывая datasheet от этой микросхемы, я догадался, в чем проблема.

Но в конечном итоге, именно такие трудности на пути к решению вызывают потом франкенштейновский восторг ("It's alive!"), когда паззл складывается и схема начинает работать. Ради этой радости я и занимаюсь подобными проектами. О том, что именно у меня получилось в результате этих стараний, я расскажу в следующей заметке. А пока всех с наступающим 21-ым годом!




пятница, 25 декабря 2020 г.

Cobalt-68: Предыстория проекта

С момента прошлой публикации, посвящённой проекту самодельного компьютера, прошло уже три года, но я это время не терял даром, мой проект не стоял на месте. За это время я успел поменять концепцию, преодолеть кучу технических сложностей, прокрастинации и нехватки времени, и добиться неплохого результата. О том, что именно удалось сделать за это время, я и хочу рассказать в цикле из нескольких заметок.

Предыстория

В прошлый раз мы остановились на том, что я создал макет комепьютера на базе классического процессора Z80 (точнее, его "осовремененного" CMOS-аналога). На тот момент у меня в планах было сделать полноценную компьютерную систему в стиле микрокомпьютеров 80-ых.  Моя дальнейшая работа в области компьютеростроения базировалась на этом проекте, но приобрела некотрый сюжетный поворот, о котором я хочу рассказать чуть подробнее.

Начну издалека. Как вы, безусловно, знаете мир настолько и серверного вычисления достаточно прочно занят x86-процессорами (хотя по общему количеству вычислительных устройств ARM-архитектура уже вышла на первое место, в основном за счёт мобильных и встраиваемых устройств). Эта архитектура названа в честь легендарного процессора 8086, вариант которого который был выбран IBM для создания своего персонального компьютера (об этом я писал ранее). Именно IBM PC дал этому процессору и его наследникам "путёвку в жизнь", обеспечив его архитектуре почётное лидерское место на многие годы. Что интересно, IBM PC дал путёвку в жизнь и другому важному феномену IT-индустрии - компании Microsoft.  Кто знает, как бы выглядела сейчас наша индустрия, сделай инеженеры IBM в тот момент другой выбор...

Intel 8080 - первый
культовый процессор
В IBM PC использовался процессор 8088 - "усечённый" вариант знаменитого 8086. Этот процессор был разработан на базе другого очень успешного процессора - 8085, который являлся усовершенствованной версией 8080, который, в свою очередь, развивал идеи, заложенные в самом первом в истории 8-битном микропроцессоре - 8008. 

Процессор 8080 ста
Фредерико Фаджин -
разработчик первого в мире
микропроцессора 4004
и первого 8-битного
процессора 8008
л иконой первой "гаражной" волны персоналок. Его разработчик -  Фредерико Фаджин - после этого проекта ушёл из Intel и основал собственную компанию Zilog, которая стала выпускать процессоры Z80. Этот процессор был развитием 8080, сохранив бинарную совместимость со своим "папой", и став ему прямым конкурентом.

Первые процессоры делались в условиях недостатка опыта и более жёстких технических ограничений, что привело к созданию "вычурной" архитектуры команд. Их потомки унаследовали эти "родимые пятна" первых шагов прогресса, добавив к ним дополнительные навороты для сохранения совместимости. Когда я начал глубже изучать ассемблер Z80 я всё больше и больше разочаровывался в его архитектуре и системе команд. По сравнению   с моей собственной разработкой (писал тут) it looked like a mess. Я ни в коем случае не претендую на превосходство в инженерном искусстве над Фараджем, мой проект был сделан с совершенно иными целями в условиях намного более доступных и мощных технологий. Тем не менее, моё эстетическое чувство оказалось оскорблённым и я решил поискать альтернативу.

Альтернатива была найдена в виде архитектуры Motorola 68000 (часто пишут M68K). Эта компания так же конкурировала за рынок 8-битных микропроцессоров со своей предыдущей серией 6800, хотя её процессоры не были так же популярны как Intel-овские. Разработка этого процессора началась в 1976 году. В отличие от Intel, инженеры Motorola нацелились на создание совершенно новой, более совершенной архитектуры без цели сохранить бинарную или идологическую совместимость с предыдущими наработками. В результате появился процессор MC68000 - 32-битный процессор с 16-битной шиной данных (напомним, его "сверстник" 8086 был 16-битным). Архитектура команд этого процессора очень изящна и элеганта. Видно, что её авторы изрядно вдохновлялись другой легендарной архитектурой PDP-11, которая до сих пор считается эталоном CISC-архитектур. 

DEC PDP-11
Этот процессор предоставляет очень удобную схему с шестнадцатью 32-битными регистрами (восемь для данных и столько же для адресов) и плоскую модель памяти с 32-битными адресами, разделение на пользовательский и супервизорский режимы, удобную схему 8-,16-,32-битных команд и другие хорошие вещи. Надо ли говорить, что я влюбился в этот процессор с первых страниц его datasheet`а, поэтому свой следующий проект я решил делать именно на базе этой архитектуры. 

IBM в рамках проекта IBM PC рассматривала вариант использования процессоров 68000-серии, но к тому моменту они ещё не были полностью готовы. Этот пример хорошо показывает, что оказаться в нужное время в нужном месте намного важнее, чем иметь технологическое превосходство. "Motorola, with its superior technology, lost the single most important design contest of the last 50 years"  Walden Rhines (link).

Тем не менее, разработки Motorola нашли своё применение в большом количество компьютерных изделий. Например, на них были основаны станции Sun Microsystems и некоторые продукты Apple. Благодаря этому сейчас нет проблем найти процессоры любой модели из этой линейки процессоров. 

В следующей заметке я начну подробный рассказ о своём проекте, а пока для затравки рекламное фото моего компьютера. Здесь вы видите систему с потрясающей тактовой частотой в 8 МГц, огромной памятью в 512 килобайт, текстовым видеоадаптером (цветным! поддерживает целых два цвета - чёрный и белый) и клавиатурой. 

В следующих заметках я подбробнее  расскажу об истории проекта, "софте" и "железе". Надеюсь, что эта статья будет полезна и интересна таким же гикам-самодельщикам.

P.S. Ссылка на проект в gitlab: https://gitlab.com/alkid1/cobalt68