Как сделать компьютер своими руками из транзисторов

Обновлено: 05.07.2024

И снова велосипед - простой транзисторный компьютер

Да, я все еще пытаюсь сделать компьютер из транзисторов. На этот раз подошел несколько ближе - почти расчертил схему по кусочкам Завтра куплю два листа ватмана - буду чертить все вместе. Ну а пока. Можно попросить проверить небольшой кусочек схемы? (выложу несколько позже).

73! Игорь (позывной для работы в эфире теперь ищите в моём профиле) :: Правильно заданый вопрос - половина ответа!

Хорошая идея Начать желательно с "вышивки" куба памяти на ферритовых кольцах. Эдак, на несколько "Гиг".

Ну вот опять бред, до этого кажется
было что-то вроде самодельного принтера
на очереди летательный аппарат по типу,
как в фильме Кин-дза-дза

Леонид Б. Малинин, 4K8F :: Since-1967 :: Ex Calls: UD6ABF, RD6DFF, UD6DFF, UD8F :: DXCC-340/361

Завтра куплю два листа ватмана - буду чертить все вместе

купите 4, рано или поздно ведь придется апгрейдить

п.с. кстати, да, а принтер то работает?
или без компьютера никак?

Леонид Б. Малинин, 4K8F :: Since-1967 :: Ex Calls: UD6ABF, RD6DFF, UD6DFF, UD8F :: DXCC-340/361

Принтер, комп на транзисторах, а дальше ускоритель на дровах, а может на угле.

Вы на возраст топикстартера посмотрите и крылья ему не рубите.
Дерзайте молодой человек… о результатах доложите.
А для схем лучше миллиметровку купить.
И вообще на форуме надо сделать « лягушатник» для молодых, для начинающих, для менее опытных где, не стесняясь можно задавать любые вопросы про «2х2».

Последний раз редактировалось UA3BAJ; 21.08.2013 в 02:08 .

Александр (когда-то UA3KPP, UA3-17015) 73!
Телеграфист - это звучит гордо! (с) М. Горький?

А Вы уверены, что ему 15 лет, в чём я очень свневаюсь.
Да ему в 2 раза больше!
И комп у него есть и нет есть и всё у него есть,
он прикалывается, так
сказать один из видов приключений
ну что ж помогите ему в изготовлении
компа на транзисторах, или вы не понимаете
что это такое и прикиньте сколько тысяч их туда надо
а для рисования схемы пачки миллимитровки будет мало
а ещё лучше купите несколько десятков тысяч, как минимум,
ферритовых колец и аплетайте их проводом,
это будет память, если Вы не курсе
а вообще я не знаю куда смотря модераторы

Леонид Б. Малинин, 4K8F :: Since-1967 :: Ex Calls: UD6ABF, RD6DFF, UD6DFF, UD8F :: DXCC-340/361

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

Молодец ! Была даже такая в пятидесятых прошлого столетия , называлась "БЭСМ". Триггеры на лампах 6Н8С , целый этаж занимала машина . Позже появилась похожая на то , что вы собираетесь изобрести , "МИНСК-11" . Правда процесс обсчета на простой логарифмической линейке, изготовленной в ГДР (знаете , что это за рудимент ?) занимал времени меньше , чем ввод информации в сей агрегат . Шагать "ленинским курсом" в прошлое конечно почетно , но пожалейте свое время , оно улетает стремительно , вы уж мне старику поверьте ! Лучше потратить его с большей пользой , в настоящее время получать огонь методом трения двух кусков деревяшки , пожалуй не стоит .


Недавно на хабре была статья о проектировании собственного компьютера, где автор хотел сначала строить компьютер из транзисторов, но затем решил продолжить на микросхемах 7400-серии из-за того, что на транзисторах ему это показалось слишком сложным и дорогим занятием.

