nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Периодическая таблица команд АЛУ

Хоть убейте, не хочу делать микрокод!

И похоже, не придётся: несколько наиболее укуренных команд я выкинул, и оказалось, можно без них обойтись, от этого размер кода вырос с 302 слов (по 16 бит) до 307 слов, а функциональность ничуть не поменялась. А все остальные худо-бедно удалось систематизировать:




Шина DestAddr (адрес получателя) имеет ширину 8 бит, то есть всего доступно 256 адресов. Их нужно более-менее справедливо поделить между тремя модулями:
- QuatCoreMem: доступ к оперативной памяти с регистрами косвенной адресации,
- QuatCorePC (program counter): организация условных переходов, циклов, вызова функций,
- QuatCoreALU - им сейчас и занимаемся...

Ещё один "особенный" адрес - нулевой, который должен принадлежать /Dev/Null. Возможно, и без него обойдёмся, а пока он один раз упомянут. Также была идея отдать пока что пустующие 127 адресов (от 1 до 127) на прямую адресацию к памяти, но особой необходимости пока не чувствуется.

Сейчас ясно, что на QuatCoreMem надо выделить хотя бы 64 адреса, и ещё хотя бы 32 адреса нужно для QuatCorePC. На АЛУ мы тоже пока что выделили 32 адреса, чего должно хватать, ибо реально задействованных инструкций всего 18.

Адреса распределены между модулями следующим образом:
0xxxxxxx - /dev/null,
100xxxxx - ALU
101xxxxx - PC
11xxxxxx - MEM

Для указания команды у нас 5 бит. Самый старший у нас будет разделять команды умножения (когда 1) и все остальные (0). Между ними отчётливая разница - команды умножения выполняются за 17 или 18 тактов, причём в 15 из них все управляющие воздействия остаются неизменными. Все остальные команды выполняются за 1..3 такта.

Младшие два бита на удивление хорошо разделили все команды на 4 категории:

00: аккумулятор обнуляется, ответ зависит только от регистров B,C,
11: идёт накопление со знаком "+",
10: идёт накопление со знаком "-",
01: идёт накопление, знак определяется проводом PM (Plus-Minus).

И остаётся ещё 2 бита. Здесь провести совсем чёткое разделение уже не получается, но определённые закономерности всё ещё есть:

00: нормальная работа, все числа знаковые,
01: инициализация регистров (короткие команды) / работа без знака (умножения),
10: взятие модуля (короткие команды) / знаковый регистр B и беззнаковый C (умножения),
11: регистр B дополнительно делится на 2 (сдвигается вправо на единичку).

Серым мы выделили команды, которые в данный момент не задействованы, хотя они довольно логически здесь получаются. На пустых полях, возможно, тоже получатся осмысленные команды, хотя понять логику второй строки я пока не могу.

Попробовал выписать последовательность управляющих воздействий:


Вроде бы не так уж страшно.

Очень хочется этот процессор домучать до нового года! Не так давно хотел его закончить до своего дня рождения (24.10), но потом решил, что дата 24 октября должна немножечко напомнить, что бывает, когда пытаешься поспеть к некоей красивой дате, и лучше всё-таки работать в своём темпе.
Tags: ПЛИС, математика, работа, странные девайсы
Subscribe

  • Нахождение двух самых отдалённых точек

    Пока компьютер долго и упорно мучал симуляцию, я пытался написать на ассемблере алгоритм захвата на ближней дистанции. А сейчас на этом коде можно…

  • Слишком общительный счётчик

    Вчера я чуть поторопился отсинтезировать проект,параметры не поменял: RomWidth = 8 вместо 7, RamWidth = 9 вместо 8, и ещё EnableByteAccess=1, чтобы…

  • Балансируем конвейер QuatCore

    В пятницу у нас всё замечательно сработало на симуляции, первые 16 миллисекунд полёт нормальный. А вот прошить весь проект на ПЛИС и попробовать "в…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 3 comments