Перевод этой страницы:
ru

Начало работы процессора

Весь процессор представляет собой охеренно сложную схему. Деление на верхнюю и нижнюю части весьма условное, поскольку во время работы все части работают одновременно.

Ниже приводится "алгоритм" начала работы процессора, по шагам.

Трудности

При изучении схемы процессора возникли трудности в понимании - с чего же конкретно начинается работа. Долгое время не удавалось "зацепиться" за что-то и выходило примерно так: для работы узла A требовались контрольные линии с узла B, на который приходят линии с узла C. Но в свою очередь на узел C приходят контрольные линии с узла A. Получается долбаный круговорот :-)

Однако вскоре стало понятно, что отправной точкой является регистр инструкций (IR), поэтому изучение работы нужно начинать именно с него.

Было несколько попыток взять процессор "наскоком", но ничего не получалось до тех пор, пока я не придумал применить следующие 2 трюка :

  • Принимая во внимание, что процессор работает полутактами - мы разделяем работу схемы на 2 части : во время PHI1 и во время PHI2. При этом часть защелок замечательным образом "блокируется" и долбаного круговорота не возникает
  • Распространение контрольных сигналов изучаем так называемым методом "back-propagation", то есть проще говоря - "задом-наперед". Это позволяет нам последовательно исключать зависимости контрольных сигналов друг от друга.

PHI1

Разберем наиболее критичные части процессора, которые работают во время фазы PHI1. Взглянем на общую картину:

6502_phi1.jpg
(транзисторная схема немного старая, часть контрольных линий называются немного по другому, но сути не меняет)

Ну и понеслась.. Смотрим что требуется для работы схемы IR : phi1_ir.jpg
Это сигналы FETCH и значения с защелки PD.

Защелки PD загружаются с внешней шины данных во время PHI2, а для схемы FETCH требуется значение защелки T1 и текущего значения флага B. При этом если флаг B=0, то это форсирует выдачу нуля (код операции BRK), вместо текущего значения PD. Параллельно в схеме predecode мы получаем 2 контрольные линии /TWOCYCLE и /IMPLIED.
phi1_fetch_pd.jpg

Следовательно теперь нам нужно получить значение флага B:
phi1_bflag.jpg

Для этого нам нужно получить 2 контрольные линии : BRK6E (еще я называю её BRKDONE) и DORES. Значение флага B получается с его выходной защелки.

Схемы получения контрольных сигналов BRKDONE и DORES находятся в схеме контроля прерываний: phi1_brkdone.jpg phi1_dores.jpg
При этом нам тут впервые понадобится глобальный контрольный сигнал /ready.

Перемещаемся на схему READY CONTROL и замечаем, что сигнал /ready просто выходит с защелки:
phi1_ready_out.jpg

Теперь мы получили все нужные сигналы и можем загрузить регистр инструкций новым значением.

Тайминг

Вторая критическая часть - это счетчики циклов, которые необходимы для работы декодера. Вот здесь и возникала главная загвоздка - для получения контрольных сигналов TX были необходимы результаты работы декодера, а для работы декодера требуются эти самые значения TX.

Но после разграничения работы процессора на два полутакта всё стало понятно.

Для начала получим контрольные сигналы /T0 и /T1X ("младший" счетчик циклов):
phi1_tlow.jpg
Для работы этой схемы требуется сигнал /ready, которые мы уже получили, а также значения с трёх защелок : TWOCYCLE, TRES1 и TRESX. Значение TWOCYCLE у нас уже есть, после работы схемы predecode, поэтому остались только TRES1 и TRESX.

TRESX

Для начала рассмотрим зависимости схемы TRESX:
phi1_tresx.jpg
Для её работы требуются сигналы REST и ACRL2.

Схема ACRL самодостаточная, для её работы требуется только выходное значение ACR с АЛУ и значение с защелки задержки /ready:
phi1_acrl.jpg

Перемещаемся в нижнюю часть процессора, где находится АЛУ и получаем выходное значение ACR с двух защелок BinaryCarry и DecimalCarry:
phi1_acr_out.jpg

А вот сигнал REST - это ключевой момент, где не обошлось без хорошего косячка. Дело в том, что для получения сигнала REST - требуются выходные линии с декодера. Но ведь мы ещё не получили линии TX чтобы выполнить декодирование! Без паники: нужные нам линии не требуют значений TX, им нужно только текущее значение IR, которое мы уже получили :-)
phi1_rest.jpg
Параллельно мы обновляем схему READY и получаем контрольную линию WR, которая идёт на контакт R/W и в DATA LATCH.

"Старший" счетчик циклов

После получения сигнала TRESX мы можем сформировать сигнал TRES2, необходимый для работы "старшего" счетчика циклов (который выдает наружу линии /T2-/T5):
phi1_tres2.jpg phi1_thigh.jpg

TRES1

Схема TRES1 требует сигнал ENDS, который получается из двух выходных защелок. Попутно получаем сигнал T1 :
phi1_tres1.jpg

Но кроме этого, для получения TRES1 необходимо выполнить схему PROGRAM CONTROL, где также параллельно получается контрольная линия 1/PC, из текущего значения флага B и контрольной линии IMPLIED, которую мы получили в логике predecode:
phi1_program_control.jpg

Работа схемы PROGRAM CONTROL в свою очередь зависит от работы схемы BRANCH FORWARD, которая выбирает направление перехода (тут она почему то называется BRANCH BACK :-)) :
phi1_brfw.jpg

В этом месте произошёл очередной затуп, который потребовал очередного косячка и пересмотра взглядов на мировоззрение. Дело в том, что для работы схемы выбора направления перехода требуется значение с внутренней шины данных (DB). А консервативный мозг хотел красиво выполнить вначале верхнюю часть процессора, а потом нижнюю, где получается значение шины DB. Хрена с два! :-)

Получение текущего значения с шины DB

Во первых нужно напомнить, что на шину может пихать своё значение только один "девайс", иначе возникает так называемый конфликт шин. "Девайсы" 6502, которые могут помещать своё значение на шину DB:

  • DATA LATCH
  • Аккумулятор
  • PCH и PCL (program counter)
  • Флаги
  • А также шина DB может соединяться с шиной SB, на которую могут помещать свои значения регистры X, Y, S.

Процессом соединения "девайсов" и шин управляют специальные управляющие линии - драйверы. Замечаем, что эти линии выходят из специальных защелок, которые открываются только во время PHI2. Оно то нам и надо!

phi1_drivers.jpg

Это позволяет нам забить на верхнюю часть процессора, где формируются эти управляющие сигналы.

В плане соединения регистров с шинами SB и DB проблем особых нет - их текущее значение просто выдается с выходной защелки. Главное следить за возможными конфликтами шины (а они наверняка бывают, например в самый первый полутакт - все контрольные команды драйверы = 1, потому что их выходные защелки = 0).

Но не это самое страшное. Очередной затуп случился, когда стало понятно, что тут могут вклиниться флаги :-)

Флаги

Команды контроля флагов перегружаются также во время PHI2, поэтому выходные значения флагов мы можем легко получить и выдать на шину DB:
phi1_flag_control.jpg

В результате все части складываются в одно целое :-)

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

6502/phi1.txt · Последние изменения: 2013/08/23 14:38 — org
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: Public Domain
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki