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.