![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Год назад я закончил разработку процессора микро-БЭСМ. Проект не получил никакого резонанса в социуме, тем не менее надо будет когда-нибудь довести его до реализации в железе. К примеру на плате 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
Date: 2018-01-23 05:38 (UTC)no subject
Date: 2018-01-23 05:49 (UTC)Это ведь не настоящий процессор.
no subject
Date: 2018-01-23 05:56 (UTC)По мне так теория и практика едины.
no subject
Date: 2018-01-23 06:59 (UTC)no subject
Date: 2018-01-23 15:25 (UTC)Все равно никто ферритовые кольца наматывать не будет, ФФЯ или там ФТЯ изготовлять.
no subject
Date: 2018-01-23 19:11 (UTC)Находятся любители ферриты мотать. :)
https://vak.dreamwidth.org/436231.html
no subject
Date: 2018-01-23 10:29 (UTC)А где можно посмотреть "правильный" синтаксис этого ассемблера. Я пока разбирался с БЕМШ насчитал аж 3 диалекта (если можно так сказать). И как будет изменяться синтаксис этого ассемблера, если будет ассемблироваться программа для БЭСМ-6? Каков формат HEX файла, который должен выдавать ассемблер?
Может стоит за основу взять самый популярный вариант современно синтаксиса ассемблера и добавить только мнемоники от БЭСМ? Мнемоники в английском варианте я видел, а вот откуда они пошли от какой машины?
Нельзя ли для реализации тегированной памяти для хранения тегов использовать, например, внутреннюю память FPGA? А если её мало, то использовать не 8Мбайт, а только 1Мбайт адресуемой внешней памяти?
Если будем менять микрокод, то понадобиться еще и кроссассемблер микрокода? Есть ли пример (маленький) микрокода в виде теста? Какой объем памяти микропрограмм?
no subject
Date: 2018-01-23 19:47 (UTC)Насчёт ассемблера. Диалектов было много, это верно. Я бы взял за основу стиль современного юниксного ассемблера. У меня сохранились исходники ассемблера для Эльбруса-Б, можно начать с него (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
Date: 2018-01-23 19:54 (UTC)Как-то приспособить внутреннюю память под теги можно было бы, но вряд ли оно того стоит. Просто растранжиривание ресурса получается. Лучше использовать внутренние блоки BRAM как дополнительную быструю память. Большой пользы от тегов всё равно нету. По сути от тега нужен единственный бит, который задаёт режим besm6/native. Но такой признак не нужен на каждой слово памяти. Достаточно разнести 48-битный и 64-битный код на разные страницы памяти и иметь признак в таблице страниц.
no subject
Date: 2018-01-23 20:02 (UTC)Кросс-ассемблер микрокода я сделал: 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%.
Трансляция микрокода делается так:
no subject
Date: 2018-01-30 02:56 (UTC)Ругалось на timeunit в каждом файле, я закоментил, собралось.
Такая статистика:
Для xc7a15tcpg236-3
no subject
Date: 2018-01-30 03:30 (UTC)На плату Arty A7 войдёт с большим запасом.
no subject
Date: 2018-01-30 03:57 (UTC)С телефона набираю полностью картинку не могу поставить
no subject
Date: 2018-01-30 04:23 (UTC)no subject
Date: 2018-01-30 04:45 (UTC)Да, я вижу эту проблему.
Возможно rcb тоже.
Исправить нетрудно.
no subject
Date: 2018-01-30 04:49 (UTC)no subject
Date: 2018-02-02 21:11 (UTC)Попробуй теперь.
no subject
Date: 2018-02-05 03:41 (UTC)Дальше разбираюсь с предупреждениями о combination loops в тракте АЛУ. Ну и получается также длинный путь в тракте АЛУ около ~300 нс.
Статистика по использованию LUT сильно меняется в зависимости от ограничений на сигналы IO (пока не знаю как их правильно задавать). Делал Autoassign IO ports получалось аж 9300 LUTs.
В общем надо какую-то конкретную отладочную плату/платформу рассматривать и читать по ней туториал.
Вы на DE10-lite будете запускать?
no subject
Date: 2018-02-05 04:22 (UTC)no subject
Date: 2018-01-30 04:50 (UTC)no subject
Date: 2018-01-30 10:04 (UTC)Исправлю завтра.
Дело не в языке, а в алгоритме синтеза. С точки зрения семантики всё правильно, и при симуляции никаких отрицательных эффектов не возникает. Но синтезатор любит, чтобы все изменения сигнала делались в одном операторе if/then/else, иначе ругается.