Entry tags:
Микро-БЭСМ: план разработки
Год назад я закончил разработку процессора микро-БЭСМ. Проект не получил никакого резонанса в социуме, тем не менее надо будет когда-нибудь довести его до реализации в железе. К примеру на плате DE10-Lite с чипом Altera MAX 10. Получится нечто вроде Arduino, но с системой команд типа БЭСМ-6.

Путь долгий, впрочем. Главное препятствие - теговая архитектура памяти, которая плохо ложится на современную шину адрес/данные. Стоит задача переделать архитектуру и перенести нужные биты из тега (на каждое слово) в регистры приписки (на каждую страницу). Совместимость со старым софтом обеспечивать не нужно, ведь его всё равно нету.
План следующий.
1. Создать ассемблер , который бы работал под Линуксом и понимал системы команд 64-битного режима и 48-битного (бэсм6).
2. Переписать имеющийся комплексный тест на новый ассемблер.
3. Разбить огромный комплексный тест на отдельные составляющие, для упрощения тестирования и модификации.
4. Поправить архитектуру: перенести бит режима бэсм6 и биты защиты в таблицу страниц (регистры приписки).
5. Поправить соответствующие тесты.
6. Изменить процессор (RTL) нужным образом.
7. Изменить микрокод. Поправить тесты микрокода.
8. Изменить внешнюю шину (RTL) так, чтобы она стала совместимой с реализацией на FPGA.
9. Добавить интерфейс к внешней памяти RAM. На плате DE10-Lite её как раз 8 мегабайт.
10. Переделать контроллер прерываний.
11. Добавить периферийные устройства: внешние кнопочки, светодиоды и UART.
12. Запустить на реальной плате.
Как заработает, дальше набор внешних устройств можно расширять: SD-карточка, графический дисплей, SPI, PWM и т.д. Параллельно неплохо бы еще сделать софтверный симулятор на основе SIMH: сильно помогает в отладке софта.

Путь долгий, впрочем. Главное препятствие - теговая архитектура памяти, которая плохо ложится на современную шину адрес/данные. Стоит задача переделать архитектуру и перенести нужные биты из тега (на каждое слово) в регистры приписки (на каждую страницу). Совместимость со старым софтом обеспечивать не нужно, ведь его всё равно нету.
План следующий.
1. Создать ассемблер , который бы работал под Линуксом и понимал системы команд 64-битного режима и 48-битного (бэсм6).
2. Переписать имеющийся комплексный тест на новый ассемблер.
3. Разбить огромный комплексный тест на отдельные составляющие, для упрощения тестирования и модификации.
4. Поправить архитектуру: перенести бит режима бэсм6 и биты защиты в таблицу страниц (регистры приписки).
5. Поправить соответствующие тесты.
6. Изменить процессор (RTL) нужным образом.
7. Изменить микрокод. Поправить тесты микрокода.
8. Изменить внешнюю шину (RTL) так, чтобы она стала совместимой с реализацией на FPGA.
9. Добавить интерфейс к внешней памяти RAM. На плате DE10-Lite её как раз 8 мегабайт.
10. Переделать контроллер прерываний.
11. Добавить периферийные устройства: внешние кнопочки, светодиоды и UART.
12. Запустить на реальной плате.
Как заработает, дальше набор внешних устройств можно расширять: SD-карточка, графический дисплей, SPI, PWM и т.д. Параллельно неплохо бы еще сделать софтверный симулятор на основе SIMH: сильно помогает в отладке софта.
no subject
А где можно посмотреть "правильный" синтаксис этого ассемблера. Я пока разбирался с БЕМШ насчитал аж 3 диалекта (если можно так сказать). И как будет изменяться синтаксис этого ассемблера, если будет ассемблироваться программа для БЭСМ-6? Каков формат HEX файла, который должен выдавать ассемблер?
Может стоит за основу взять самый популярный вариант современно синтаксиса ассемблера и добавить только мнемоники от БЭСМ? Мнемоники в английском варианте я видел, а вот откуда они пошли от какой машины?
Нельзя ли для реализации тегированной памяти для хранения тегов использовать, например, внутреннюю память FPGA? А если её мало, то использовать не 8Мбайт, а только 1Мбайт адресуемой внешней памяти?
Если будем менять микрокод, то понадобиться еще и кроссассемблер микрокода? Есть ли пример (маленький) микрокода в виде теста? Какой объем памяти микропрограмм?
no subject
Насчёт ассемблера. Диалектов было много, это верно. Я бы взял за основу стиль современного юниксного ассемблера. У меня сохранились исходники ассемблера для Эльбруса-Б, можно начать с него (https://github.com/besm6/micro-besm/blob/master/toolchain/as/as.c). Проще всего выдавать бинарник в формате a.out, и потом отдельно конвертировать его в HEX для загрузки в FPGA. Потом разберёмся. Формат a.out даят возможность приспособить линкер.
Синтаксис примерно такой: https://github.com/besm6/micro-besm/blob/master/toolchain/lib/u_mod_u.s
Можно немного осовременить в мелочах. Переключать в режим бэсм6 и обратно можно псевдокомандами типа ".set besm6" и ".set microbesm". При этом меняется набор доступных машинных команд и разрядность операндов и адреса.
Таблицы машинных команд можно генерить автоматически, из скрипта на питоне. Я подготовил исходные данные в формате JSON: команды бэсм6 (https://github.com/besm6/micro-besm/blob/master/doc/opcodes/besm6.json) и команды 64-битного режима (https://github.com/besm6/micro-besm/blob/master/doc/opcodes/native.json).
Английские мнемоники пошли от автокода MADLEN для той же БЭСМ-6. Подробности есть в мемуарах автора, Анатолия Ивановича Волкова: http://retro.wm.ru/retr2.htm
no subject
Как-то приспособить внутреннюю память под теги можно было бы, но вряд ли оно того стоит. Просто растранжиривание ресурса получается. Лучше использовать внутренние блоки BRAM как дополнительную быструю память. Большой пользы от тегов всё равно нету. По сути от тега нужен единственный бит, который задаёт режим besm6/native. Но такой признак не нужен на каждой слово памяти. Достаточно разнести 48-битный и 64-битный код на разные страницы памяти и иметь признак в таблице страниц.
no subject
Кросс-ассемблер микрокода я сделал: https://github.com/besm6/micro-besm/tree/master/microcode/mcasm
Пример микрокода: https://github.com/besm6/micro-besm/blob/master/microcode/melcom.src
Кое-какое описание языка микрокода есть здесь: https://github.com/besm6/micro-besm/wiki/Microcode-Assembler
Объем памяти микропрограмм - 4096 слов по 112 бит. Сейчас занято 2391 слово, то есть 58%.
Трансляция микрокода делается так: