Эта история началась с ухода в отпуск зимой. Вы только представьте! Полярная ночь, темно хоть глаз выколи и дикий мороз. И вот сижу я такой страдалец, не зная, чем себя занять горемычного. А тут выскакивает статья, что японцы собрали однобитный компьютер на четырех микросхемах. (Naoto64). И вот то ли от безделья, то ли от тоски, или азарт меня одолел, но решил я попробовать собрать «одноплатник» с минимальным количеством микросхем. Под словом «минимальным» я подразумеваю компромисс между функционалом и лишним корпусом микросхемы. В итоге получилось при минимальной комплектации 26 микросхем. Это конечно гораздо больше, чем у Naoto64, но за то это уже 4-х битный «одноплатник». Да и микросхема ПЗУ вкуснее, чем набор переключателей. И реализовать можно очень многое в рамках этой архитектуры. Конечно, можно еще подрезать функционал и количество микросхем. Но я решил оставить так, как есть. В общем, "я художник, я так вижу!".
Одноплатник получился размерами 11х11 см. и с аппетитом в 1А.

Изначально проект задумывался без ОЗУ, чисто на одних регистрах. Но, изучая состав 155-й серии, наткнулся на ОЗУ К155РУ2. У меня этого «зверя» в наличии не было, пришлось подкупить. Микросхема представляет собой оперативное запоминающее устройство на 64 бит (16 слов х 4 разряда). А если по-простецки, то 8 байт. Всю жизнь мечтал сказать эту фразу: «8 байт хватит всем!».))) С применением этой микросхемы на горизонте замаячили возможные проблемы. Так как выходы данных имеют открытый коллектор, не совсем понятно, как это может повлиять на работу готового устройства. У меня был уже печальный опыт, когда дешифратор К155ИД10 не дружил, без подтягивающего к плюсу резистора, с входом #CS микросхемы КР537РУ17. На мою радость, эта проблема обошла стороной готовое изделие. Но и это еще не все. Выходы ОЗУ получаются инвертированными, что на начальном этапе мне не очень понравилось. А потом недостаток был превращен в достоинство. Если выход ОЗУ соединить с входом №1 исключающего ИЛИ (XOR), а четвертый бит адреса с входом №2, то на выходе получим первые 8 слов - инвертированные данные, а вторые 8 слов - не инвертированные. Пригодится для вычитания.

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

Инструкции выполняются за 3 такта.
Кроме инструкций перехода, где за 3 такта происходит переход и выполнение команды на которую перешли.
На борту имеется 8 регистров (К155ИР15):
2 адресация ПЗУ (ROM1, ROM2)
2 регистра общего пользования (R1, R2)
регистр адресации ОЗУ (ADR)
регистр буфера (BUF). Нужен для разделения шины между ядром и ПЗУ и как дополнительный регистр.
Регистр аккумулятор (А). Участвует в арифметических действиях и сравнении с содержимым ОЗУ
Выходной регистр (P1). Порт вывода информации. В изделии к нему подключены светодиоды (для индикации)
В ядре содержится четырехразрядный сумматор и мультиплексор для условий переходов.
А также у изделия есть 4 битный входной порт (Р2).
Все это тактируется генератором, а команды считаются двумя счетчиками (К155ИЕ7)
Чтобы соблюсти Фэн-шуй пришлось использовать микросхему ПЗУ К155РЕ3 объемом 32 байта, но пусть это будет для гуру-программистов, а для начинающих программеров оставлена возможность вместо К155РЕ3 подключить 2 штуки К556РТ4, а это аж целых 256 байт!!! (но это будет уже полная комплектация и как следствие 27 корпусов микросхем)
Полный список микросхем:
К155ЛН1 |
1 |
К155ИЕ4 |
1 |
К155ЛИ1 |
1 |
К155ЛЛ1 |
2 |
К155ЛП5 |
2 |
К155ЛП8 |
3 |
К155ИЕ7 |
2 |
К155ИР15 |
8 |
К155ИД10 |
2 |
К155РУ2 |
1 |
К155КП7 |
1 |
К155ИМ3 |
1 |
К155РЕ3 или К556РТ4 |
1
2 |
Инструкции состоят из 8 бит: первые 4 бита – куда записать, вторые 4 бита- что записать (показать содержимое регистра или число) или условие перехода или для вычитания.
Для написания программы был разработан компилятор с встроенным симулятором. В нем можно погонять программу наблюдая изменение регистров, ОЗУ и диаграмма порта. Компилятор писался максимально похожим на Assembler, но со своей спецификой. Ну я думаю, что боги Ассемблера, в комментариях, укажут мне на мои ошибки.)