Похожая задача интересовала и меня последние 3 года — но от изначальной идеи строить на транзисторах я не отказался, и сейчас могу рассказать свои соображения и показать текущие наработки, а также — хочу спросить вашего мнения о том, каким на ваш взгляд должен быть _серийный_ транзисторный декоративный компьютер. Но сразу нужно заметить, что работы впереди еще на пару лет :-)

Главный вопрос — зачем все это нужно, если есть FPGA и всякие Raspberry Pi?

Ответ простой:
1) Мне интересно этим заниматься в свободное время и
2) Декоративный компьютер (декоративный — это вопрос отношения к компьютеру, а не его внешности) — он как декоративные домашние животные: мопс не отгрызет ногу грабителю, а персидский котик не победит в бою метрокрысу. Но с ними интересно играть и показывать гостям — даже если в области вычислений, охраны и охоты они сильно уступают «боевым» аналогам.

Какие будут у нас требования к декоративному компьютеру?

  • Разработка под автоматизированную сборку. Руками паять по 5000 деталей на компьютер — поседеть можно.
  • Производительность — не существенна, главное чтобы 100тыс+ операций в секунду было (на уровне Радио-86РК). Даже 100тыс оп/с позволит решать очень многие задачи.
  • Практика показывает, что 64 КиБ памяти — реалистичный минимальный объем памяти. В 1-4 КиБ многое не влезет, потому уменьшать шину адреса меньше 16 бит не стоит.
  • Программирование — на C. Нельзя заставлять людей тратить своё свободное время на ассемблер (но если желание есть — то все карты в руки).
  • В базовой модели — из транзисторов сделан только сам процессор. Память и обвязка — может быть из микросхем. Полностью транзисторный вариант возможен в будущем, но это уже будет дальнейшее развитие (со своими ограничениями — более 1-2 КиБ памяти иметь будет затруднительно)
  • В процессоре — отключаемые светодиоды показывают состояние внутренних регистров (IP, аккумулятор, запись/чтение из памяти. )
  • Не слишком высокая цена. Себестоимость одного транзистора с обвязкой и автоматическим монтажом — около 2 рублей, соответственно, использовать больше 1000 транзисторов не желательно для серийного продукта. Это означает, что схема должна быть проще, чем i8080 (4500 транзисторов), i4004 (2300 транзисторов), и MT15 (

Взаимодействие с пользователем: Классическая реализация — это клавиатура + вывод на телевизор или VGA-монитор. Сделать удобную «свою» клавиатуру слишком сложно — нужно использовать стандартные PS/2 или USB. PS/2 клавиатуры уже редкость — а USB в транзисторном компьютере поддержать — будет затруднительно, без использования грязных хаков (вроде микроконтроллера).

Вероятно, оптимальным и простым решением может быть терминальный интерфейс — когда компьютер общается с внешним миром через последовательный порт (RS232), таким же образом можно загружать программы. Т.е. в простейшем случае транзисторный компьютер подключается к настольному компьютеру (или специализированному терминалу) через USB<>COM адаптер, и в любой программе-терминале (например Putty) можно с ним работать.

Также, нужна и возможность подключать внешние устройства через GPIO-пины.

Последовательный или параллельный ALU? 8 или 16 бит?: Поскольку количество транзисторов очень ограничено (<1000), придется жертвовать производительностью, и все операции проводить последовательно. Это очень сильно снижает требуемое количество транзисторов — фактически нужна логика на 1 бит и 16-и битные сдвиговые регистры. Но при тактовой частоте 1Мгц — мы будем иметь только 62тыс. операций в секунду, желательно конечно частоту иметь по-выше.

Архитектура процессора: Безусловно, полноценному компьютеру нужно иметь возможность писать в свою память кода. Потому, если есть возможность переложить это на внешнюю обвязку процессора — то Гарвардская архитектура (с раздельной памятью кода и данных) будет проще в реализации, и быстрее в работе. Но если обвязка процессора транзисторная — то придется использовать совместную память кода и данных. Так что тут выбор зависит от голосования в конце статьи :-)

Сам процессор — будет hard-wired (логика по работе с микрокодом, и сам микрокод — могли бы занять очень много транзисторов), неизбежно будет иметь очень простой набор инструкций (бинарная логика + add, сдвиги на 8 и 1 бит), и минимальное количество регистров (1-2) с возможностью использовать оперативную память как псевдо-регистры (как в 6502). Возможно, в простейшем случае все команды будут выполнятся по единой жесткой схеме ax = mem[imm] = mem[imm] op ax + бит условного перехода — это позволит уменьшить до минимума логику процессора, и положить максимальный объем работы на относительно быструю оперативную память.

Аппаратного стека и аппаратной обработки прерываний не будет — реализовать это можно и в софте: памяти у нас больше, чем транзисторов.

Напряжение питания: 3.3 и 5В? Большинство старых компьютеров используют 5В, а современная электроника — уже давно ориентируется на 3.3В для внешних соединений. Этот компьютер также будет использовать 3.3В — но потому, что низкоомные резисторы подтяжки будут потреблять в 2.5 раза меньше энергии — и соответственно, можно дальше уменьшить их сопротивление и увеличить скорость.

Безусловно, сделать процессор из менее чем 1000 транзисторов, пользуясь стандартными подходами к построению логических схем (даже с учетом последовательного ALU) не выйдет — и нужно применять различные схемотехнические компромиссы и ухищрения с целью уменьшения количества транзисторов.

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

Скорость простой логики

Как оказалось, есть несколько простых трюков, которые очень сильно ускоряют логику на биполярных транзисторах: это добавление диода Шоттки для предотвращения входа транзистора в глубокое насыщение (выход из которого очень медленный, до 200-500нс), и опционально — добавление конденсатора на 25-50 пФ параллельно резистору базы для того, чтобы быстро перезаряжать паразитные емкости схемы. Ну и конечно, как и для любых скоростных цифровых схем — нужна развязка питания керамическими конденсаторами рядом с потребителями, и длинные цифровые дорожки в некоторых случаях будут требовать терминирование.

После применения этих хитростей получаем следующее (здесь обе оптимизации — в самой правой части схемы):



И работает это очень резво, на осциллограмме — 100нс/деление, фронты/задержки порядка 10нс:


Также, подбирая сопротивление резистора от базы к земле — можно управлять передаточной характеристикой логики, чтобы пороговое напряжение было примерно как у CMOS, около 3.3/2 = 1.65В. Такое изменение помимо помехоустойчивости даст еще одно важное преимущество: пологие фронты на входе — будут становится более резкими после прохождения логики. Также, если электричество нам экономить не нужно, мы можем выкинуть «верхний» транзистор, и заменить его резистором. Схема получается такая:


А передаточная характеристика:

3 цветные линии — это симуляция при разной температуре (20, 40 и 60 градусов), параметры биполярных транзисторов ощутимо плывут с температурой, и это обязательно нужно учитывать в более сложных схемах.

Более сложная логика

T-триггер — Т-триггер по тактовому сигналу изменяет своё состояние на противоположное. Может использоваться для построения параллельного счетчика инструкций, но использоваться вероятно не будет т.к. все будет работать последовательно. Принцип работы — бистабильный мультивибратор, по короткому отрицательному синхроимпульсу — переключается в противоположное состояние за счет конденсаторов параллельно резисторам R8 и R9.


Схема была реализована «в железе», вместе с инверторами. Инверторы показали ожидаемую скорость (т.е.

10-20нс фронты). Не пугайтесь качеству пайки — плата пережила множество экспериментов и вариантов транзисторов/параметров:


Полный сумматор — один из наиболее важных и сложных цифровых блоков. Каноническая реализация КМОП полного сумматора — требует 28 транзисторов:

Самый минимум, который приходилось видеть — из 6 транзисторов, с использованием конденсаторов (но надежность вызывает вопросы). Известные реализации на биполярных транзисторах — также требуют 22 транзистора.


Но можно ли обойтись всего 4 транзисторами? Я немного пораскинул мозгами, и получилось следующее:



