Картинка для привлечения внимания:
Внимание! Под катом много картинок!
В этой статье будет краткое описание проектирования и создания однобитного компьютера. Всем кто заинтересовался, добро пожаловать под кат:
Нудная предыстория
В юности, из разных источников, по телевизору, в журналах, я натыкался на информацию о том, что существуют некие машины, компьютеры. С их помощью можно было хранить различную информацию, подсчеты, рецепты, рассказы и многое другое. Можно было все это изменять, писать некие программы которые как то это все сортируют, меняют и что то еще. И самое яркое воспоминание - это игры. Хотя эта яркость обычно была ограничена яркостью монитора.
Через какое то время, эти компьютеры стали появлятся у моих знакомых, и я уже мог пощупать это чудо. И вот случайно, я наткнулся на журнал ‘радио’, в котором была плата с разводкой, для создания простейшего компьютера...
https://ru.wikipedia.org/wiki/Радио-86РК
Это все перевернуло в моей голове, повлияло на всю мою дальнейшую жизнь. Из устройства, которое работает на какой то магии, оно превратилось в устройство, очень сложное, но, теоретически реализуемое. К тому времени я уже паял вырванные провода из стационарных телефонов, и периодически натыкался на микросхемы серии К155. Мой неокрепший
Но, чем больше я узнавал в этих областях, тем больше понимал, что создание компьютера, это очень сложно, к тому же, компьютер уже перестал быть диковинкой.
Со временем, это вещь меня интересовала все меньше и меньше, так как я уже полностью погрузился в программирование игр (хобби), а через несколько лет мне очень повезло, я попал в геймдев! После этого я закопал свой старый паяльник, чтобы он меня больше не отвлекал и полностью посвятил себя разработке (программированию) игр.
Переломный момент
С самого начала у меня была какая то тактика и я ее придерживался. Но все изменило одно видео:
Процессор 6502! реализованный дискретными компонентами! Этот легендарный процессор использовался не только в NES (Денди), но и в роботах модели Bender "Сгибатель":
https://ru.wikipedia.org/wiki/MOS_Technology_6502
Меня настолько задело это видео, и реальность создания процессора и компьютера, пусть и в более простом варианте, что я начал изучать эту тему, и наткнулся на следующий вариант:
И передумал делать... Но, потом наткнулся на вариант компьютера без процессора, полностью на обычной логике:
И чаша весов снова перевесила в сторону создания компьютера. Кстати, пока я решал, буду я создавать или нет компьютер на дискретных компонентах, подразумевая какие либо транзисторы, наткнулся на серию видео, где автор создает компьютер на лампах иили реле! Советую ознакомится, это что то с чем то )
Это одно из видео, на самом канале все остальное:
Проектирование
Для реализации проекта я выбрал самый простой вариант компьютера : 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 руб
Всем спасибо за внимание!
Автор: Семёнов Альберт