Однобитный компьютер
Картинка для привлечения внимания:
Внимание! Под катом много картинок!
В этой статье будет краткое описание проектирования и создания однобитного компьютера. Всем кто заинтересовался, добро пожаловать под кат:
Нудная предыстория
В юности, из разных источников, по телевизору, в журналах, я натыкался на информацию о том, что существуют некие машины, компьютеры. С их помощью можно было хранить различную информацию, подсчеты, рецепты, рассказы и многое другое. Можно было все это изменять, писать некие программы которые как то это все сортируют, меняют и что то еще. И самое яркое воспоминание — это игры. Хотя эта яркость обычно была ограничена яркостью монитора.
Через какое то время, эти компьютеры стали появлятся у моих знакомых, и я уже мог пощупать это чудо. И вот случайно, я наткнулся на журнал «радио», в котором была плата с разводкой, для создания простейшего компьютера…
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. Изначально планировал проектировать на уровне транзисторов, но почему то у меня постоянно залипала схема, поэтому, в итоге я все сделал на логических элементах.
Вот общая схема:
Компьютер состоит из функциональных блоков:
DecodeUnit — Это блок, который расшифровывает команду, и в зависимости от нее, включает или отключает какой либо блок или переводит его в какой либо режим, например чтение или запись
Ram — Контроллер памяти, он включает нужную ячейку памяти, в зависимости от шины адреса
Bus — Контроллер шины данных. Активные блоки просто пишут туда или читают оттуда данные
Alu — Арифметико-логическое устройство. Блок, который может складывает два числа
Cell 0, 1 — Ячейки памяти
Register A, B, C — Регистры процессора
На схеме все выглядит очень компактно, но некоторые блоки содержат много логических элементов или вложенные блоки. Например регистр внутри выглядит вот так:
DecoderUnit внутри выглядит вот так:
Вот, приблизительно, как будет выглядеть, если все блоки развернуть до логических элементов:
После проверки работоспособности схемы, необходимо было ее перевести в транзисторы и снова проверить. Собирать схему я решил на полевых транзисторах, это упрощает схему. Схемы логических элементов взял по ссылке снизу:
https://pastraiser.com/technology/nmos/basicnmosgates.html
Там есть обычные варианты, а также оптимизированные, это когда в схеме встречается некий паттерн логических элементов, и их можно выразить меньшим числом транзисторов.
Для симуляции схемы я использовал бесплатный редактор circuitjs1. Он в реальном времени симулирует схему, но из за этого, все очень тормозит. Все что сложнее регистра, там собирать очень неудобно.
Кстати, вот так выглядит наш регистр:
И вот теперь у нас есть работающий виртуальный компьютер! Теперь необходимо его спаять. Изначально я думал что соберу его на платах для прототипирования, это такие универсальные платы, с кучей дырочек и без дорожек, но потом все же решил попробовать спроектировать плату, развести ее и заказать.
Совершенно случайно мне попался под руку сервис https://easyeda.com.
Это полный цикл проектирования печатных плат, и заказ их в сервисах, например в https://jlcpcb.com. Но, позже оказалось, что бесплатная доставка там только для первого заказа, а потом полная и цена ее, ну, точно не для прототипирования своих маленьких проектов, мне кажется заказать у нас будет дешевле.
Так как все это оказалось не очень дешево, решил не делать одну большую плату, а сделать каждый блок на отдельной плате, и соединять их как ардуино. Чтобы в случае ошибки на плате, не перезаказывать большую плату, а только часть.
Размеры плат при заказе кратны 100 на 100 мм, и цена соответственно увеличивается скачками, поэтому все блоки спроектировал в рамках этого квадрата.
Минимальное количество плат одного типа — 5 штук, а у меня как раз 5 регистров, поэтому плату регистров сделал универсальную, с перемычками.
Вот с такими данными и начал разводить платы, где то получилось просторно, где то было сильно впритык. Для простоты монтажа, все транзисторы смотрели в одну сторону.
Схема регистра:
Разводка регистра:
Ну и плата которая ко мне приехала:
А вот и первые попытки спаять это все:
За качество извиняюсь, фоткал на свой предыдущий проект.
Еще картинокПослесловие
Теперь можно подвести итоги, что было сделано, что потрачено, сколько это стоило:
Сбывшаяся мечта — 1 штука
Потраченное время — 1 месяц
Инструменты и расходники, приблизительно — 6832 руб 12 копеек
Электронные компоненты — 2140 руб
Заказ плат — 1600 руб
Доставка плат — 1601 руб
Рекламная компания — 0 руб
Всем спасибо за внимание!