Схему для симуляции в LTspice IV можно скачать тут.

Принцип работы следующий: т.к. порядок слагаемых не имеет значения, мы их просто аналогово смешиваем, и точно подбирая пороговое напряжение сдвоенного инвертора — сразу получаем перенос. Затем вычитая на транзисторе Q3 из аналоговой суммы перенос — получаем сумму. Конечно, все это требует точного подбора уровней срабатывания, и симуляции с учетом температуры. Диоды Шоттки — для предотвращения входа транзисторов в глубокое насыщение, что резко снижает скорость работы.

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

Сдвиговой регистр — самая ответственная часть этого транзисторного компьютера. Классическая реализация на синхронных D-триггерах — требует чудовищного количества транзисторов на бит.

У меня получилось уместиться в 2 транзистора на бит, со следующими особенностями:
1) Регистры — основаны на конденсаторах, и если их «не двигать» — то со временем данные пропадут. Но с полевым транзистором время хранения достаточно большое.
2) Передача данных на следующую ступень — биполярным транзистором. В половине случаев он работает в обратном, нестандартном режиме — пробивное напряжение намного меньше (но 3.3В должно держать), и коэффициент усиления намного ниже прямого включения (но я надеюсь будет достаточно).
3) Каждая следующая ступень — инвертирует сигнал, это не проблема когда нужен только последовательный доступ (например в случае регистров процессора). Если же будет нужен не инвертированный параллельный выход — нужно будет добавить 8 инверторов (т.е. 16-и битный сдвиговой регистр потребует 40 транзисторов, а не 32).
4) Остается проблема с насыщением биполярного транзистора.



График работы:

С этими компактными реализациями цифровых схем — уложиться в 1000 транзисторов думаю будет вполне реально.
На этом пока все — меня же ждет впереди чудовищно много работы

А теперь — несколько вопросов к читателям: Какие варианты кажутся вам приемлемыми?

Сегодня на рынке высокопроизводительных процессоров тесно. Если отбросить в сторону мобильные архитектуры, где существует целый ряд перспективных наработок, то только две компании всё ещё способны выпускать настольные и серверные Х86 процессоры. Вообще, в последнее время настольный сегмент атакует Apple. Инженеры яблочной компании создали настоящего монстра, который способен тягаться с самыми быстрыми процессорами конкурентов. Мало того, он выполнен на архитектуре ARM и обладает отличной энергоэффективностью. Возможно, в будущем примеру Apple последуют и другие, но пока компании довольствуются смартфонами и планшетами, предпочитая не выходить из мобильного сектора.

реклама


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

В качестве источника для создания чипа он использовал 12 микросхем Z2, каждая из которых включала 100 транзисторов, произведённых по нормам 10 микрометров (не путать с нанометрами). Это значит, что внутри расположилось 1200 транзисторов. Сэм отмечает, что первый процессор Intel 4004 был построен по аналогичному техпроцессу на 10 микрометров и включал 2000 транзисторов. На видео можно заметить, что энтузиаст использует пусть и устаревшее, но весьма дорогостоящее оборудование, которое точно не встретишь в доме каждого человека.


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

Разработка одноплатного компьютера с нуля. Пособие для начинающих Одноплатный компьютер, Разработка с нуля, Технопрон, Радиолюбители, Technobrother, Длиннопост

Я занимаюсь разработкой электроники. Начал сравнительно недавно — когда микроконтроллеры от Atmel стали известны благодаря платформе Arduino. Тогда меня это не особо заинтересовало — на тот момент я уже программировал их из AVR Studio, читал истории DiHalt и мечтал о разработке собственного автопилота. 3 курс, Новосибирск, НГУ — это было увлекательно…

Но я с интересом наблюдаю за развитием и ростом индустрии встраиваемых и портативных систем: появление RaspberryPI, многообразия SoC и плат на их основах, системы умного дома, интернет вещей, смартфоны с растущей вычислительной мощностью — все это фантастический простор для деятельности. Результатом наблюдения стало желание поучаствовать: попробовать себя в разработке простой платформы, с целью изучения и накопления опыта.

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

