Я предлагаю сделать контроллер прерываний для МЭСМ-6 по мотивам одной из известных ардуинной публике архитектур. Упростить и адаптировать к 48-битному слову. Из опыта разработки RTOS для этих чипов, мне лично по душе подход PIC32.
Ограничимся 48 внешними прерываниями.
Введём регистр активных прерываний РАП, отдалённый аналог бэсмовского ГРП. Единица в каком-то бите означает, что поступил соответствующий сигнал прерывания. Единица "залипает", пока не будет сброшена софтом.
Введём регистр маски разрешённых прерываний РМРП, аналогичный бэсмовскому МГРП. Если бит маски установлен в единицу, и в регистре активных прерываний тоже стоит единица в этом бите, то на вход процессора будет подан запрос прерывания.
Выделим для этих регистров по два дополнительных адреса: "установка в 1" ии "установка в 0". Запись битовой маски по первому адресу уставливает эти биты в единицу, записо по второму адресу сбрасывает их в 0.
Введём регистр номера текущего прерывания РНП (только чтение). На каждом такте проверяем, если есть активные прерывания (РАП) и разрешены ли они (РМРП). В этом случае заносим номер самого старшего бита в РНП и активируем глобальный сигнал прерывания для процессора.
Для каждого прерывания выделим отдельный адрес обработчика, скажем 0100-0157. Адреса ниже 0100 будут заняты отработчиками экстракодов.
Ориентировочый список внешних прерываний:
1. Таймер 0.
2. Таймер 1.
3. Блок GPIO, включая внешние сигналы прерываний.
4. Сторожевой таймер.
5. Асинхронный порт UART 0.
6. Асинхронный порт UART 1.
7. Порт SPI 0.
8. Порт SPI 1.
9. Порт I2C 0.
10. Порт I2C 1.
Ограничимся 48 внешними прерываниями.
Введём регистр активных прерываний РАП, отдалённый аналог бэсмовского ГРП. Единица в каком-то бите означает, что поступил соответствующий сигнал прерывания. Единица "залипает", пока не будет сброшена софтом.
Введём регистр маски разрешённых прерываний РМРП, аналогичный бэсмовскому МГРП. Если бит маски установлен в единицу, и в регистре активных прерываний тоже стоит единица в этом бите, то на вход процессора будет подан запрос прерывания.
Выделим для этих регистров по два дополнительных адреса: "установка в 1" ии "установка в 0". Запись битовой маски по первому адресу уставливает эти биты в единицу, записо по второму адресу сбрасывает их в 0.
Введём регистр номера текущего прерывания РНП (только чтение). На каждом такте проверяем, если есть активные прерывания (РАП) и разрешены ли они (РМРП). В этом случае заносим номер самого старшего бита в РНП и активируем глобальный сигнал прерывания для процессора.
Для каждого прерывания выделим отдельный адрес обработчика, скажем 0100-0157. Адреса ниже 0100 будут заняты отработчиками экстракодов.
Ориентировочый список внешних прерываний:
1. Таймер 0.
2. Таймер 1.
3. Блок GPIO, включая внешние сигналы прерываний.
4. Сторожевой таймер.
5. Асинхронный порт UART 0.
6. Асинхронный порт UART 1.
7. Порт SPI 0.
8. Порт SPI 1.
9. Порт I2C 0.
10. Порт I2C 1.
no subject
Date: 2019-04-15 10:40 pm (UTC)no subject
Date: 2019-04-15 11:02 pm (UTC)no subject
Date: 2019-04-16 01:44 am (UTC)Единственная лажа, от которой действительно стоит избавиться - это различие между гасимыми и негасимыми разрядами.
no subject
Date: 2019-04-16 02:20 am (UTC)no subject
Date: 2019-04-16 02:41 am (UTC)Хорошее решение.
То есть мы всё таки отказываемся от команд РЕГ (для обращения к спец. регистрам УУ (процессора)) и УВВ (для обращения к периферийным регистрам) ? И делаем всё обращение к системным регистрам через ATX, XTA(и др. AEX,AOX и т.д.) через MMU?
no subject
Date: 2019-04-16 02:55 am (UTC)no subject
Date: 2019-04-17 04:26 am (UTC)no subject
Date: 2019-04-17 04:46 am (UTC)Микрокод будет просто тогда по прерыванию заходить в один вектор и передавать управление на адрес 0100.
По адресу 0100 будет будет лежать тогда utc РНП, UJ 0101. РНП когда нету активных запросов на прерывания будет давать 0.
Так нормально?
Единственное, что тут еще вылезло. Посмотрел какие бывают штны - AHB-lite, APB, SBA.
На fpga получается все read шины slave'ов собирают в один "жирный" такой мультиплексор - это нормально? Или надо сделать все выходы slave'ов с output enable с третьим состоянием?
no subject
Date: 2019-04-17 04:55 am (UTC)Решение для шины AHB-lite можно подсмотреть в MIPSfpga+ и SchoolMIPS:
https://github.com/MIPSfpga/mipsfpga-plus
https://github.com/MIPSfpga/schoolMIPS
no subject
Date: 2019-04-16 08:07 am (UTC)no subject
Date: 2019-04-16 09:02 am (UTC)no subject
Date: 2019-04-16 02:19 pm (UTC)no subject
Date: 2019-04-16 06:35 pm (UTC)В нашем случае надо будет записывать 0001 в регистр "установка в 0".
no subject
Date: 2019-04-16 06:47 pm (UTC)no subject
Date: 2019-04-16 08:51 pm (UTC)Мы делаем современный микроконтроллер с архитектурой БЭСМ-6.
no subject
Date: 2019-04-16 10:59 pm (UTC)no subject
Date: 2019-04-17 02:28 am (UTC)Похоже, у меня нескоро до FreePascal руки дойдут.
no subject
Date: 2019-04-18 12:15 am (UTC)С целым порядком, похоже, больших проблем не будет, потому что мест, где формируются полнословные целые константы, и порядок добавляется неявно, немного. Больше мест, где на целое число накладывается маска, содержащая порядок, и сравнивается с подобным же множеством. Но это явно видно, уже одно такое место я прошел.
Вот тебе задачка: как с минимальной кровью организовать доступ к переменным из объемлющих процедур?
no subject
Date: 2019-04-18 04:17 am (UTC)В GNU C можно объявлять вложенные функции. Поможет?
#include <stdio.h> int main() { const char *str; auto void print(); auto void print() { printf("%s", str); } str = "Hello World\n"; print(); return 0; }no subject
Date: 2019-04-18 04:50 am (UTC)Для простоты компилятор будет поначалу принимать только ASCII.
no subject
Date: 2019-04-18 04:54 am (UTC)В Си можно к переменным ходить из вложенного блока во внешний, наоборот - нельзя.
no subject
Date: 2019-04-18 05:36 am (UTC)Пара сотен последних сконвертированных строк пока чисто не компилируется.
no subject
Date: 2019-04-16 04:04 am (UTC)https://github.com/besm6/mesm6/projects/2
Теперь необходимо централизованно вести таблицу мапированных регистров, а так же их английских обозначений в исходном коде.
Адреса векторов помещаются в микрокод, поэтому не вижу сложностей реализации экстракодов.
Прыжок на вектор по прерыванию будет по адресу 0100+РНП. РНП = 0, для РАП == 0.
Если не делать теневые регистры К, и работу со стеком для сохранения адреса возврата, то работа внутри прерывания и экстракода ведется обязательно с выключенным gie. gie включается командой выхода из прерывания, которая работает одинаково для экстракодов и обычных прерываний.
no subject
Date: 2019-04-16 04:10 am (UTC)Если это не сделать, то тогда придется прыгать программно по схеме Леонида.
no subject
Date: 2019-04-17 06:52 pm (UTC)Регистрами К я займусь чуть позже. Тут по работе надо разгрести волну.
no subject
Date: 2019-04-18 02:53 am (UTC)Таже ситуация. Привезли "отечественное" κρиπто-железо. надо запуститьПоэтому я пока копипастить ahb-lite не буду. Использую то, что есть уже для шины у нас. Потом когда уже железо будет расширим сигналы и перенесем uart.
no subject
Date: 2019-04-18 03:56 am (UTC)Я поискал подходящий код для UART, и лучшее, что нашёл - реализация by Ruslan Lepetenok из проекта https://opencores.org/projects/avr_core.
Пока положил здесь: https://github.com/sergev/vak-opensource/blob/master/hardware/verilog/uart/uart.v