Команды на языке Assembler:
Числами из ПЗУ оперируют только 3 регистра:
ROMa1, ROMa2 – адреса смещения в программе. Это числа, но для удобства в компиляторе используются символьные метки, которые при компиляции подменяются числами.
BUF – буфер через который число попадает в ядро и становится доступным регистрам и ОЗУ.
mov roma1, метка
mov roma2, метка
mov buf, число
Варианты команд взять из одного регистра и положить в другой:

Сумматор постоянно складывает содержимое аккумулятора (A) и ОЗУ на которую указывает регистр адреса ОЗУ (ADR)
Команды записывают сумму аккумулятора и ОЗУ (использовать значения, расположенные по адресам 8-15) в указанный регистр:
команды сложения

Команды записывают разность аккумулятора и ОЗУ (использовать инвертированные значения расположенные по адресам 0-7) в указанный регистр:
команды вычитания

Команды переходов:

Проверка работы на разных частотах показала, что на частоте кварца 4,608 МГц работает стабильно. Возможно будет и на более высоких частотах. Просто у меня нет кварца чуть-чуть скоростнее, а при 8,8 МГц. ЭВМ уже не работает.
Код для «ногодрыга»:
mov roma1, start //указываем координаты для переходов на метку start
mov roma2, start //указываем координаты для переходов на метку start
mov buf,1 //1 в буфер
mov r1,buf //переносим 1 из буфера в регистр R1
mov buf,0 //0 в буфер
start:
mov p1, r1 //отправить в порт 1 (содержимое регистра r1)
mov p1,buf //отправить в порт 0 (содержимое регистра buf)
jmp //повторим
При частоте кварца 4,608 МГц, на выходе получается меандр с частотой 768 КГц. Как тебе такое, Илон Маск?)))
Изначально испытания проводил с использованием микросхемы flash памяти. После устранения всех ошибок в работу вступили «старички» К155РЕ3 и К556РТ4. Кстати микросхемы ПЗУ К155РЕ3 и К556РТ4 прожглись без проблем. Что меня очень сильно удивило. То ли партия хорошая попалась, то ли наговаривают на них.
Программировал простейшим ручным программатором.

Если закрыть глаза на комплекс недостатков, то Ахиллесовой пятой ЭВМки можно назвать малый объем ПЗУ. И вот я терзаюсь: может надо было убрать РОН R2 из ядра и поставить его на адресацию ПЗУ. Это дало бы возможность адресации ПЗУ до 4кб.
И отсутствие таймера, что тоже в некоторой степени осложняет написание программы.
Каждой микросхеме по конденсатору! Это не про нас.)))
По-моему, получился неплохой подарок для программиста. А начинающим можно пошагово изучать принцип работы ЭВМ. Проект открытый. Все исходники прилагаются. Вот такой вот «убийца Raspberry Pi» получился. Кстати назвал его «Берёста», правда без Pi.)))
немного видео:
Содержание архива:
папка КАнютаASM - компилятор (файл EXE, исходник на Python, примеры)
папка BIN - содержит коды прошивок для ПЗУ
beresta_simulation.DSN -симулятор Proteus
Симулятор немного отличается от оригинальной схемы, что никак не влияет на функционал. Выходы ОЗУ 155РУ2 (7489) дважды инвертируются. Вместо РЕ3 или РТ4 используется ПЗУ 2764. И главное, чтобы симуляция запустилась не забываем в свойствах микросхемы ПЗУ 2764 выбрать файл прошивки. Примеры прошивок лежат в папке BIN.
beresta_schematic.BMP - принципиальная схема Берёста-4
programmator.BMP - принципиальная схема программатора
берёста4.LAY6 - печатная плата (Sprint Layout)
описание БерЁста.DOCX - описание инструкций Берёста-4
ссылка на архив Яндекс Диск.
https://disk.yandex.ru/d/yVwu1Q39LSZc3g
ссылка на github
Автор: Попов Николай