Проектирование

После чтения статей о платформе BlackSwift в потенциальных кандидатах появился Qualcom Atheros AR9331, но смутило отсутствие подробной информации в открытом доступе. Жаль, занимательный кандидат.

Меня интересовала минимальная конфигурация, достаточная, чтобы запустить на ней Linux. Соответственно к процессору была выбрана микросхема памяти на 32 МБ (256 МБит) (по тому простому принципу, что она у нас была в наличии). На тот момент я еще не вычитал на десятках форумов о существовании сложностей с этим процессором, только изучил рекомендации производителя по трассировке и, довольный как слон, делал все по рекомендациям.

Вообще, процессор (или SoC, так правильнее) интереснее с той точки зрения, что при его запуске значительно дороже выходят ошибки проектирования. Например, некорректная разводка DDR памяти может выразиться как минимум в последующих ошибках чтения-записи, как максимум — в невозможности инициализации памяти вообще. Цепи питания процессора — ошибка сожжет процессор при первом включении, интерфейсы — потеря периферии на этих интерфейсах, и так далее.

Поэтому начинать проще с изучения готовых отладочных комплектов, например официальной платы и ее документации. Платы у меня не было, но документация доступна всем желающим. В придачу полезно изучить все инструкции по применению, почитать форумы (это уже жизненный опыт :)) — в общем, изучить всю доступную информацию о жертве. После изучения начинается механическая работа — нарисовать схему, а затем и плату. Четыре слоя, минимальная ширина проводника 0.2мм, зазора 0.2мм, отверстия 0.3мм.

Подключил все, что можно подключить безболезненно – аудио входы и выходы, вывел видеосигнал на контактные площадки, всякую простую периферию — микросхему памяти с I2C интерфейсом, еще одну с SPI, держатель для uSD карты, конфигурационные перемычки, обязательно отладочный порт, и потом на свободное место все что осталось. Плата получилась небольшая — 70х40мм, с минимумом компонентов. Для NAND памяти места не осталось, но я планировал запускаться с SD/MMC. Работы на одну ночь.

Разработка одноплатного компьютера с нуля. Пособие для начинающих Одноплатный компьютер, Разработка с нуля, Технопрон, Радиолюбители, Technobrother, Длиннопост

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

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

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

Разработка одноплатного компьютера с нуля. Пособие для начинающих Одноплатный компьютер, Разработка с нуля, Технопрон, Радиолюбители, Technobrother, Длиннопост

Отступление
Эта система на кристалле приглянулась мне еще и тем, что несет на борту все необходимые для ее жизни регуляторы питания — как DC/DC (импульсные) так и LDO (линейные). В том числе и зарядное устройство для Li-Pol аккумулятора. Заводишь на SoC 5 вольт от USB — получаешь 1V8, 2V5, 3V3 и 4V2 на выходе. Что-то достается самому процессору, что-то уходит на память, можно аккумулятор подзарядить. Удобно. Можно сжечь все и сразу :)

SoC bringup

Прочь сомнения, подать питание!

Начинается самое интересное — bringup. Как этот термин лаконично перевести на русский в данном контексте? Попытка вдохнуть жизнь? Не звучит.

В процессоре есть свой первоначальный загрузчик, который при включении проверяет условия старта — откуда и что грузить. Он же отвечает на запросы по шине USB. Его можно сконфигурировать перемычками на плате, или однократно прошиваемой OTP-памятью. Если перемычки перепаять я еще смогу, то перепрошить неперепрошиваемое вряд ли. Распаиваю перемычки, подаю питание, и о чудо — с отладочного порта приходят первые байты данных! Это значит, что процессор доволен питанием, самые базовые его узлы запустились, и можно что-то делать дальше. Что значат эти коды, я узнал из кривоватого заголовочного файла, в виде PDF документа, с невнятными пояснениям, пропусками и за авторством huashan. Все ясно.

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

