Давайте покажу, как у меня работает
универсальная унарная операция над R1.
Напоминаю, что это опкод ONttt, и оно осуществляет потритовую операцию. Сама логика работы очень простая:
если у нас число
Q (состоящее из трёх тритов
Qhi Qmi Qlo), и есть младшие три трита опкода
OC3 OC2 OC1, то можно получить результирующее трёхтритное число
A следующим образом:
Ещё раз:
OC задаёт команду,
Q - параметр,
A - результат. Если с
OC понятно, просто берём младшие три трита из регистра команд, то число
Q нужно получить из ячейки
R1 оперативной памяти. Посему чисто этой схемы не хвататет, нужно ещё немного синхронизации с внешним миром.
Напоминаю, что декодер инструкций нам даёт входящий сигнал
EN_OP (нужно включить этот кусок АЛУ, когда этот сигнал равен -1). Тогда на адресный вход нашей оперативки можно подать адрес
OOP при условии, что
EN_OP=-1:
Это нам гарантирует, что два разных куска АЛУ не обратятся одновременно к разным кускам памяти, создав короткое замыкание на адресной линии. Таким образом, входы мультиплексоров, висящие в воздухе (обозначены как n.c.) - это очень важная часть схемы.
Линии
Q нам экранировать не надо, т.к. они идут только на чтение. А вот линии
A для сохранения результата и линию клока памяти
C (напоминаю, память сохраняет по нисходящему клоку P-O-N) нужно тоже аккуратно экранировать от неосторожного включения в неподходящий момент.
То есть, полная схема универсальной унарной операции над R1 выглядит следующим образом:
Здесь чёрными показаны мультиплексоры, выполняющие непосредственно вычисления, а синим мультиплексоры, занимающиеся синхронизацией сигналов. Обратите внимание, что сигнал
CLK пропускается на тактовый вход оперативки только в третьем цикле инструкции. То, что я применил память с запоминанием по фронту, позволяет мне спокойно и читать, и писать в одно и то же место памяти.
Итого пять с половиной тримуксов на полный срез АЛУ, занимающийся потритовой унарной операцией.