Однобитный компьютер

Картинка для привлечения внимания:

1944f08d182d72b49f9a2f77d817da1c.jpg

Внимание! Под катом много картинок!

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

Нудная предыстория

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

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

https://ru.wikipedia.org/wiki/Радио-86РК

Это все перевернуло в моей голове, повлияло на всю мою дальнейшую жизнь. Из устройства, которое работает на какой то магии, оно превратилось в устройство, очень сложное, но, теоретически реализуемое. К тому времени я уже паял вырванные провода из стационарных телефонов, и периодически натыкался на микросхемы серии К155. Мой неокрепший мозг, рисовал иллюзию того, что стоит побольше найти разных микросхем, поднабрать опыта и я исполню свою мечту и соберу себе компьютер. Движимый этим я начал изучать литературу по работе логических схем, работу ассемблера, записался в кружок — радиолюбитель, а позже, поступил в ПТУ на радиомонтажника.

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

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

Переломный момент

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

Процессор 6502! реализованный дискретными компонентами! Этот легендарный процессор использовался не только в NES (Денди), но и в роботах модели Bender «Сгибатель»:

https://ru.wikipedia.org/wiki/MOS_Technology_6502

Меня настолько задело это видео, и реальность создания процессора и компьютера, пусть и в более простом варианте, что я начал изучать эту тему, и наткнулся на следующий вариант:

http://www.megaprocessor.com/

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

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

Это одно из видео, на самом канале все остальное:

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

Для реализации проекта я выбрал самый простой вариант компьютера : 1-битный. Ввод данных с помощью выключателей, отображение результатов с помощью светодиодов. Из операций, решено сделать только сложение. Чтобы сложить два числа, необходимо 2 регистра для операндов. Чтобы результат не затирал исходные данные, необходимо еще 1 или 2 регистра для результатов. В первый регистр заносится результат сложения, во второй флаг переноса (переполнения), если результат оказался больше 1 бита. Чтобы уменьшить размер компьютера, я выбрал один регистр для результата сложения, а вот что в него заносится, результат или флаг переноса, будет определяться данными инструкции. Чтобы результат не затерся, его необходимо перенести в основную память. Основная память у нас будет из 2 ячеек, т.е. ширина шины адреса — 1 бит.

Теперь посчитаем команды:

  • Занести данные в первый регистр

  • Занести данные во второй регистр

  • Сложить и результат (или перенос) в третий регистр

  • Перенести из третьего регистра в память

В принципе мы укладываемся в 2 бита команды + 1 бит данных. Но после этого данные невозможно никуда перенести. Наша оперативная память становится только для записи. Поэтому я решил сделать 3 битные команды + 1 бит данных, добавив дополнительные инструкции для перемещения из памяти в регистры и обратно.

В итоге наш компьютер имеет следующий характеристики:

  • 1-разрядный процессор

  • Ширина шины данных : 1 бит

  • Ширина шины адреса : 1 бит (адресация до 2 бит)

  • 3 регистра общего назначения (A, B, C)

  • Размер инструкции : 4 бита (3 бита команда + 1 бит данных)

  • Время выполнения инструкций — 1 такт

  • Тактовая частота ограничена скоростью нажатия оператора

  • Питание: +5 вольт

Для проектирования логической схемы, я использовал бесплатный редактор logisim. Изначально планировал проектировать на уровне транзисторов, но почему то у меня постоянно залипала схема, поэтому, в итоге я все сделал на логических элементах.

Вот общая схема:

68aa8425f12c1f5414e3334e780bebe4.png

Компьютер состоит из функциональных блоков:

  • DecodeUnit — Это блок, который расшифровывает команду, и в зависимости от нее, включает или отключает какой либо блок или переводит его в какой либо режим, например чтение или запись

  • Ram — Контроллер памяти, он включает нужную ячейку памяти, в зависимости от шины адреса

  • Bus — Контроллер шины данных. Активные блоки просто пишут туда или читают оттуда данные

  • Alu — Арифметико-логическое устройство. Блок, который может складывает два числа

  • Cell 0, 1 — Ячейки памяти

  • Register A, B, C — Регистры процессора

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

5f358fff70ac171c642b393243e1dc7f.png

DecoderUnit внутри выглядит вот так:

697f9ec815db5dc5dd612143f4bcd837.png

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

18e4225770cdc412ee507ecfe6356979.png

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

https://pastraiser.com/technology/nmos/basicnmosgates.html

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

Для симуляции схемы я использовал бесплатный редактор circuitjs1. Он в реальном времени симулирует схему, но из за этого, все очень тормозит. Все что сложнее регистра, там собирать очень неудобно.

Кстати, вот так выглядит наш регистр:

30cb39ab2f10196a0010fca67c3684a8.png

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

Совершенно случайно мне попался под руку сервис https://easyeda.com.

Это полный цикл проектирования печатных плат, и заказ их в сервисах, например в https://jlcpcb.com. Но, позже оказалось, что бесплатная доставка там только для первого заказа, а потом полная и цена ее, ну, точно не для прототипирования своих маленьких проектов, мне кажется заказать у нас будет дешевле.

Так как все это оказалось не очень дешево, решил не делать одну большую плату, а сделать каждый блок на отдельной плате, и соединять их как ардуино. Чтобы в случае ошибки на плате, не перезаказывать большую плату, а только часть.

Размеры плат при заказе кратны 100 на 100 мм, и цена соответственно увеличивается скачками, поэтому все блоки спроектировал в рамках этого квадрата.

Минимальное количество плат одного типа — 5 штук, а у меня как раз 5 регистров, поэтому плату регистров сделал универсальную, с перемычками.

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

Схема регистра:

c977502ae346bd69567d4c6fd9cbdd18.png

Разводка регистра:

5994df50906d9a589d63b075acbc09c1.png

Ну и плата которая ко мне приехала:

52105951c70e6ef231174c63108237bc.jpg

А вот и первые попытки спаять это все:

9710c1993fbb543f2914a300f72aea2e.jpg

За качество извиняюсь, фоткал на свой предыдущий проект.

Еще картинок

Послесловие

Теперь можно подвести итоги, что было сделано, что потрачено, сколько это стоило:

  • Сбывшаяся мечта — 1 штука

  • Потраченное время — 1 месяц

  • Инструменты и расходники, приблизительно — 6832 руб 12 копеек

  • Электронные компоненты — 2140 руб

  • Заказ плат — 1600 руб

  • Доставка плат — 1601 руб

  • Рекламная компания — 0 руб

Всем спасибо за внимание!

© Habrahabr.ru