Никаких транзакций по шине USB, даже генерации на кварце. Плохо. Начинаю думать, изучаю плату, вспоминаю все тонкие моменты. Например, на этой плате рядом с процессором я поставил свой DC/DC преобразователь, с расчетом на питание какой-либо потребляющей нагрузки, подключил его к шине питания USB 5V, и ничем не нагрузил. Промеряю осциллографом — на входе 5 вольт, на выходе 5 вольт. Всплывают слова с производства, что-то по поводу резистора. Да, так и есть — в цепи обратной связи нет резистора. (- Капитан, капитан, якорь всплыл! — Хммм, скверная примета…)

Паяю резистор, и о чудо! Плата определяется по USB! До этого я смотрел на уровень напряжения шины питания — 5.1 вольт, никаких существенных помех, никаких пульсаций. Но процессору виднее. После запайки резистора заработал и DC/DC источник, пока без нагрузки, но, по крайней мере, перестал мешать процессору. Хорошо, что дальше.

Утилиты позволяют загрузить эти бутлеты в память процессора и запустить их на исполнение. Все так сложно, потому что после включения встроенный загрузчик ничего не знает про внешнюю оперативную память, а поскольку нет памяти – некуда загружать, к примеру, ядро Linux. Получается цепочка из нескольких звеньев, где на каждом этапе выполняется незначительный шаг вперед.

Разработка одноплатного компьютера с нуля. Пособие для начинающих Одноплатный компьютер, Разработка с нуля, Технопрон, Радиолюбители, Technobrother, Длиннопост

Для подключения к последовательным портам, для реализации всяких внутрисхемных JTAG отладчиков, программаторов и аналогичных задач в другом проекте был реализован USB-UART мост на FT2232. Двухслойный дизайн, выведены оба порта на гребенку с шагом 2 мм. В этом проекте другая история – USB-UART мост + платка сбора данных размещается в центре основной платы, и конструктив прибора предполагает ее удаление.

Все эти платы проектировались параллельно, поэтому я сразу заложил идентичные размеры и возможности гибкого соединения. Не зря :)

Разработка одноплатного компьютера с нуля. Пособие для начинающих Одноплатный компьютер, Разработка с нуля, Технопрон, Радиолюбители, Technobrother, Длиннопост

Отлично, компилирую исходники, собираю этот конструктор, загружаю, и получаю первые строчки из отладочного порта! Подсистема питания запустилась!

PowerPrep start initialize power…
Battery Voltage = 0.65V
No battery or bad battery detected. Disabling battery voltage measurements.
EMI_CTRL 0x1C084040
FRAC 0x92926152
power 0x00820710
Frac 0x92926152
start change cpu freq
hbus 0x00000003
cpu 0x00010002

Заглядываю в исходники инициализации памяти, разрешаю простейший тест, правлю ручками процедуру инициализации под мою конфигурацию платы, запускаю вновь:

PowerPrep start initialize power…
Battery Voltage = 1.74V
No battery or bad battery detected. Disabling battery voltage measurements.
EMI_CTRL 0x1C084040
FRAC 0x92926152
power 0x00820710
Frac 0x92926152
start change cpu freq
hbus 0x00000003
cpu 0x00010002
start memory test, at 0x40000000
end memory test, at 0x41FFFFFC

Замечательно! Тест памяти пройден! Это очень хорошо, теперь туда можно загрузить что-то посерьезнее.

Посерьезнее у меня это U-Boot. Я знаком с этой системой, мне она кажется вполне адекватной и функциональной. Позволяет работать с периферией — актуальные версии работают с USB, SD/MMC, Ethernet, загружать образы c FAT/ext2 разделов, передавать управление, и главное — моргать светодиодиком — все то, что нужно для счастья и более гибкой отладки на первоначальном этапе.

