Как стать автором
Обновить

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

Время на прочтение6 мин
Количество просмотров39K

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

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

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

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

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

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

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

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

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

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

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

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

https://monster6502.com/

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

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

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

http://www.megaprocessor.com/

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

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

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

https://www.youtube.com/watch?v=5hhbGBlP3_4

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Система команд получилась следующая:

  • [000] Nop - Инструкция ничего не делает

  • [001] Data->A (Data : Value) Перенос бита из данных в регистр A

  • [010] Data->B (Data : Value) Перенос бита из данных в регистр B

  • [011] Data->C (Data : Value) Перенос бита из данных в регистр C

  • [100] A+B->C (Data : S\P) Сложение регистров A и B, бит в данных указывает что попадет в регистр C, результат или бит переноса

  • [101] C ->AB (Data : A\B) Перенос бита из регистра C в регистр A или B, в зависимости от бита в данных

  • [110] Ram->C (Data : Address) Перенос бита из памяти в регистр C. В данных адрес ячейки в памяти.

  • [111] C->Ram (Data : Address) Перенос бита из регистра C в память. В данных адрес ячейки в памяти.

Для удобства оператора, на верхней панели нанесены инструкци и их короткие расшифровки. Так же помечены переключатели и кнопки. Первые 3 переключателя кодируют команду, 4 переключатель кодирует бит данных. Кнопка Clock запускает такт компьютера. Кнопка Reset сбрасывает состояние компьютера к заводским настройкам.

Разработка

Для разработки логической схемы, я использовал бесплатный редактор 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 руб

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

Теги:
Хабы:
+111
Комментарии54

Публикации

Изменить настройки темы

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн