Lavr wrote:Обдумываю возможность реконструировать Gigatron в недо-RISC-компьютер принстонской архитектуры,
чтобы была возможность исполнять его собственную систему команд из ОЗУ, а ПЗУ команд включить в карту
памяти в качестве Монитора, ну или BIOS.
В общем-то сама идея тут достаточно проста и понятна: если в
ПЗУ команды и данные следуют друг за другом,
то в том случае, когда
декодер команды (в
Control Unit) обнаруживает
код, которму необходимы данные,
то есть,
двухбайтную команду, он должен
перенаправить строб записи в регистр данных, а у
регистра
команд строб записи в этот момент заблокировать.
Честно говоря, это всё можно уложить в один такт, но есть одно усложняющее обстоятельство.
В существующей схемотехнике
команда и данные появляются одновременно и
за первую четверть такта должно
успеть сработать АЛУ, поскольку после первой четверти такта происходит запись результата на выходе АЛУ
в один из регистров или аккумулятор. Этого не избежать - данные всегда проходят через АЛУ, даже если надо
всего лишь записать их в регистр или память.
Запись в память начинается с середины такта, так что временн
Ые привязки в такте довольно жесткие.
Поэтому я решил ввести дополнительный такт для чтения данных в двухбайтной команде.
В этом случае
диаграмма по тактам будет следующая: в начале такта
код команды фиксируется в
регистр команд,
программный счетчик РС при этом указывает уже на
следующий байт в ПЗУ - следующая
команда или
данные
для текущей команды.
Если
декодер команды (в
Control Unit) обнаружил
код, которму необходимы данные (
двухбайтную команду),
он блокирует импульсы записи в
регистры и
ОЗУ, и перенаправляет строб записи в
регистр данных.
После того, как
данное зафиксировано, выполняется обычный такт ЦПУ с этим данным и командой.
Аппаратно пришлось несколько схитрить, поскольку "
вставить такт" схемотехникески получалось громоздко.
И я решил не "
вставлять такт", а наоборот - "
блокировать ненужный".
Схемотехнически получилось весьма просто:
SelDat.gif
Первоначально на выход
ПЗУ подключены
оба регистра - команд и данных, но запись в них осуществляется через
мультиплексор, которым управляет дополнительный
D-триггер U8:A, включенный как
счетчик до двух.
Если ничего не подключить дополнительно, то работать эта схема будет так:
четный байт записывается
в
регистр команд, а
нечетный - в
регистр данных.
Эту логику корректирует
детектор двухбайтного кода U7:A (
code detector). Для простоты эксперимента принято, что
команды типа
xxxx.xx11b - двухбайтные. Поэтому
детектор двухбайтного кода запрещает переключаться счетчику
U8:A для всех команд, кроме двухбайтных.
Поскольку команда типа
xxxx.xx11b - каждая четвертая, на осциллограмме видно, что лишь
каждый четвертый
импульс CLK1 перенаправляется в регистр данных и блокируется для регистра команд.
SelDiag.gif
Если внимательно посмотреть проект:
SelDat.zip
то можно увидеть откуда у данной схемы такая
необычная фишка:
выполнить команду после инструкции перехода JMP,
ту, что была прямо за ней по коду.
Дело в том, что
счетчик типа 74LS161 - полностью синхронный, и когда выполняется
команда JMP,
на выходе ПЗУ
приготовлена уже эта самая
следующая команда.
Команда JMP выставляет на входы счетчиков
адрес перехода и
устанавливает разрещение параллельной записи, но
счетчик 74LS161 - полностью синхронный, поэтому
адрес
перехода запишется в него только по фронту CLK1, но этот же фронт защелкнет в
регистр команд тот байт, который
уже был на готове, то есть
байт,
непосредственно следующий за командой
JMP xxH.
Если применить
счетчики типа 74LS193 (
555ИЕ7), а я уже делал это в схеме для
регистра Х, то этого эффекта
не будет -
параллельная запись в счетчик типа 74LS193 -
асинхронна, не зависит от тактовых сигналов и
имеет над ними преимущество.
Другое дело, что совершенно понятно, почему в оригинальной схеме применены
счетчики типа 74LS161 - на
высокой
тактовой частоте 6.25 МГц все
4 счётчика РС переключаются строго одновременно, а
счетчики типа 74LS193 - не
полностью синхронные:
при каскадировании имеют задержку на каждый корпус.
Но мне кажется, в данной схеме это непринципиально, поскольку
считываем байт из ПЗУ мы всегда при установившемся
адресе, и по этому же фронту счетчик увеличивает своё значение - к следующему фронту наверняка уже будет
стабильно удерживать адрес.
You do not have the required permissions to view the files attached to this post.