Uirh : другие произведения.

Универсальный масштабируемый магистральный интерфейс

Самиздат: [Регистрация] [Найти] [Рейтинги] [Обсуждения] [Новинки] [Обзоры] [Помощь|Техвопросы]
Ссылки:
Школа кожевенного мастерства: сумки, ремни своими руками
 Ваша оценка:
  • Аннотация:
    Описана системная магистраль для микропроцессоров А4 - аналог "общей шины", но во-первых позволяющий передавать слова произвольной разрядности, а во-вторых масштабируемый, причем имеющий даже при минимальной разрядности (всего 12 сигнальных линий!) практически ту же самую функциональность, что и более "широкие" конфигурации (но разумеется при существенно меньшей пропускной способности)

   Универсальный масштабируемый магистральный интерфейс.
   ред.3.02 komencis tajpi 15.06.03 18.00
  
   Настоящим описывается магистральный интерфейс, отличающийся от известных тем, что:
   - масштабируется: позволяет делать магистраль разной ширины. Но при этом меняется только пропускная способность. Набор функций остается неизменным даже для минимальной магистрали, включающей всего 12 сигнальных линий.
   - позволяет передавать данные, разрядность которых никак не связана с шириной магистрали.
   - позволяет соединять с помощью одной магистрали устройства, имеющие разную разрядность и быстродействие. (При этом медленные и малоразрядные устройства конечно будут замедлять работу магистрали.)
   Кроме того интерфейс позволяет делать магистраль неограниченной длины (по крайней мере до единиц и даже десятков метров), что позволяет объединять с её помощью не только отдельные микросхемы на печатной плате и не только блоки в вычислительной системе, но и соединять между собой несколько вычислительных систем, а так же подключать внешние устройства, такие как принтер или цифроуправляемые измерительные приборы. Именно в этом смысле интерфейс и является "универсальным". Разумеется, чем длиннее магистраль тем медленнее происходит обмен данными (по крайней мере "коллективные" операции).
  
   Как не трудно догадаться, интерфейс использует асинхронный принцип (типа "рукопожатие") и параллельно-последовательную передачу данных ("по-слогам").
   В первом приближении магистраль можно представить себе в виде плоского многопроводного кабеля некоторой ширины, к которому непосредственно (с помощью контактов, протыкающих изоляцию кабеля), подключены соединяемые магистралью устройства. (Или с помощью разъемов, но это только для отладки.) Первым и последним обязательно должны быть "концевые терминаторы". Ширина кабеля и количество контактов у разных устройств, объединяемых в единую систему может несовпадать - это не повлияет на работоспособность системы. Подобные вычислительные системы (предназначенные для управления чем угодно - от бытовой стиральной машины до станка с ЧПУ) предполагается собирать из набора интерфейсных и процессорных модулей как из деталей детского конструктора - просто складыванием в стопку контактами в одну сторону, стягиванием винтами в пакет (для прочности) и соединением кабелем. Разумеется интерфейсные модули должны иметь в своём составе всё необходимое для непосредственного управления исполнительными устройствами и взаимодействия с датчиками (включая гальваническую развязку, силовые ключи с подобающим теплоотводом и т.п.); процессорные модули - всё необходимое "для жизни", а дополнительные к ним, например электрически программируемое ПЗУ - встроенные аппаратные средства для работы с ним без каких бы то ни было внешних программаторов. Единственным инструментом, необходимым для обслуживания всех подобных управляющих вычислительных систем, должен быть аппаратный отладчик, подключаемый (в случае необходимости) к одному из концевых терминаторов магистрали. Вот для построения таких модульных вычислительных систем и придуман описываемый здесь магистральный интерфейс.
  
  *** 18.50 ***
  
   Все устройства, подключенные к магистрали, имеют выходы с открытым коллектором. На всех линиях магистрали (кроме линий "П" и обратных к ним) поддерживается (с помощью концевых терминаторов) "высокий" уровень, который считается логическим нулем. (Конкретная его величина зависит от реализации.) Логическая единица - (низкий уровень) получается если открыт хотя бы один из выходных транзисторов любого из подключенных к данной линии устройств. (Потому данная схема известна как "монтажное или"). Для увеличения быстродействия допускается использовать схемы ускоряющие переход из лог."1" в лог "0". (Например путем кратковременного подключения выхода к шине питания.) При реализации в виде плоского многопроводного кабеля сигнальные провода должны чередоваться с земляными.
   В каждый момент времени магистралью управляет ровно одно из подключенных к ней устройств. Оно называется "задатчик". Или ни одного - тогда магистраль считается "свободной". Задатчиком может стать любое устройство, подключенное к магистрали, выполнив процедуру её "захвата". Устройства, способные стать задатчиком будем называть "активными". Период времени от момента захвата магистрали некоторым активным устройством до её освобождения или захвата другим устройством (пусть даже тем же самым) будем называть "циклом задатчика". Захватив магистраль, задатчик может либо выбрать себе одно устройство в качестве "исполнителя", либо произвести передачу "сообщения" для всех устройств (или по крайней мере для тех, которые пожелают его принять). Период времени в течении которого задатчик передает сообщение будем называть "циклом передачи сообщения", а период времени от выбора исполнителя до выбора другого исполнителя (пусть даже того же самого) или до конца цикла задатчика - будем называть "циклом исполнителя". В цикл задатчика может быть вложено сколько угодно циклов исполнителя и только один цикл передачи сообщения (он должен быть там первым или единственным). Устройство, способное быть исполнителем, будем называть "пассивным". Как правило каждое устройство является и активным и пассивным одновременно. (Но не обязательно: например ОЗУ - только пассивное.)
   Исполнитель представляется задатчику либо как массив адресуемых ячеек памяти, либо как некоторое исполнительное устройство, способное выполнять команды, получать аргументы к ним и выдавать результат. Для обращения к первому используется "цикл передачи данных", а ко второму - "вызов аппаратной подпрограммы". В цикл исполнителя может быть вложено сколько угодно циклов передачи данных, а вызов аппаратной подпрограммы может быть только один (он должен быть первым или единственным).
   Цикл передачи данных начинается с того, что задатчик указывает адрес, после чего следует неограниченное количество циклов чтения и/или записи. Каждый из них пакетный - в нем передается в ту или другую сторону одно или больше слов данных. Адрес запоминается исполнителем и при переходе к следующему слову увеличивается (или уменьшается) автоматически. Собственно передача данных во всех других циклах (при обращении к аппаратной подпрограмме или при передаче сообщения) производится так же пакетным способом. Причем каждое передаваемое слово, если оно больше ширины шины данных, передается в виде последовательности слогов. Их размер согласуется в начале каждого цикла исполнителя или цикла передачи сообщения. Исполнитель (который является владельцем данных и знает точный размер передаваемого слова) управляет размером очередного слога, а задатчик указывает действие для каждого очередного шага цикла.
  
  *** 19.44 ***
  
   Магистраль включает четыре группы сигнальных линий:
   - 4 линии с помощью которых задатчик управляет магистралью. Сюда входят линия синхронизации активного устройства ("СА") и три линии, составляющие шину запросов активного устройства ("ЗА").
   - 4 линии с помощью которых пассивное устройство сигнализирует активному о своём состоянии. Сюда входят две линии синхронизации пассивного устройства ("СП" - СП0 и СП1) и две линии, составляющие шину ответа пассивного устройства ("ОП").
   - линии общего пользования, количество которых изменяется при масштабировании магистрали. Сюда входят: шина данных ("Д") по которой собственно и передается информация; шина сопровождения данных ("СД"), с помощью которой указывается размер очередного слога; линия "С6" - указывающая на использование не 4х, а 6и битного минимального слога (для 12и и 24х разрядных вычислительных систем) и линия "СЛ" указывающая на передачу по шине данных служебной информации (тега).
   - линии запроса магистрали - несколько одинаковых комплектов, включающих линию "З" - собственно запрос, линию "П" - передача, и обратную линию к ней. Каждый следующий комплект, включенный в магистраль, имеет более высокий приоритет, чем все предыдущие. (Поэтому любое устройство, желающее захватить магистраль, выставляет запросы одновременно на все доступные ему линии "З".) Линия "П" - разрывная - каждое устройство включается в разрыв этой линии, для чего имеет два контакта - вход и выход. Обратная линия не подключается ни к одному устройству кроме концевых терминаторов магистрали - там она соединяется с линией "П" и замыкает её в кольцо.
   В минимальном комплекте магистраль включает 4 линии задатчика, 4 линии исполнителя и 4 линии шины данных. Если считать, что магистраль это действительно плоский многопроводный кабель, то линии минимальной магистрали располагаются слева направо именно в том порядке в каком они описаны выше. А наращивание магистрали происходит тоже вправо (слева добавляются только линии С6 и СЛ потому, что во многих системах они могут быть опущены).
   Порядок включения линий в магистраль:
   (исходное состояние 12 сигнальных линий - минимальная магистраль)
   - 2 линии шины данных (и слева С6)
   - три линии запроса магистрали
   (итого 18 сигнальных линий - магистраль для самого простого и
   медленного 12и разрядного управляющего вычислительного устройства)
   - еще 2 линии шины данных и 1 - шины СД
   (20 или 21 сигнальная линия - простое 8 или 16и разрядное устройство)
   - еще 4 линии шины Д (слева - С6)
   (итого 25 линий - средний 12и разрядный контроллер)
   - еще 4 линии шины Д (теперь всего 16), 1 линия шины СД
   (29 линий - средний 16и разрядный контроллер)
   - слева С6 и СЛ
   (31 сигнальная линия - базовая модель семейства А3)
   - 2й комплект линий запроса магистрали
   - 8 линий шины данных (и С6 - для 24х разрядных машин)
   - еще 8 линий шины Д, 1 линия шины СД и еще один комплект "З", "П", обратная
   (52 сигнальные линии - 32х разрядная магистраль с тремя уровнями
   приоритета)
  
   Магистраль можно наращивать и дальше, только есть ли смысл? Высокопроизводительные магистрали удобнее делать синхронными, а для управляющих вычислительных устройств как правило особо высокой пропускной способности не требуется: вместо одного глобального сверхбыстродействующего контроллера всегда можно сделать несколько локальных.
  
  *** 20.42(ред2 - 10.10) ***
   Магистральный интерфейс использует "асинхронный" принцип взаимодействия устройств. Причем следует различать парное взаимодействие (задатчик - исполнитель) и коллективное (задатчик - все остальные устройства).
   Взаимодействие распадается на шаги; устройства-партнеры делают свои шаги поочередно. Сделав очередной шаг, устройство извещает об этом своего партнера по взаимодействию инвертируя свой синхросигнал. То есть синхронизация производится как по переднему так и по заднему фронту. Задатчик использует для синхронизации линию СА, исполнитель (при парном взаимодействии) - одну из линий СП, а "все устройства" (при коллективном) - обе. Причем в противофазе: на одну из них выдается ноль, а на другую - единица. Но обязательно строго одновременно. Так как все устройства соединены по схеме "монтажное или" то на некоторое время (когда одни устройства уже готовы, а другие еще нет) обе линии СП перейдут в состояние "1-1". Этот интервал времени известен как "Т1". Готовность всех устройств определяется по заднему фронту на той линии СП, где перед этим была единица. При выполнении некоторых операций ("селекция") устройство имеет право отказаться от дальнейшего участия во взаимодействии. Тогда оно убирая единицу с одной из СП (и сигнализируя тем самым о своей готовности), на другую её не выставляет. Если отсеялись все устройства, то на очередном шаге обе линии СП перейдут в состояние "0-0". В этом случае задатчик должен выставить на СА очередной фронт (а на ЗА возможно команду "отбой") и ждать в течении времени Т1 не выставят единицу на одну из СП (откуда они же её на предыдущем шаге убрали) и таким образом не подготовятся к следующему коллективному действию.
   Для таких случаев задатчику надо хотя бы один раз измерить интервал Т1 в доступных для него единицах. (Например как количество импульсов его тактовой частоты.) Предполагается, что это он должен сделать в самом начале цикла задатчика - при выполнении второго (или единственного) шага захвата магистрали.
   На каждом своём шаге задатчик выставляет на шину ЗА код команды, указывая таким образом партнеру, что ему делать. На каждом своём шаге исполнитель сообщает задатчику кодом на шине ОП о своём состоянии, чтобы тот мог решить что делать дальше. При коллективном взаимодействии шина ОП как правило не используется.
   Шина ЗА трехразрядная, поэтому команд всего восемь:
   0 - "отбой" - используется для отмены операций и завершения циклов
   7 - "захват" - для захвата магистрали - начала цикла задатчика
   1 - "выбор" - для выбора исполнителя
   2 - "адрес" - для начала цикла передачи данных
   3 - "чтение" - передача данных от исполнителя к задатчику
   4 - "запись" - --//-- от задатчика к исполнителю
   5 - "реверс" - сменить направление передачи данных на противоположное
   6 - "повторить" - повтор предыдущего действия для следующего слога
   Код команды "захват" состоит из одних единиц - он способен перебить любую другую команду (если одному из устройств уж очень приспичило). Код команды "отбой" состоит из одних нулей - шина переводится в свободное состояние. Коды остальных команд выбраны вполне произвольно и для удобства реализации (например для повышения помехоустойчисвости) могут быть пересмотрены.
   Шина ОП двухразрядная, поэтому кодов ответа всего четыре:
   0 - "пауза" - указывает что команда почему либо не выполнена
   1 - "еще" - указывает, что переданный слог не последний
   2 - "конец" - указывает что данный слог последний в слове (или единственный)
   3 - "ошибка" - указывает что произошла какая либо ошибка, например адрес вышел за диапазон имеющихся у исполнителя ячеек памяти.
   Таким образом каждый из упомянутых выше циклов это последовательность пар шегов, каждая из которых помечена командой задатчика, однозначно определяющей действия обоих устройств. А каждая следующая команда определяется намерениями задатчика и результатом действий на предыдущем шаге. Набор допустимых последовательностей команд собственно и составляет "протокол".
  
   Каждое устройство, использующее магистраль, должно иметь уникальный (в пределах магистрали) физический номер. Этот номер однозначно идентифицирует устройство (точнее - "физический сегмент", каковых в устройстве может быть несколько) и используется при всех операциях на магистрали.
   Физические номера - это единственный ресурс магистрали подлежащий распределению. Причем это дефицитный ресурс: в отличии от прочей информации физические номера всегда передаются по шине данных за один шаг. (Т.е. одним слогом.) Следовательно физический номер короткий, их мало. И дело еще осложняется тем, что одно малоразрядное (и следовательно медленное) устройство занимает место в пространстве физических номеров, где могли бы разместиться несколько устройств с более широкой шиной данных. Да и объем доступной ему части пространства физических номеров также резко ограничен.
   Поэтому предполагается "статическое" распределение физических номеров. Например номер указывается устройству вручную (с помощью переключателей или перемычек) непосредственно перед присоединением к магистрали. Однако допускается и "горячее" подключение устройств (т.е. к уже работающей магистрали), а интерфейс предусматривает средства для "динамического" (программного) присвоения и перераспределения физических номеров.
  
   ***(ред.2 11.06)***
   *** 21.32 ***
  
   Начальное, оно же свободное состояние магистрали - на всех линиях, кроме одной из СП - логические нули.
   Каждое устройство должно быть "синхронизовано" с магистралью: сразу после включения на всех его выходах должны быть нули. Первое что оно должно сделать - проверить состояние линий СП. Если на обоих нули - устройство должно выставить логическую единицу на линию СП0 и не предпринимать больше никаких активных действий в течении трех периодов таймаута - 3*Т0. (Каковое время устанавливается, так же как и физический номер, аппаратно - возможно подключением времязадающего конденсатора.)
   Обнаружив на одной из линий СП единицу устройство должно ожидать в течении времени Т0 фронта на СП или СА. Не дождавшись оно должно выставить единицу на ту же линию и тоже не предпринимать никаких активных действий в течении двух следующих интервалов Т0.
   Если в течении Т0 поступили команды на какие либо коллективные действия (например производится попытка захвата магистрали одним из устройств), то устройство должно измерить интервал Т1 (время нахождения обеих линий СП в состоянии 1) и если оно отлично от нуля (т.е. данное устройство не самое медленное на этой магистрали) - принять участие в следующем коллективном действии (например во втором шаге захвата магистрали) выставив единицу на ту линию СП, где она сейчас должна появиться. После чего устройство может считать себя синхронизованным. Иначе - ждать другого подходящего случая. (Интервала бездействия магистрали больше или равного Т0.)
   Магистраль считается свободной, если:
   - если она находится в "начальном" состоянии в течении времени более Т0
   - если текущий задатчик выдал два или три раза подряд команду "отбой", причем после последней магистраль оказалась в "начальном" состоянии (в частности на СА - 0, для чего и могло понадобится три команды).
   - если команда "отбой" последует сразу после команды "захват", но тоже с переходом магистрали в "начальное" состояние. (Это был неудачный конкурентный захват, в котором все претенденты проиграли.)
   - если в течении Т0 на линиях синхронизации не появилось ни одного фронта считается что произошла авария. В этом случае все устройства должны снять все сигналы со всех линий магистрали и выставив единицу только на СП0 ждать перехода магистрали в "начальное" состояние. Если этого не произошло в течении 3*Т0 - магистраль считается аварийной.
  
   Для того, чтобы стать задатчиком, активное устройство должно выполнить процедуру захвата магистрали. Захват может быть "конкурентным" и "плановым". В первом случае за то чтобы стать задатчиком возможно конкурируют несколько устройств, и исход этого заранее не предопределен. Во втором - текущий задатчик по своей инициативе передает магистраль одному из устройств (возможно - самому себе).
   Плановая передача магистрали выполняется за один шаг: на ЗА выставляется команда "захват", на шину Д - физический номер нового задатчика, на шину СД его максимальная разрядность, на линию СА - очередной фронт. Все устройства должны зафиксировать параметры нового задатчика и сообщить об этом фронтами на обоих линиях СП (в противофазе!). При этом задатчику не вредно измерить интервал Т1 (сколько времени, в доступных ему единицах, обе линии СП будут находится в единичном состоянии).
   Если старый задатчик передает магистраль сам себе - он разумеется всё выставляет сам. Если кому-то другому, запросившему у него магистраль с помощью линии "З" - то он выставляет только команду "захват", а вместе с нею логическую единицу на линию П.
   Напомню, что линия П разрывная. Каждое устройство, не нуждающееся в данный момент в захвате магистрали, должно "соединить" свой разрыв, повторяя на выход линии П то что на входе. Единственный разрыв - текущий задатчик. Он выдает на линию П - 0 (и его же получает).
   Устройство, которому понадобилась магистраль, выставляет запрос (естественно, единицу) на линию З (а точнее - на все доступные ему), разрывает линию П, выдавая на выход 0 и ждет единицу на входе. Задатчик, решив передать магистраль, должен позаботиться о том чтобы на линии СА был ноль. Добившись этого, он выставляет на ЗА команду "захват", но линию СА не трогает, а выставляет единицу на выход П. Если магистраль одновременно желают получить несколько устройств - дойдет эта единица только до ближайшего. В ответ на это оно должно выставить прочие атрибуты, как-то свой физический номер на шину Д, размер на СД, и фронт на линию СА.
   Кстати, старый задатчик, готовящийся передать магистраль, вместе с командой должен выставить свою единицу на ту линию СП, где она уже есть. (Чтобы и он смог поучаствовать в грядущем коллективном действии.) Ну так вот - обнаружив фронт на линии СА, старый задатчик должен убрать всё лишнее - команду с ЗА (пусть её теперь новый задатчик удерживает) и единицу с линии П, соединив её, как и прочие устройства. Именно об этом он и сообщит сменой фазы на линиях СП.
   Если линии П и З текущему задатчику недоступны, то передать магистраль в плановом порядке кому либо кроме самого себя он не может, и когда она ему больше не нужна - просто освобождает.
  
   Конкурентный захват магистрали происходит за два шага. Начинается он с начального состояния магистрали. Как только устройство, желающее захватить магистраль, решит что она уже свободна, оно выставляет всё что для захвата полагается: команду, свой номер, размер, передний фронт на линию СП. При этом он делает и то, что пассивные устройства: меняет фазу на линиях СП - на всякий случай. Когда все пассивные устройства отреагируют (т.е. по заднему фронту на той СП, где была единица), устройство проверяет - его ли номер находится на шине данных: если желающих было несколько - номер будет искажен. Если всё в порядке - устройство делает еще один шаг, аналогичный первому, убирая на этот раз полностью свои единицы с линий СП. Если номер не его - огорченное устройство выставляет везде нули (то есть команду отбой) и смотрит что будет дальше. А дальше - если последует команда "захват" (то есть кто-то все-таки выиграл) - ведет себя как прочие устройства. А вот если дальше последует команда "отбой" (то есть проиграли все) - предпринимает следующую попытку захвата, но не раньше чем истечет интервал времени Т2, каковой устанавливается для каждого устройства индивидуально и по возможности по-разному именно для того чтобы опять же по возможности предотвратить повторные конфликты. А вот прочие желающие, не успевшие принять участие в предыдущем захвате, не связаны никакими Т2 и могут попытать счастья сразу.
   Все устройства, требовавшие себе магистраль с помощью линии З, в ответ на "захват" должны убрать оттуда своё требование и повторно выставить его только на следующем шаге - для того чтобы новый задатчик мог известить какие из комплектов линий З-П ему доступны - выставив на линии З единицы. Если на некоторой линии З остался ноль - значит в течении данного цикла задатчика она не используется и значения на линии П - недействительны.
   Если линии З и П, как в минимальной магистрали, отсутствуют - средств корректно обратится к текущему задатчику просто нет, конкурентный захват является единственно возможным. Если одному из устройств уж очень припечет, оно может попытаться прервать командой "захват" текущий цикл задатчика. (Хотя это действие больше будет напоминать не конкуренцию, а драку.) В этом случае, возможно, понадобятся более двух шагов. Но рассматривать эту ситуацию мы сейчас не будем.
  
  *** 23.12 ***
  
   Первая команда, сразу после захвата магистрали, определяют "намерения" задатчика на весь этот его цикл. Он может начать цикл исполнителя, выбрав себе пассивное устройство командой "выбор"; в остальных случаях считается что задатчик начал передачу сообщения - команды "чтение", "запись", "адрес", "продолжить". Цикл исполнителя - вещь ординарная, выполняется часто, поэтому для его запуска предусмотрена особая команда и в результате в одном цикле задатчика их можно запустить сколько угодно. А вот передача сообщения это экзотика, производится редко. Ради неё можно запустить отдельный цикл задатчика.
  
   Цикл исполнителя начинается командой "выбор". Вместе с ней задатчик выставляет номер устройства, к которому обращается, а все устройства должны подтвердить, что услышали. То есть здесь все должны убрать единицу с той лини СП, где она была, а вот выставить её на другую должно только адресованное устройство. Если это произошло - данная линия будет использоваться для синхронизации в течении всего цикла исполнителя. А все остальные устройства по следующему фронту на линии СА должны подготовиться к следующему коллективному действию, выставив свои единицы на оставшуюся линию СП. И новый исполнитель разумеется тоже. А вот задатчик не должен запускать никаких коллективных действий в течении не менее чем Т1 от этого самого следующего фронта (чтобы все с гарантией успели).
   Новый исполнитель сообщает задатчику свой тип и разрядность. Тип - на шине ОП, а разрядность - на СД.
   С разрядностью, то есть размером слога дело обстоит вот как: прошлый раз - при захвате магистрали, задатчик сообщил свой размер слога и все устройства его запомнили. Никаких экзотических разрядностей (например 20 бит) не бывает - обязательно 1, 2, 4, 8... "минимальных слогов", каковые обычно 4 бита. (Но могут быть и 6, о чем извещается с помощью линии С6.) По шине СД передается число минимальных слогов минус один. Так что задатчик на всех доступных ему линиях выставлял единицы. Исполнитель фактически выставляет разрядность задатчика (ту её часть, которую смог принять). Шестибитные слоги будут использоваться только если это умеют и задатчик и исполнитель. Все шестибитные устройства обязаны уметь пользоваться и четырехбитными слогами. Наоборот - не обязательно. (У четырехбитного устройства контакта с линией С6 может и не быть.)
   С типом дело обстоит вот как: если исполнитель рассматривается как набор ячеек памяти, то "нормальное" его состояние это "физический сегмент" - последовательность нумерованных слов, которые могут быть как одинакового, так и разного размера. Первое характерно для памяти (ОЗУ, ПЗУ), а второе - для управляющих регистров некоторого устройства. "Сужением" этой модели будет последовательность битов, не разделенная на слова. Это имеет смысл для случаев, когда деление на слова несущественно, или когда слова получились бы слишком маленькими. (Например - видеоОЗУ - обозначать яркость каждой точки отдельным словом явно невыгодно, а другое деление смысла не имеет.) В этом случае адресуется каждый слог. (Только здесь, в отличии от памяти с "байтовой" организацией ("байт" дословно тоже значит "слог") это не 8 бит, а 4.) "Расширением" той же модели является устройство, содержащее в себе не один, а множество сегментов. В таком виде представляется удаленная вычислительная система с сегментной организацией адресного пространства. (А описываемая магистраль предполагает именно такую!)
  
  *** 00.00 ***
  
   Первая команда цикла исполнителя выражает "намерения" задатчика на весь этот цикл: задатчик может обратиться к исполнителю как к адресуемой памяти, для чего должен выдать команду "адрес" и тем самым начать цикл передачи данных; в противном случае считается, что он производит обращение к аппаратной подпрограмме. (Цикл передачи данных - вещь ординарная, а аппаратная подпрограмма - экзотика.)
   Впрочем, если исполнитель указал что он содержит в себе логические сегменты - надо выбрать один из них. Для этого после команды "выбор", начавшей цикл исполнителя, должна следовать одна или несколько команд "продолжить", в течении которых передается адрес логического сегмента, к которому будет обращение. Последующий за этим "адрес" - будет смещением в нём.
   Адрес, как и данные, передается по слогам, начиная с младших битов. Устройство-источник (в данном случае задатчик) выставляет столько битов адреса, сколько сможет. И сопровождает их - первый слог командой "адрес", все остальные - "продолжить". Устройство-хозяин данных (это всегда исполнитель) выставляет на шину СД число, указывающее количество слогов, которые на данном шаге считаются переданными. На столько слогов устройство-источник сдвигает в выходном регистре передаваемое значение. То, что там осталось - будет выставлено на следующем шаге. Если осталось нулевое значение - следующий шаг не делается. Если остался не ноль, а исполнитель сообщает что слог последний - возникает ошибка.
   Последний это слог или нет, исполнитель сообщает кодом (1 или 2) на шине ОП. Два оставшихся значения используются чтобы указать, что адрес уже вышел за пределы допустимого диапазона. И что предыдущая команда почему либо не выполнена (коды 3 и 0 соответственно).
   После адреса может следовать неограниченное количество циклов чтения и записи. Причем, как уже было сказано, задатчик на каждом шаге командует исполнителю, что ему делать дальше: "чтение" и "запись" - начать передачу в соответствующую сторону очередного слова, даже если предыдущее передано не полностью; "реверс" сменить направление передачи на противоположное, и начать передачу того же самого слова; "продолжить" - передать очередной слог в том же самом направлении, что и предыдущий. При смене направления передачи тот, кто выдавал информацию, должен освободить шину данных для партнера. При переходе от записи к чтению это делает задатчик. А при переходе от чтения к записи - исполнитель. Для этого он должен вставить пустой шаг, выдав ответ "0".
   Адрес, полученный в начале цикла передачи данных, запоминается во внутреннем регистре исполнителя и при переходе к следующему слову автоматически наращивается. Однако возможно и его автоуменьшение, что бывает нужно при работе со стеком. Для этого первой командой после передачи адреса должна быть "реверс". Исполнитель должен сообщить о своём согласии кодом 0 на шине ОП, либо кодом "ошибка" - если не умеет производить таких фокусов. Для устройства без деления на слова, для работы в режиме автоуменьшения адреса таковое деление надо произвести искусственно. Здесь исполнитель должен указать на шине данных размер псевдослова. (А он постарается сделать его по возможности равным длине физического слова, каковое у него несомненно есть.) Если псевдослово оказалось больше размера слога - на шине ОП необходимо выставить код 2, т.к. оные псевдослова тоже будут передаваться по-слогам. А если меньше или равно - код 1 - слоги будут передаваться без указания концов слов. Кроме того, задатчик имел возможность указать адрес, попадающий в середину псевдослова. А передаваться оно будет сначала - чтобы не создавать лишние технические сложности. Так вот: на шине СД должно быть указано, на сколько минимальных слогов переданный адрес отстоит от начала первого псевдослова.
   Кстати, при нормальном направлении передачи (при автоувеличении адреса) исполнитель тоже будет стремиться выровнять передаваемые или принимаемые данные по границе имеющихся в него физических слов.
   Команда "отбой" заставляет исполнителя освободить занимаемые им линии, например в случае, если задатчик решил выбрать себе другого исполнителя. При этом главное - чтобы была освобождена линия СП. Поэтому если на СП уже был ноль - он там и останется, а результат выполнения операции - появление нулей на всех линиях, куда исполнитель выставлял единицы. (Если таковых небыло - то и команду подавать не надо.)
  
   Обращение к аппаратной подпрограмме во всем подобно обращению к обычной: на стеке набирается комплект аргументов, управление передается подпрограмме и после окончания её работы на стеке остается результат. Вот только действия производит не процессор, а другое физическое устройство. Сам процессор в это время будет простаивать, или может заняться другой работой.
   Реализовано этот так: считав команду обращения к аппаратной подпрограмме, процессор, если в это время не был задатчиком, захватывает магистраль, начинает новый цикл исполнителя (того, который - нужное ему устройство), и выдает ему команду "запись", после которой одним пакетом передает аргументы - всё содержимое активной части стека. Первым словом как правило должен быть код операции - непосредственный операнд команды обращения к аппаратной подпрограмме. Сразу после этого процессор выдает команду "чтение" и помещает на стек то что удалось считать - результат операции. Если операция выполняется относительно быстро - исполнитель задержит ответ до её завершения. Если же долго - должен велеть отложить обращение, для чего сразу выдает код 0 на шину ОП.
   Выдав два нуля подряд в ответ на осмысленные команды задатчика (не на "отбой"), исполнитель принимает на себя обязанность известить задатчика о завершении операции.
   Вообще говоря, исполнитель, рассматриваемый как устройство, в каждый момент времени находится в одном из четырех состояний:
   - в исходном - готов к выполнению операции
   - занят - что-то делает
   - готов - операция выполнена успешно - готов выдать ответ
   - ошибка - операция выполнена неуспешно - готов выдать код ошибки
   В исходном состоянии устройство нормально реагирует на команду "запись" и выставляет код "ошибка" в ответ на "чтение". В двух последних - всё наоборот, но после считывания результата переходит в исходное состояние. В состоянии "занят" отвечает на обе команды кодом "0". Но в любом состоянии принимает команду "реверс", в ответ на которую выдает сведения о своем состоянии. (Два первых бита первого слова - сам код состояния.) При переходе из состояния "занят" в одно из двух последних, устройство, если взяло на себя такое обязательство, выдает прерывание.
   Обращение к аппаратной подпрограмме существует в двух вариантах. Описанный выше - как единая операция. Второй - расчлененный на три - запуск действия, проверка готовности и считывание результата.
  
   Прерывания как таковые в данном магистральном интерфейсе отсутствуют. Причина в том, что к магистрали одновременно может быть подключено несколько процессоров, способных реагировать на прерывания. Поэтому вместо них реализована "передача сообщения".
   Передача сообщения начинается если первой командой в цикле задатчика будут "чтение", "запись" или "адрес". Команда "запись" используется для передачи самого сообщения, команда "адрес" - для селекции адресатов, а "чтение" используется для согласования размеров слога.
   Согласование размеров слога производится в два или три шага. По команде "чтение" на первом шаге все устройства должны выдать на шину данных специальное слово, состоящее из всех нулей и единственной единицы в самом старшем из доступных устройству разрядов. Кроме того устройство выдает единицу на одну из линий ОП если не умеет работать с битным слогом, а на другую - если не поддерживает операции с линией СЛ. На втором шаге (вместе с командой "продолжить") задатчик должен сообщить общий результат сигналами на линиях СД, С6 и СЛ. А все остальные устройства должны убрать сигналы с линии Д.
   Если случилось так, что задатчик обнаружил на линии Д одни нули (при условии что пассивные устройства есть, что видно по ответам на линиях СП) - возможно магистраль имеет линий меньше, чем разрядность каждого из взаимодействующих устройств. Тогда задатчик делает третий шаг, сообщая (вместе с командой "продолжить") размер слога единицей в старшем бите шины Д. Теперь все прочие устройства должны проконтролировать "проходимость" шины данных: обнаружив нули во всех разрядах, устройство должно выставить единицу на одной из линий ОП, а обнаружив размер, с которым не может работать - на другую. Задатчик должен повторять третий шаг, последовательно уменьшая размер слога вплоть до минимального, пока все устройства с этим не согласятся.
   Третий шаг делается так же в цикле конфигурации, когда задатчик хочет произвести "арбитраж" - побитное сравнение кодов, выдаваемых несколькими устройствами дабы выбрать из них какое либо одно. Для этого ему требуется указать экзотический размер слога - один бит, что делается единицей в младшем разряде.
   Согласование размера слога может проводиться более одного раза - например в самом начале и после селекции.
   Селекция производится следующим образом: выдается команда "адрес" и вместе с ней первый слог типа сообщения. Следующие слоги как всегда сопровождаются командами "продолжить". Если заголовок сообщения состоит из нескольких слов, каждое опять начинается с команды "адрес". Каждое устройство, приняв очередной слог, может решить что это сообщение не ему и отказаться от дальнейшего участия в данной операции. (Не выставить очередной раз единицу на соответствующую линию СП.)
   Передача тела сообщения начинается с команды "запись". От передачи данных отличается только тем, что размер слога и границы слов здесь указывает задатчик.
   Нормальное сообщение начинается с согласования параметров, после чего идет заголовок, далее возможно повторное согласование параметров и передача самого сообщения. Сообщение без заголовка - относится ко всем устройствам. Например команда сброса.
   Урезанное сообщение, не имеющее содержательной части и служащее только для привлечения внимания к устройству - т.е. полный аналог требования прерывания, состоит из одной единственной команды "продолжить", каковая выдается сразу после захвата устройством магистрали. Причем номером вектора служит физический номер устройства, а на шину данных вместе с командой выдается (одним слогом) код приоритета данного устройства. На это сообщение должны ответить только процессоры, приоритет выполняемой в настоящий момент программы у которых меньше указанного устройством. Если хоть кто-то ответил, устройство считает свою миссию завершенной и передает магистраль этому устройству. Причем сначала оно делает попытку плановой передачи магистрали, а потом, если не получилось, просто освобождает её. Для этого все устройства, требовавшие магистраль, должны снять свои требования и соединить линию П, а разорвать её должны только те процессоры, которые откликнулись на данное сообщение. Вот ближайшему из них устройство и передаст управление. Если же это не удалось - устройство не подключено к линии П, или получило свою единицу себе обратно на вход - оно просто завершает цикл задатчика, предоставляя процессорам действовать самостоятельно. Если же никто на его призывы не откликнулся - устройство тоже завершает цикл задатчика и по истечении времени Т2 начинает всё по новой.
  
   *** 2.15 ***
   ***(ред.2 11.32)***
  
   Считается, что настройка устройств и подключение их к магистрали должно производится "статически". Но универсальность интерфейса требует предусмотреть средства и для горячего подключения устройств. (Т.е. к уже работающей магистрали.) А так же для "динамической" (программной) настройки их параметров. Ситуацию, в которой такие средства понадобятся, представить совсем не трудно. Например это кабель с разъемами для подключения внешних устройств. Устройства подключаются и отключаются по мере необходимости в произвольные моменты времени. Ширина магистрали минимальная, то есть реализуется наихудший случай.
   Горячее подключение не требует каких либо особых средств. Если параметры устройства настроены заранее - ему достаточно только синхронизоваться с магистралью. (Каковая процедура уже описана выше.) Однако необходимо чтобы разъем, с помощью которого оно подключается, обеспечивал подключение земляных линий раньше чем сигнальных (а отключение позже). Что впрочем достигается достаточно просто. Кроме того в отключенном состоянии разъем должен соединять разрыв линий П, если конечно таковые у него есть.
   Параметров, нуждающихся в настройке, три. Два из них - интервалы Т0 и Т2 - особой сложности не представляют: Т0 - "таймаут" - может быть установлен одинаковым для всех устройств независимо от разрядности и быстродействия, а Т2, которое для каждого устройства должно быть своим собственным, можно установить автоматически - умножением некоторого фиксированного интервала (или например измеренного Т1) на физический номер устройства.
   Для назначения и перераспределения физических номеров, для сбора информации об устройствах (без которой правильное распределение физических номеров невозможно), а так же для задания некоторых параметров устройств (таких как например скорость для компорта) используется "цикл конфигурации". Цикл конфигурации целиком занимает весь цикл задатчика и начинается с команды "реверс" во время которой задатчик указывает к какой категории устройств он в данном цикле обращается.
   Все устройства делятся на четыре категории:
   - не конфигурируемое устройство, физический номер которому присвоен статически, т.е. раз и навсегда. Такие устройства выбираются нулевым разрядом шины данных.
   - конфигурируемое устройство в "начальном" состоянии, т.е. сразу после включения и синхронизации с магистралью. Выбирается первым разрядом шины данных.
   - конфигурируемое устройство в "изолированном" состоянии - оно уже было отделено от всех других и ему присвоен уникальный на данной магистрали "логический номер", с помощью которого оно может быть выбрано в цикле конфигурации. Но физические номера ему еще не назначены и в работе магистрали оно участвовать не может. Выбирается вторым разрядом шины данных.
   - конфигурируемое устройство в "рабочем" состоянии - всем включенным в него физическим сегментам присвоены физические номера и устройство может участвовать в работе магистрали. Выбирается третьим разрядом шины данных.
   Остальные разряды шины данных (если они есть) на данном шаге не используются. Разумеется задатчик может выбрать сразу несколько категорий устройств.
   Цикл конфигурации начинается с фазы селекции, в ходе которой задатчик пытается выбирать одно из устройств одним из следующих методов:
   - с помощью линий З-П
   - побитовой диспетчеризацией с помощью кода, присвоенного устройству изготовителем
   а также
   - с помощью ранее присвоенного логического номера
   - с помощью одного из имеющихся в распоряжении устройства физических номеров.
   Столь экзотический метод как "побитовая диспетчеризация" требуется потому, что логические номера могут быть еще не присвоены, физические перепутаны (например двум устройствам присвоен один и тот же), а линий З и П просто нет. Но для него требуется, чтобы каждое устройство было снабжено неким кодом, уникальным в пределах всех возможных устройств.
   .......
   ***(12.26)***
  
   ***20.28****
   Цикл конфигурации это нечто среднее между циклом передачи сообщения и циклом исполнителя. Он занимает весь цикл задатчика целиком и состоит из "фаз" двух типов - "селекции" и "доступа". Фаза селекции (одна или несколько) нужна для того чтобы из всех устройств выбрать одно, а фаза доступа - чтобы произвести чтение и/или запись в его конфигурационные регистры. Фаза доступа практически не отличается от цикла исполнителя, а фаза селекции несколько напоминает аналогичные действия в цикле передачи сообщения. Но только напоминает: там задатчик точно знает к кому обращается, а здесь - нет. Одна из стоящих перед ним задач как раз и заключается в том, чтобы узнать, что за устройства населяют данную магистраль.
   Фаза селекции присутствует во всех других циклах данного магистрального интерфейса, но там каждое устройство уже снабжено уникальным физическим номером и потому селекция совершается тривиально - за один шаг. Здесь же физические номера либо отсутствуют (еще не присвоены), либо уже есть, но возможно не уникальны. Поэтому для выбора единственного устройства используются либо линии запроса-подтверждения (З-П), либо (когда их нет) битовые последовательности, составленные из содержимого всех конфигурационных регистров устройства.
   Предполагается, что каждое устройство содержит в себе неограниченное количество конфигурационных регистров, доступных как минимум на чтение. Если же некоторого регистра на самом деле нет - просто считываются нули. Предполагается, что каждый регистр имеет неограниченную длину. Из реально не существующих разрядов тоже считываются нули, а запись не вызывает ошибку, но и не производит никакого эффекта. (Впрочем в фазе селекции регистры только читаются.)
   ***20.41***
   Шестнадцать первых конфигурационных регистров (они же слова конфигурационного пространства) одинаковы у всех устройств. Они содержат:
   - физический номер устройства - на самом деле номер одного из принадлежащих устройству физических сегментов. Как правило самый младший.
   - Логический номер. Присваивается "конфигурируемому" устройству на этапе его "изоляции"; у не конфигурируемого всегда считывается как состоящий из всех единиц. Если физический номер - принадлежность сегмента, а у устройства их может быть несколько, то логический - принадлежность именно устройства - должен его однозначно идентифицировать. Но используется только в цикле конфигурации.
   - Серийный номер. Устанавливается изготовителем устройства и должен быть по возможности уникальным.
   - Случайное число - содержимое некоторого счетчика, непрерывно считающего некоторые импульсы (например импульсы от тактового генератора устройства) на момент начала цикла конфигурации, или на момент начала чтения этого регистра. Это последнее средство найти какие либо различия между двумя совершенно идентичными устройствами. (изготовитель которых не озаботился снабдить их разными серийными номерами) - авось хоть тактовые генераторы хоть чуть-чуть разойдутся! А можно его использовать так же например для измерения временных интервалов...
   Первые четыре слова конфигурационного пространства в основном предназначены для селекции устройств; следующие четыре - описывают аппаратуру.
   - регистр статуса - младшие четыре бита содержат одну единственную единицу, указывающую категорию данного устройства. Категорий, естественно, четыре:
   1. не конфигурируемое - физический номер присваивается "статически", например с помощью переключателей, и другим способом не может быть изменен. Зато устройство всегда в рабочем состоянии. Указывается разрядом номер ноль.
   2. конфигурируемое в рабочем состоянии - бит 1
   3. конфигурируемое в "изолированном" состоянии - логический номер уже присвоен, а физический еще нет - бит 2
   ***20.58***
   4. конфигурируемое в начальном состоянии, в которое оно попадает сразу после включения - ни физического ни логического номеров еще нет. Собственно цель конфигурации - перевод устройств из третьей категории в первую. Устройства нулевой категории пребывают в ней всегда.
   Остальные биты статусного регистра разработчики могут использовать по своему усмотрению.
   - основной размер - слово, состоящее из всех нулей и единственной единицы в самом старшем из доступных устройству линий шины Д. Именно это слово выдается при коллективном согласовании размеров слога.
   - дополнительный размер: слово, первые два бита которого указывают (единичными значениями) наличие у данного устройства линий С6 и СЛ. (И естественно - соответствующих им возможностей.) Следующие два бита зарезервированы. Следующие содержат столько единиц подряд, сколько комплектов линий запроса магистрали (З-П) доступно данному устройству. После этих единичных битов должен быть один нулевой, а все следующие разработчик может использовать по своему усмотрению.
   - следующий регистр зарезервирован.
   Следующие восемь регистров существуют в виде стольки комплектов, сколько логических устройств содержится в данном физическом.
   - количество логических устройств
   - номер текущего логического устройства (чьи регистры доступны)
   - количество физических сегментов, требуемых данному устройству. (Эти сегменты нумеруются подряд.)
   - номер младшего из сегментов.
   - разрешение использовать данное логическое устройство: если сюда записать не-ноль, то при переводе физического устройства в первую категорию, данное логическое будет в рабочем состоянии, а иначе - нет. Если ни одно логическое устройство в составе физического не разрешено, то в первую категорию оно не перейдет. Если логическое устройство единственное - этот регистр ему не нужен. (Хотя ему можно придать смысл "приоритета".)
   - следующие три регистра зарезервированы
   ***21.12***
   Наличие и смысл остальных регистров конфигурационного пространства зависит от типа устройства.
  
   Каждая фаза, кроме первой, начинается командой "выбор", вместе с которой на шину Д выставляется код, указывающий тип фазы и/или действия, которые требуется произвести. В следующих шагах, если они есть, передается номер логического устройства, сопровождаемый командой "продолжить".
   Первая фаза цикла начинается командой "реверс". Именно по этой первой команде в цикле задатчика данный цикл отличается от всех остальных. Вместе с командой "реверс" на шину Д выставляется код, указывающий категорию устройств, с которыми задатчик намерен работать в этом цикле. Отозваться на неё должны только устройства указанных категорий. Все остальные - отсеиваются и в данном конфигурационном цикле больше не участвуют.
   Первая фаза цикла - это обязательно фаза селекции. Фаза селекции может включать согласование размеров слога, а так же действия, условно называемые "выбор", "арбитраж" и "пропуск". Каждое из них включает один или несколько шагов, на первом из которых задатчик подает команду, указывающую действие ("адрес", "запись" и "реверс" соответственно, а для согласования размеров слога - "чтение"), а на остальных - "продолжить".
   Согласование размеров слога в точности такое же как в цикле передачи сообщения. Разве что здесь задатчик, чтобы устроить "побитный арбитраж", может на третьем шаге указать размер слога 1 бит.
   При "арбитраже", как и при начальном захвате, все участвующие в нем устройства выставляют на шину Д содержимое очередного конфигурационного регистра, после чего проверяют что получилось. Если выставленное значение и содержимое значащей части шины данных не совпадают - арбитраж считается проигранным. Проигравшее арбитраж устройство отсеивается. Но не сразу. Сначала - на следующем шаге оно должно сообщить об этом, выставив единицу на одну из линий ОП. (А устройства, продолжающие участвовать - на другую.)
   ***21.28***
   Если случилось так, что проиграли все устройства - задатчик должен следующим шагом начать новую фазу селекции. И теперь при согласовании размеров указать 1 бит. На этот раз одно из устройство обязательно останется!
   "Выбор" отличается от "арбитража" тем, что данные выставляет задатчик, а устройство только сравнивает их со своими. Если не совпадают - отсеивается.
   "Пропуск" выполняется в точности как "арбитраж", разве что отсева устройств не происходит. Пропуск нужен потому, что слова конфигурационного пространства рассматриваются подряд, начиная с первого и требуется средство пропустить те из них, которые не должны участвовать в селекции. "Пропуск" конечно позволяет просто считать содержимое слова (точнее логическое или от слов всех устройств-участников), но это не слишком нужно - для чтения и записи конфигурационных регистров предназначена фаза доступа.
   Фаза доступа, как и цикл исполнителя, содержит множество циклов передачи данных, т.е. позволяет обращаться к словам конфигурационного пространства в произвольном порядке. Отличий два:
   - синхронизация производится не как при парном, а как при множественном взаимодействии, так как на фазу доступа могли перейти с фазы селекции не одно а несколько устройств.
   - по другому выставляются коды ответа на шину ОП:
   - код 0-0 по прежнему означает пропуск шага
   - код 0-1 означает успешное действие
   - код 1-0 - неуспешность, например чтение несуществующего регистра, или несуществующих разрядов, или запись в регистр, доступный только по чтению. (Но ошибкой это вообще говоря не считается.)
   - код 1-1 означает конфликт: устройству обнаружило на шине данных не то, что оно туда выставило. Само устройство сообщает об обнаруженном конфликте на следующем шаге, но этот код может образоваться сам собой если одно устройство сообщает об успешности действия, а другое - о неуспешности. (На конфликт проверяется не только шина данных, но и ОП.)
   В остальном всё то же самое.
   ***21.44***
  
  
  
  
  
 Ваша оценка:

Связаться с программистом сайта.

Новые книги авторов СИ, вышедшие из печати:
О.Болдырева "Крадуш. Чужие души" М.Николаев "Вторжение на Землю"

Как попасть в этoт список

Кожевенное мастерство | Сайт "Художники" | Доска об'явлений "Книги"