Оптимизации АЛУ
Apr. 8th, 2019 12:37 pmПосле переписывания дорогих команд сборки, разборки и сдвига в многотактный вид и исправления нормализации вправо инвертированных мантисс (прибавлять младший бит инверсии можно по ходу нормализации, и в окончательном суммировании РМРу участвовать больше не нужно) всё стало гораздо компактнее:
Коммит будет сегодня вечером.
There are 31 levels of combinational cells
2-input LUTs: 309
3-input LUTs: 231
4-input LUTs: 228
5-input LUTs: 375
6-input LUTs: 726
Total LUT area: 1869
State : 204
(FF) : 204
CARRY4 : 132
DSP : 6
Коммит будет сегодня вечером.
no subject
Date: 2019-04-08 11:47 pm (UTC)Механизм прерываний может быть, например, такой: при возбуждении любого прерывания формируется слово: 15-1рр: М20, 30-16рр - адрес возврата, 47-42рр - режимы, 48р - признак правой команды, остальное - для маски прерываний. С этим словом выполняется как бы ЗП (М17).
ВЫПР, соответственно, будет работать как бы как МОД + РЖ + еще кое-что. Магазинность аналогична МОД.
no subject
Date: 2019-04-09 05:41 am (UTC)Не хотелось бы при прерывании трогать стек пользователя, и вообще ходить в память. Мы как-то уже обсуждали на Гитхабе: https://github.com/besm6/mesm6/issues/3#issuecomment-475087151
Есть идея ввести для режима прерываний/экстракодов отдельный набор регистров K[1]...K[15]. В режиме пользователя (после ВЫПР) возможны обращения только к M[1]...M[15]. При переключении в режим прерываний обращения идут к регистрам K[1]...K[15]. Из режима прерываний можно читать-писать регистры пользователя командами ITA/ATI, обращаясь к ним как к регистрам K[17]...K[31].
Преимущества:
Обработчики прерывания имеют отдельный стек, задаваемый регистром K[15].
Не надо упрятывать регистры в стеке. Ускоряется обработка прерываний. Достаточно упрятать сумматор и РМР.
Не нужны дополнительные регистры для сохранения информации о прерывании. Например, прерванный счётчик команд PC прячется в K[1], регистр режимов пользователя - в K[2], исполнительный адрес экстракода - в K[3].
no subject
Date: 2019-04-09 06:11 am (UTC)no subject
Date: 2019-04-09 06:16 am (UTC)Что делать с текущим К1 при вызове вложенного экстракода?
Можно сделать Экстракоды так чтобы они всегда выталкивали полный текущий PC_next по адресу [K15--], а команда ВЫПР возвращалась на [++K15]. При необходимости, программное выталкивание К2, К3 прописать в "соглашении о программных вызовах".
no subject
Date: 2019-04-09 07:05 am (UTC)Напомню, что стек в БЭСМ-6 растёт в сторону увеличения адресов, и 15-й регистр указывает на первую свободную ячейку стека. Поэтому push - это присваивание mem[M15++], а pop - это чтение из mem[--M15].
no subject
Date: 2019-04-10 04:57 am (UTC)no subject
Date: 2019-04-10 01:45 pm (UTC)Есть мысль, чтобы процессор ходил в память через арбитр как в БЭСМ6, что позволит реализовать подсистемы блочного ввода/вывода с SD-карты, Ethernet (через шилд от ардуины), UART (протокол похожий на SLIP). Обращение к регистрам ввода/вывода сделать через команду УВВ (033), запрет/разрешение прерываний по маске через РЕГ 002.
no subject
Date: 2019-04-10 04:55 am (UTC)