Поэтому не долго думая выкачиваю актуальную версию из официального репозитория, беру самую близкую конфигурацию, компилирую, собираю с индусскими бутлетами в один файл, и загружаю в процессор:

PowerPrep start initialize power…
Battery Voltage = 1.74V
No battery or bad battery detected. Disabling battery voltage measurements.
EMI_CTRL 0x1C084040
FRAC 0x92926152
power 0x00820710
Frac 0x92926152
start change cpu freq
hbus 0x00000003
cpu 0x00010002
start memory test, at 0x40000000
end memory test, at 0x41FFFFFC

U-Boot 2015.04-rc3-00209-ga74ef40 (Mar 16 2015 — 12:47:34)CPU: Freescale i.MX23 rev1.4 at 227 MHz
BOOT: USB
DRAM: 32 MiB
MMC: MXS MMC: 0
MMC0: Bus busy timeout!
MMC0: Bus busy timeout!
MMC0: Bus busy timeout!
MMC0: Bus busy timeout!
Card did not respond to voltage select!
MMC init failed
Using default environmentIn: serial
Out: serial
Err: serial
Net: Net Initialization Skipped
No ethernet found.
Hit any key to stop autoboot: 0
=>

Падает при подаче питания на DDR память. Хм. Где-то я уже читал об этом. А как до этого работало? Ладно, нестабильность найдена, надо разбираться.

Вокруг микросхемы памяти расположены ее законные развязывающие конденсаторы, 8 шт. по 100 nF. Но на выходе встроенного в SoC источника питания для памяти я поставил 2x10 uF, хотя производителем рекомендовано всего 1uF (инструкции читаю, если ничего другое уже не помогает, да). Ломать, не строить: отпаиваю один конденсатор, подключаю аккумулятор, и система стартует!

На самом первом фото виден этот конденсатор — вокруг него грязь, и он припаян только одним контактом.

PowerPrep start initialize power…
Battery Voltage = 3.75V
Boot from battery. 5v input not detected
Try poweron_pll
Try turnon_mem_rail
Try init_clock
EMI_CTRL 0x1C084040
FRAC 0x92926192
Try init_ddr_mt46v32m16_133Mhz
power 0x00820710
Frac 0x92926192
start change cpu freq
hbus 0x00000003
cpu 0x00010001

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

PowerPrep start initialize power…
Battery Voltage = 3.74V
5v source detected.Valid battery voltage detected.Booting from battery voltage source.
Mar 18 2015
07:59:13
Try poweron_pll
Try turnon_mem_rail
Try init_clock
EMI_CTRL 0x1C084040
FRAC 0x92926192
Try init_ddr_mt46v32m16_133Mhz
power 0x00820710
Frac 0x92926192
start change cpu freq

Теперь начались зависания. Более того, ситуация не регулярная, периодически проявляется при питании от аккумулятора, периодически от внешних 5В, периодически стартует и работает. Опять правлю код, отключаю переключение процессора на PLL, ядро остается работать на 24МГц. Все стабильно. Меняю делитель PLL, скручиваю частоту, и плата успешно запускается на 320 МГц. Надо попробовать рекомендацию производителя — конденсатор на 100 pF в цепи импульсного DC/DC. Место на печатной плате под конденсатор я заложил. Позже вернусь к этому вопросу.

Linux kernel

Итак, на текущий момент есть плата, стартующая с карты памяти, и загружающая U-Boot. Дальше по плану надо загружать ядро.

make ARCH=arm CROSS_COMPILE=$ mxs_defconfig
make ARCH=arm CROSS_COMPILE=$ menuconfig
make ARCH=arm CROSS_COMPILE=$ -j4 zImage modules

Вот эти три клика

При настройке ядра надо строго указать слияние ядра+dtb

Boot options ---> Use appended device tree blob to zImage ----> Supplement the appended DTB with traditional ATAG information

Надо включить Kernel low-level debugging functions вместе с early printk

И еще enable dynamic printk() support

И еще видеоподсистему отключить

И еще половину лишних и не очень драйверов

И еще собрать dtb — device tree blob, структуру, описывающую ядру базовые вещи — количество памяти, периферию SoC, и т.д.

make ARCH=arm CROSS_COMPILE=$ imx23-olinuxino.dtb

И собрать все это в один файл

cat arch/arm/boot/zImage arch/arm/boot/dts/imx23-olinuxino.dtb > arch/arm/boot/zImage_dtb

После чего можно копировать ядро на флешь.

Запускаю, и получаю kernel panic. Логично, корневой файловой системы еще нет.

В качестве собственно операционной системы я выбираю Debian. По-моему, отличный дистрибутив — простой и надежный, как деревянная палка. Беру готовую сборку, распаковываю на раздел карточки, и указываю при загрузке ядра, где искать его законную корневую.

Дааа, есть над чем поработать.

Но, тем не менее, система работает, грузится с карточки памяти, размещается во всем диапазоне DDR памяти, и по праву может называться одноплатным компьютером! Это от схемы в голове до реализации в железе.

Итого, ошибок дизайна пока что не обнаружено, хотя нарекания уже есть. Что-ж, для начала, я считаю, достаточно.

Заключение

На самом деле это только начало. Еще есть над чем поработать — разобраться с периферией, в частности интересен аудио и видеовыход, протестировать SoC на штатных частотах, а еще лучше разогнать, измерить потребляемый ток, проверить при минусовых и плюсовых температурах (интересна устойчивость DDR контроллера), проверить на ресурсоемких задачах (например, видеотрансляция с веб камеры по USB WIFI), и в результате сделать на платке WiFi-управляемый танк с камерой и направленным микрофоном. Но не сейчас. Сейчас у меня есть деловое предложение :)


Компьютеры в более-менее привычном современным пользователям виде появились на рубеже 1970–1980-х годов. Они все еще были громоздкими и стоили очень дорого, но занимали всего одно рабочее место, а их покупку уже можно было представить — вычислительные машины первых поколений могли располагаться только в большом институте, министерстве или секретной военной части.

Большие ЭВМ оставались очень дорогими в начале 1980-х: согласно источникам, ЕС-1060 (на фото) в 1983 году стоила 2,2 млн рублей

Большие ЭВМ оставались очень дорогими в начале 1980-х: согласно источникам, ЕС-1060 (на фото) в 1983 году стоила 2,2 млн рублей

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

Первый коммерчески успешный микрокомпьютер Altair 8800 на основе i8080 стоил около $ 500. MITS, Альбукерке, 1975

Первый коммерчески успешный микрокомпьютер Altair 8800 на основе i8080 стоил около $ 500. MITS, Альбукерке, 1975 год

Советская микроэлектроника в 1970-х, несмотря на отдельные успехи, от американской сильно отставала и все больше склонялась к копированию западных образцов. Был выпущен и аналог i8080, получивший обозначение КР580ИК80. Как раз на его базе собственные разработки создавали советские инженеры-энтузиасты.

«Микро-80» — проект, которого могло не быть

Пытаясь пристроить микропроцессоры к делу, Зеленко вместе с приятелями придумали схему компактного компьютера, который назвали «Микро-80». Проект удалось представить аж замминистра радиопромышленности Николаю Горшкову, но он счел его, в лучшем случае, занятной экзотикой. Разработчикам чиновник пояснил: «Ребята, хватит заниматься ерундой. Персонального компьютера не может быть. Могут быть персональный автомобиль, персональная пенсия, персональная дача. Вы вообще знаете, что такое ЭВМ? ЭВМ — это 100 квадратных метров площади, 25 человек обслуживающего персонала и 30 литров спирта ежемесячно!»

В итоге компьютер собирать не стали, ограничившись публикацией схему в журнале «Радио», в редакции которого идею как раз оценили высоко. Справедливости ради, рассказать о проекте на его страницах — уже успех, поскольку «Радио» было заметным изданием с миллионным тиражом.

Читайте также: