Copyright: Автор справочных текстов М.Р.Шамсиахметов (версия справки 1 от 10.3.97)
Citation: Справка по шине PCI


Компьютерная обучающая программа "Шина PCI" Содержимое справки
Компьютерная обучающая программа “Шина PCI” Содержимое справки

Щёлкните мышью на подчеркнутом тексте, соответствующем необходимой справке для того, чтобы получить информацию о соответствующих компонентах PCI.

Справка описывает смысл компонента шины или её функции с иллюстрацией деталей.

Введение описывает вводную информацию по шине PCI.

Протокол объясняет основы протоколов передач на шине PCI.

Конфигурация описывает область конфигурации Plug&play плат на шине PCI.

Электронный урок разъясняет как пользоваться системой обучения.

Контрольные вопросы описывают опрос всего изложенного материала.


Введение

Спецификация PCI 2.0 (Peripheral Component Interconnect Local Bus Revision 2.0) определяет процессорно-независимую шину, предусматривающую подключение до шести устройств, в том числе контроллера шины PCI и дополнительного контроллера шины расширения ISA, EISA или МСА. Тактовая частота шины РСI достигает 33 МГц, причем обмен по ней может осуществляться 32- или 64-разрядными словами.

Предусматривается одновременная поддержка нескольких главных устройств локальной шины, что важно для будущих мультимедиа- и других систем, обрабатывающих большие объемы графики, видео и данных других типов. Шина РСI поддерживает блочный обмен последовательными данными при выполнении операций чтения и записи данных в память.

В архитектуре РСI предусмотрен мост, развязывающий процессор и шину расширения при сохранении 32-разрядного тракта обмена данными с периферийными устройствами. Контроллер шины позволяет организовывать очередь операций записи и чтения.

Предусматривается возможность использования одной и той же системной платы для ЦП разных поколений, что, однако, требует более сложных схем управления контроллером шины РСI.

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

Средняя номинальная скорость передачи данных по шине составляет 120 Мбайт/с, а пиковая - 132 Мбайт/с для 32-разрядного тракта передачи данных и 264 Мбайт/с - для 64-разрядного тракта.

Шина РСI поддерживает интерфейсы различных типов: МСА, ISA и EISA. Некоторые платы РСI могут использоваться в системах на различных платформах.

В спецификации PCI 2.0 предусмотрены разные соединители для нормального (5 В) и пониженного (3,3 В) напряжения питания. Существуют соответственно 5- и 3,3-вольтовые платы, а также универсальные платы, которые могут устанавливаться в соединители обоих типов.

Имеются два дополнительных контакта PRSNT1# (В9) и PRSNT2# (В11). Они используются для индикации установки платы в гнездо и указывают величину необходимой для ее питания мощности. Благодаря отмеченным особенностям шина РСI может стать оптимальным выбором для компьютеров будущего. Ее внедрение обеспечит высокую производительность и хорошую совместимость.


Управление базовыми передачами

Основой управления всеми передачами данных на PCI служат три сигнала:

FRAME#- ведётся задатчиком для отображения конца запроса.

IRDY#- ведётся задатчиком, позволяя вызывать циклы ожидания.

TRDY#- ведётся исполнителем, позволяя ему вызывать циклы ожидания.

Интерфейс не занят, если запрещены и FRAME# и IRDY#. Первый фронт синхроимпульса на котором разрешается FRAME# это адресная фаза, и адресные и шинные коды команд передаются на этом фронте СИ. Следующий фронт СИ начинает первую из одной или нескольких фаз данных, в течение которой данные передаются между задатчиком и исполнителем по каждому фронту СИ и для этого разрешаются оба сигнала IRDY# и TRDY#. Состояния ожидания могут быть вставлены в фазу данных либо задатчиком либо исполнителем с помощью соответственно сигналов IRDY# и TRDY#.

Источнику данных необходимо разрешить свой RDY# сигнал без всяких условий когда данные достоверны. Приёмник же может разрешить его, если ему нужно.

Как только задатчик разрешил IRDY#, он не может изменить IRDY# или FRAME# до тех пор пока не завершится текущая фаза данных независимо от состояния TRDY#. Как только исполнитель разрешил TRDY# или STOP#, он уже не может изменить DEVSEL#, TRDY# или STOP# пока не завершится текущая фаза данных. Общий смысл в том, что ни задатчик, ни исполнитель не могут изменить свои действия, включившись в передачу данных.

В тот момент, когда задатчик собирается завершить передачу данных, запрещается FRAME# и разрешается IRDY#, указывая на то, что задатчик готов. После того, как испонитель укажет на последнюю передачу данных (TRDY# разрешён), интерфейс возвращается в состояние холостого хода с запрещёнными сигналами FRAME# и IRDY#.

см. также:

•	Таймер задержки

•	Задержка доступа

•	Арбитрация на PCI


Область конфигурации платы Plug&play на шине PCI

     Для облегчения процессов инициализации и конфигурации устройств на  шине PCI,  спецификация PCI поддерживает режим автоконфигурации, называемый режимом Plag and Play. Это существенно упрощает работу по подключению к компьютеру новых устройств.

     Для осуществления режима конфигурации на шине PCI  используются следующие аппаратно-программные средства.

     В адресном пространстве,  которое поддерживается шиной, выделяется специальное  поле (пространство) конфигурации объемом 256 байт. Для выбора устройств в этом пространстве при операциях  конфигурации на шине  выделяются  специальные  линии IDSEL (Initialization Device Select). Эти линии индивидуальные для каждого устройства. В операциях на  шине  предусмотрены  две  специальные команды чтения и записи конфигурации. Спецификация не определяет универсальный механизм  начала процесса конфигурации. Но для PC-AT совместимых компьютеров такой механизм специфицирован.

     Шина PCI имеет две команды конфигурации: чтения и записи из адресного пространства конфигурации, емкость которого 256 байт. Команды  конфигурации, подобно другим командам чтения и записи, разрешают доступ к байту,  слову,  двойному слову (32 р.) и пакетной передаче. Правила транзакций такие же как в других командах, включая все условия завершения транзакций.

     Особенностями команд конфигурации являются следующие.

     Доступ в область адресов конфигурации устройства на шине производится с помощью специальных,  индивидуальных для каждого  устройства, линий типа точка-точка, идущих от главного моста к каждому устройству отдельно. По этим линиям передается специальный сигнал выбора устройства IDSEL.  Каждое устройство имеет свой вход IDSEL, который работает подобно классическому входу "выбор кристалла" (chip select).  Устройство  PCI становится исполнителем команды конфигурации только тогда,  когда его сигнал IDSEL установлен, и два младших разряда  адреса  AD[1::0] содержат код 00 в течении фазы адреса команды конфигурации.

     Активное значение сигнала IDSEL имеет высокий уровень, т.е. соответствует 1.

     Адресация внутри пространства конфигурации устройства, содержащего 64 регистра по  32  разряда  каждый,  осуществляется  разрядами [7::2] шины AD[7::2]  и разрядами выбора байта C/B[3::0].

     В командах конфигурации используется только 11 младших  разряда на шине AD[10::0], а разряд AD[31::11] не используется (являются резервными).

     Спецификацией не  определено как формируется сигнал IDSEL главным мостом шины PCI.  Однако применяется способ задания линий  IDSEL путем использования  старших  линий  шины AD[31::11].  Это позволяет иметь 21 такую линию.  В  этом  случае,  одна  из  линий  AD[31::11] соединяется со  входом IDSEL устройства через большое сопротивление. Это снижает нагрузку на линию при выполнении других операций на  шине, но  приводит  к затягиванию фронта установки сигнала IDSEL в активное состояние.  В связи с этим необходима предустановка адреса  в фазе адреса транзакции конфигурации. Адрес может быть предустановлен за несколько импульсов до FRAME# (число импульсов для  предустановки определяется из постоянной времени входной цепочки сигнала IDSEL).

     Система, реализующая процедуру автоконфигурации, должна обеспе чивать  механизм разрешения цикла конфигурации на шине PCI,  который генерируется программно.  Этот механизм реализуется главным  мостом. Для PC-AT совместимых систем этот механизм специфицирован и рассматривается ниже. Для систем другой архитектуры он не специфицирован.

     Для PC-AT  совместимых  систем  специфицировано  два механизма: "механизм 1" и "механизм 2".  "Механизм 1" используется  в  новых  и перспективных главных мостах шины PCI.  "Механизм 2" - для совместимости с ранее применяемыми системами и не используется в новых  проектах.

     Кратко рассмотрим "механизм 1".

     Для реализации  этого механизма используются две 32-х разрядные ячейки из адресного пространства ввода-вывода.

     Первая ячейка  с  адресом  (CF8h)  соответствует  регистру чтения/записи под названием CONFIG_ADDRESS.  Другая - соответствует регистру CONFIG_DATA  с адресом (CFCh).

     Основой механизма является запись в CONFIC_ADDRESS  информации, которая  определяет адресуемые шине PCI устройство на шине и регистр конфигурации в устройстве.

     Регистр CONFIG_DATA используется тогда,  когда это необходимо в процессе конфигурации,  необходимостью его использования задается  в двоичном слове CONFIG_ADDRESS.

     Формат регистра CONFIG_ADDRESS следующий.

     Бит 31     - флаг разрешения доступа к регистру CONFIG_DATA (1 - разрешен).

     Биты 30-24 - резервные, доступны только по чтению, должны сбрасываться в "0" после чтения.

     Биты 23-16 - номер шины PCI в системе, т.к. интерфейс PCI предусматривает иерархическую структуру шин PCI в системе, соединяемых мостами PCI-PCI.

     Биты 15-11 - номер устройства на шине.

     Биты 10-8  - обозначает  номер функций  в устройстве, если устройство является многофункциональным.

     Биты 7-2   - обозначают адрес 32-х разрядной ячейки (регистра) в области конфигурации устройства. Каждое устройство  имеет у себя  память из 64-х 32-х разрядных регистров адресного пространства конфигурации.

     Биты 1-0   - обозначает тип передачи в операции конфигурации, работают только по чтению.

     Эти регистры  находятся в главном мосту и их информация используется при реализации процесса конфигурации на шине.

     Имеется два типа передачи информации из регистра CONFIG_ADDRESS на линии AD шины PCI.

     Первый тип - Тип 0,  используется для случая,  когда адресуется устройство  на шине,  которая подсоединена к мосту,  где находится в данный момент информация в CONFIG_ADDRESS регистре.

     Второй тип - Тип 1, используется, когда устройство находится на другой шине, не подсоединенной к этому мосту.

     Формат передаваемого слова соответствует формату  информации  в регистре CONFIG_ADDRESS.

     Признаком передачи Типа 0,  является код 00 в младших  разрядах слова AD[1::0], а передачи Типа 1 - код 01.

     Формат слова при передаче Типа 0 следующий.

     Биты  1-0  - признак, код 00.

     Биты  7-2  - адрес регистра конфигурации.

     Биты 10-8  - номер функции в устройстве.

     Биты 31-11 - резервные.

     В формате слова при передаче Типа 1,  добавляется следующая информация.

     Биты 15-11 - номер устройства на шине.

     Биты 23-16 - номер шины PCI в системе.

     Биты 31-24 - резервные.

     При передаче Типа 0  мост  декодирует  номер  устройства  (биты 15-11), чтобы  установить  сигнал IDSEL,  соответствующий выбранному устройству. В этом случае на линиях (31-11) шины AD появляется  одна единица, соответствующая этому сигналу IDSEL, выбирающему устройство операции конфигурации.  На линиях (1-0) шины AD записывается код 00, соответствующий передачи Типа 0.

     При передаче Типа 1 мост без изменений передает содержимое своего регистра  CONFIG_ADDRESS на все линии AD шины PCI в течении фазы адреса цикла конфигурации, при этом линии (1-0) шины AD содержат код 01. Следующий мост зацикливает эти данные.

     Если номер моста  соответствует  номеру,  записанному  в  битах (23-16), это определяет, что адресуемое устройство находится на шине PCI, подсоединенной к этому мосту, и он генерирует передачу Типа 0.

     Все устройства,  которые  соответствуют передаче Типа 0,  можно разделить на два класса: одно функциональные и много функциональные. Два класса различаются при кодировании заголовка пространства конфигурации.

     Теперь несколько  подробнее о структуре пространства конфигурации устройства.

     Это пространство  имеет  объем  256 байт и состоит из 64-х 32-х разрядных ячеек.

     Пространство конфигурации  состоит  из двух частей.  Заголовка, размером в 64 байта. Заголовок обязателен для всех типов устройств.

     В пространстве 192-х оставшихся байтов записывается информация, специфичная для этого типа устройств.  Причем в заголовке 16  первых байт  являются одинаковыми по назначению для всех устройств.  Другие 48 байт заголовка имеют различное значение в зависимости от  функции устройства.

     В пространстве конфигурации  имеются  специальные  16-разрядные регистры команды и состояния.

     Регистр команды обеспечивает управление устройством,  когда оно выполняет определенные операции.

     Регистр состояния хранит информацию об  ошибках  и  прерываниях устройства.

     В этом пространстве имеется специальный 8-разрядный регистр для хранения значения величины Таймера задержки.

     На приведенной схеме показана структура заголовка  пространства конфигурации.

Рис. 1: Заголовок пространства конфигурации

Рисунок 1 описывает размещение предопределённой 64-байтной порции заголовка 256-байтного пространства конфигурации, которую должно поддерживать каждое устройство PCI. Устройства должны располагать любые необходимые специфичные для устройства регистры только в месте от 64 до 255. Все многобайтные числовые поля следуют в порядке little-endian. То есть младшие адреса содержат наименее значительные части поля. Софт должен заботиться о том, чтобы взаимодействовать корректно с побитно-закодированными полями, у которых некоторые биты зарезервированы для последующего использования. При чтениях софт должен использовать подходящие маски для отделения определённых полей и может не полагаться на зарезервированные биты с частными значениями. При записях софт должен убедиться, что значения позиций зарезервированных битов защищены. То есть значения зарезервированных позиций битов должны быть сначала прочитаны, соединены с новыми значениями для других позиций битов и затем данные обратно записаны. Раздел 2 описывает регистры в предопределённой порции заголовка конфигурационного пространства.

Предопределённая порция заголовка конфигурационного пространства разделена на 2 части. Первые 16 байт определены одинаковыми для всех типов устройств. Оставшиеся 48 байт могут иметь различный вид в зависимости от основных функций, которые обеспечивает устройство. Поле “Тип заголовка” (расположенное по смещению 0Eh) определяет какой вид представлен. На текущий момент определён лишь один тип заголовка (00h), который имеет вид, представленный на рисунке. Последующие версии будут определять другие типы заголовка для специальных функций (т.е. дополнительная память, мосты PCI-PCI и т.д.).

Все устройства совместимые с PCI должны поддерживать идентификатор производителя, идентификатор устройства, поля Команды и Состояния в заголовке. Обеспечение других регистров необязательно (т.е. они могут быть представляться как зарезервированные регистры) в зависимости от функциональности устройства. Если устройство предоставляет функцию, с которой связан регистр, устройство должно предопределить его в определённом положении и с определённой функциональностью.

Управление устройством

Регистр Команда обеспечивает управление возможностями устройства генерировать и откликаться на циклы PCI. Когда 0 записывается в этот регистр, устройство логически отключается от шины PCI для всех доступов за исключением конфигурационных доступов. Требуется, чтобы все устройства поддерживали этот основной уровень функциональности. Индивидуальные биты в регистре Команда могут или не могут быть введены в зависимости от функциональности устройства. К примеру, устройства, в которых не предусмотрено пространство В/В возможно не смогут ввести записываемый элемент по битовому положению 0 регистра Команда. Устройства как правило загружаются со всеми нулями в этом регистре, а раздел 4 объясняет некоторые исключения. Рисунок 2 показывает вид этого регистра, а таблица 2 объясняет назначения различных битов в регистре Команда.

Рис 2: Вид регистра Команда

Табл 2: Биты регистра Команда

Размещение бита	Описание
0	Управляет реакцией устройства на доступы к пространству ввода/вывода. Значение 0 запрещает реакцию устройства. Значение 1 позволяет устройству отвечать на доступы к пространству ввода/вывода.
1	Управляет реакцией устройства на доступы к пространству памяти. Значение 0 запрещает реакцию устройства. Значение 1 позволяет устройству отвечать на доступы к пространству памяти.
2	Управляет возможностью устройства действовать задатчиком на PCI шине. Значение 0 запрещает устройству генерировать доступы к PCI. Значение 1 позволяет устройству вести себя как задатчик шины.
3	Управляет действиями устройства в ответ на операции Специального Цикла. Значение 0 заставляет устройство игнорировать все операции Специального Цикла. Значение 1 позволяет устройству наблюдать операции Специального Цикла
4	Это бит разрешения использования команд записи в память и недействительности. Когда бит равен 1, задатчики могут генерировать команду. Когда он равен 0, операции записи в память должны быть использованы вместо  них. Состояние после RST# нулевое. Этот бит должен быть введён устройствами-задатчиками, которые могут генерировать команду записи в память и недействительности.
5	Этот бит управляет тем, как VGA-совместимые устройства управляют доступами к их регистрам палитры. Когда этот бит установлен, разрешается специальное поведение палитрования (т.е. устройство не должно отзываться). Когда бит не установлен, устройству следует воспринимать доступы к палитре как все другие доступы. VGA-совместимым устройствам следует вводить этот бит.
6	Этот бит управляет реакцией устройства на ошибки чётности. Когда этот бит установлен, устройство должно предпринимать свои обычные действия, когда обнаружена ошибка чётности. Когда этот бит не установлен, устройство должно игнорировать все ошибки чётности, которые оно обнаруживает и продолжать обычные действия. Этот бит должен быть установлен в 0 после RST#. Устройства, проверяющие чётность должны вводить этот бит. Всё ещё требуется, чтобы устройства генерировали чётность, даже если проверка на чётность отменена.
7	Этот бит используется для управления тем, делает ли устройство сдвиги адреса/данных. Устройства, которые никогда не делают сдвигов должны аппаратно установить этот бит в 0. Устройства, которые всегда делают сдвиги должны аппаратно установить этот бит в 1. Устройства, которые делают и то и другое, должны сделать этот бит перезаписываемым и инициализировать его в 1 после RST#.
8	Этот бит- бит разрешения для драйвера SERR#. Значение 0  запрещает драйвер SERR#. Значение 1 разрешает драйвер SERR#. Состояние этого бита после reset нулевое. Все устройства, которые имеют ножку SERR# должны вводить этот бит. Этот бит (и бит 6) должен быть включен для сообщения ошибок чётности.
9	Этот необязательный бит чтения/записи управляет тем, может или нет задатчик делать запросы back-to-back к различным устройствам. Софт инициализации установит этот бит, если все цели совместимы. Значение 1 означает, что задатчику позволено генерировать быстрые запросы back-to-back. к различным местам, как описано в разделе 3.4.2. Значение 0 означает, что быстрые запросы back-to-back позволены только к тому же месту.
10-15	Зарезервированы.
Состояние устройства

Регистр состояния используется для записи информации состояния для событий, относящихся к PCI-шине. Определение каждого бита даётся в таблице 3, а вид регистра показан на рисунке 3. Устройствам может не понадобиться вводить все биты в зависимости от функциональности устройства. Например устройство, действующее как цель, но никогда не подающее сигналов аварийного завершения, не будет вводить бит 11.

Чтения этого регистра проходят нормально. Записи слегка отличаются в том, что биты можно переустановить, но не установить. Бит переустанавливается, когда бы ни шла запись в регистр и данные в соответствующем положении бита- 1. Например, чтобы очистить бит 14 и не затронуть все другие биты, запишите  значение 0100_0000_0000_0000b в регистр.

Рис. 3: Вид статусного регистра

Табл. 3: Биты статусного регистра

Размещение бита	Описание
0-6	Зарезервированы.
7	Этот необязательный бит только-для-чтения указывает- способна или нет цель принимать быстрые запросы back-to-back, когда запросы делаются не к тому же самому устройству. Этот бит может быть установлен в 1, если устройство может принимать эти запросы, иначе должен быть установлен в 0. Обратитесь к разделу 3.4.2. для полного описания требований по установке этого бита.
8	Этот бит вводится только задатчиками на шине. Он устанавливается когда соблюдены три условия: 1) утсройство, действующее на шине самоутвердило PERR# или получило утверждённый PERR#; 2) устройство, устанавливающее бит действовало, как задатчик на шине для операции, в которой произошла ошибка; 3) установлен бит Реакции на Ошибку Чётности (регистр Команда).
9-10	Эти биты кодируют синхронизацию DEVSEL#. Раздел 3.6.1 указывает разрешённые синхронизации для утверждения DEVSEL#. Они кодируются так: 00b для быстрой; 01b для средней и 10b для медленной (11b зарезервировано).Эти биты только-для-чтения и должны отображать самое медленное время, когда устройство утверждает DEVSEL# для любой команды на шине кроме Чтения Конфигурации и Записи Конфигурации.
11	Этот бит должен быть установлен устройством-целью всегда, когда оно завершает запрос прерыванием цели. Устройствам, которые никогда не выдают сигналов прерывания цели не нужно вводить этот бит.
12	Этот бит должен быть установлен устройством-задатчиком всегда, когда его запросы оканчиваются прерыванием цели. Все устройства-задатчики должны вводить этот бит.
13	Этот бит должен быть установлен устройством-задатчиком всегда, когда его запросы (за исключением Специального Цикла) оканчиваются прерыванием цели. Все устройства-задатчики должны вводить этот бит.
14	Этот бит должен устанавливаться всегда, когда устройство утверждает SERR#. Устройствам, которые никогда не утвердят SERR#, не нужно вводить этот бит.
15	Этот бит должен быть установлен устройством всегда, когда оно обнаруживает ошибку чётности, даже если управление ошибками чётности отменено (как и контролируется битом 6 в регистре Команда).
Разнообразные функции

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

Линейный размер кэша

Этот регистр указывает линейный размер кэша в единицах 32-битных слов. Этот регистр чтения/записи должен быть введён устройствами-задатчиками, которые могут генерировать команду Записи в память и Недействительности. Устройства, принимающие участие в протоколе кэширования используют это поле для того, чтобы узнать когда повторять доступы захвата на границы линий кэша. Эти устройства могут игнорировать PCI-линии поддержки кэша (SDONE и SBO#), когда этот регистр установлен в 0. Это поле должно быть установлено в 0 при перезагрузке.

Таймер времени ожидания

Этот регистр указывает в единицах PCI-тиков шины значение таймера времени ожидания для заданного задатчика шины PCI. Этот регистр должен быть введён, как перезаписываемый любым задатчиком, который может захватить более чем две фазы данных. Этот регистр может быть введён только-для-чтения для устройств, которые захватывают две или менее фазы данных, но зашитое значение должно быть 16 или менее. Типичным введением является построение пяти бит высшего порядка (оставляя низшие три как только-для-чтения), что даст результат в степени детализации таймера на восемь часов. При перезагрузке регистр должен установиться в 0 (если программируется).

Встроенный СамоТест

Этот необязательный регистр используется для управления и состояния ВСТ. Устройства, которые не поддерживают ВСТ должны всегда возвращать значение 0 (т.е. понимать его, как зарезервированный регистр). Устройству, чей ВСТ вызывается, не следует прекращать нормальные действия на шине PCI. Рисунок 4 показывает вид регистра, а табл 4 описывает биты регистра.

Рис 4: Вид регистра ВСТ

Табл. 4: Биты регистра ВСТ

Размещение бита	Описание
7	Возвращается 1, если устройство поддерживает ВСТ. Возвращает 0, если устройство не совместимо с ВСТ
6	Записывается 1 для запуска ВСТ. Устройство переустанавливает бит, когда ВСТ завершён. Софт должен посчитать устройство неисправным, если ВСТ не завершается в течение 2 секунд.
5-4	Зарезервированы. Устройство возвращает 0.
3-0	Значение 0 означает, что устройство провело свой тест. Ненулевые значения означают, что устройство неисправно. Коды неисправностей для конкретного устройства могут быть закодированы ненулевыми числами.

Линия прерывания

Регистр линии прерывания- восьмибитный регистр, используемый для связывания информации по маршрутам линий прерываний. Регистр для чтения/записи и должен быть введён любым устройством (или функцией устройства), которая использует линию прерывания. Софт POST запишет маршрутную информацию в этот регистр, когда он инициализирует и конфигурирует систему.

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

Линия прерывания

Регистр линии прерывания говорит о том, какую линию прерывания использует устройство (или функция устройства). Значению 1 соответствует INTA#. Значению 2 соответствует INTB#. Значению 3 соответствует INTC#. Значению 4 соответствует INTD#. Устройства (или функции устройства), которые не используют линии прерывания должны записать 0 в этот регистр. Этот регистр только-для-чтения.

МИН_ВР и МАКС_ВРОЖ

Эти байтные регистры только-для-чтения используются для указания установок значений таймера времени ожидания, желательных для устройства. Для обоих регистров, значение указывает период времени в единицах 1/4 микросекунды. Значение 0 указывает, что устройство не имеет значимых требований для установок таймера времени ожидания.

МИН_ВР используется для указания насколько долгий период захвата нужен устройству в предположении, что тактовая частота шины 33 Мгц. МАКС_ВРОЖ используется для указания, как часто устройству необходимо получить доступ к шине PCI.

Устройствам следует указать значения, которые позволят им наиболее эффективно использовать как шину PCI, так и их встроенные ресурсы.

Базовые адреса

Одной из самых важных функций для обеспечения совместимости вверх и упрощения является возможность перемещать устройства PCI в пространстве адресов. При включении питания системы устройство-независимый софт должен быть способен определить какие устройства присутствуют, построить последовательную карту памяти и определить, имеет ли устройство дополнительное ПЗУ. Каждая из этих областей раскрывается в следующих разделах.

Карты памяти

Софту при включении питания требуется построить последовательную карту памяти перед загрузкой машиной операционной системы. Это означает, что оно должно определить, сколько памяти в системе и сколько адресного пространства в системе требуют контроллеры В/В. После определения этой информации софт при включении питания может поместить в карте контроллеры В/В в разумные положения и продолжать с системной загрузкой. Для того, чтобы сделать такое размещение устройства способом, не зависящим от устройства, основные регистры для такого размещения помещаются в предопределённую порцию заголовка конфигурационного пространства.

Рис. 5: Базовый адресный регистр для памяти

Бит 0 во всех базовых регистрах только-для-чтения и используется для определения попадает ли размещение регистра в пространство памяти или В/В. Базовые регистры, которые размещаются в пространстве памяти должны вернуть 0 в бите 0. Основные регистры, которые размещаются в пространстве памяти должны вернуть 1 в бите 0.

Рис. 6: Базовый адресный регистр для В/В

Базовые регистры, которые размещаются в пространстве В/В всегда 32-битны с 0м битом установленным аппаратно в 1, бит 1 зарезервирован и должен возвращать 0 при чтениях, и другие биты используются для размещения устройства в пространстве В/В (см. рис. 6).

Базовые регистры, которые размещаются в пространстве памяти (рис. 5) могут быть 32-битными или 64-битными по ширине (для поддержки размещения в 64-битном адресном пространстве) с 0м битом, аппаратно установленным в 0. Для базовых регистров памяти, биты 2 и 1 имеют закодированное значение, как показано в табл. 5. Бит 3 должен быть установлен в 1, если данные с упреждением, а иначе переустановлен в 0. Устройство может отметить диапазон как упреждённый, если у него нет никаких посторонних эффектов при чтениях, устройство возвращает все байты при чтениях, не взирая на разрешения байтов, и основные мосты могут объединить записи процессора (см. раздел 3.2.3) в этот диапазон без возникновения ошибок. Биты 0-3 только-для-чтения.

Табл. 5: Кодирование битов 2/1

Биты 2/1	Значение
00	Базовый регистр 32-битен и размещение может быть сделано где угодно в 32-битном пространстве памяти.
01	Базовый регистр 32-битен, но должен быть размещён ниже 1 Мб в пространстве памяти.
10	Базовый регистр 64-битен и может быть размещён  где угодно в 64-битном адресном пространстве.
11	Зарезервировано

Количество старших битов, которые устройство на данный момент вводит, зависит от того, сколько адресного пространства относится непосредственно к устройству. Устройство, которое хочет адресное пространство в 1 Мб (используя 32-битный адресный регистр), выставило бы старшие 12 бит адресного регистра, аппаратно установив остальные биты в 0.

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

Эта разработка подразумевает, что все используемые адресные пространства по размеру — степень двойки и разумеется упорядочены. Устройства свободны в потребелении большего адресного пространства, чем им требуется, однако декодирование до 4К-байтного пространства для памяти и 256-байтного для В/В полагается для устройств, которым нужно меньше, чем эти количества. От устройств, потребляющих больше адресного пространства, чем использующих, не требуется ответ на неиспользуемую порцию этого адресного пространства.

Шесть двойных слов размещены для базовых адресных регистров начиная со смещения 10h в конфигурационном пространстве. Первый базовый адресный регистр всегда размещён со смещения 10h. Второй регистр может быть начиная со смещения 14h либо 18h в зависимости от размера первого. Смещения последующих базовых адресных регистров определяются размером предыдущих базовых адресных регистров.

Типовое устройство потребует один диапазон памяти для своих функций управления. Некоторые графические устройства могут использовать два диапазона, один для функций управления и другой для буфера кадра. Устройство, которое хочет установить функции управления в пространствах и памяти и В/В одновременно должно предоставить два базовых регистра (один для памяти, один для В/В). Драйвер этого устройства сможет использовать лишь одно пространство и по этой причине другое пространство останется неиспользованным. Устройствам следует всегда разрешать устанавливать функции управления в пространстве памяти.

Базовый адресный регистр ПЗУ расширения.

Некоторые устройства PCI, особенно те, что предназначены для использования на платах расширения в архитектурах ЭВМ, требуют местные EPROM для ПЗУ расширения (касаемо раздела 6.3 для определения содержимого ПЗУ). 4-байтный регистр по смещению 30h в конфигурационном пространстве определён для содержания базовых регистров и информации о размере для этого ПЗУ расширения. Рис. 7 показывает как это слово организовано. Функции регистра точно похожи на 32-битный базовый адресный регистр за исключением того, что кодирование (и использование) нижних битов различно. Верхние 21 бит относятся к верхним 21 битам базового адреса ПЗУ расширения. Число битов (кроме этих 21), которые устройство в настоящий момент вводит, зависит от того, какое упорядочение адресов поддерживает устройство. Например устройство, которое позволяет устанавливать его ПЗУ расширения в любых 64К границах, предоставляет верхние 16 бит в регистре, оставляя нижние 5 (исключая эти 21) аппаратно установленными в 0. Устройства, которые поддерживают ПЗУ расширения должны вводить этот регистр.

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

Рис. 7: Вид базового адресного регистра ПЗУ расширения

Бит 0 в регистре используется для управления тем, принимает ли устройство доступы к своему ПЗУ расширения. Когда этот бит переустановлен, адресное пространство ПЗУ расширения запрещено. Когда этот бит установлен, адресное декодирование разрешено, используя параметры в другой части базового регистра. Это позволяет устройству использоваться с или без ПЗУ расширения, в зависимости от системной конфигурации. Бит объёма памяти в регистре команда главнее по сравнению с битом разрешения ПЗУ расширения. Устройство должно отзываться на доступы к его ПЗУ расширения, только если оба бита- объёма памяти и ПЗУ расширения установлены в 1.

В целях минимизации число адресных декодеров, необходимых для устройства, оно может разделять декодер между базовым адресом ПЗУ расширения и другими базовыми адресными регистрами. Когда декодирование ПЗУ расширения разрешено, декодер используется для доступов к ПЗУ расширения и устройство-независимый софт не должен обращаться к устройству через другие базовые адресные регистры.

ПЗУ расширения PCI

Спецификация PCI обеспечивает механизм, где устройства могут быть снабжены кодом ПЗУ расширения, который может быть выполнен при устройство-специфической инициализации и, возможно, функцию системной загрузки (обр. к разд. 2.5.2). Механизм позволяет ПЗУ содержать различные образцы для совместимости с разными машинами и архитектурами процессоров. Этот раздел указывает требуемую информацию и вид образцов кода в ПЗУ расширения. Заметьте, что устройства PCI, которые поддерживают ПЗУ расширения должны позволять доступы к ПЗУ с любой комбинацией разрешений байтов. Это вообще говоря означает, что доступы DWORD к ПЗУ расширения должны быть поддержаны.

Информация в ПЗУхах выглядит так, чтоб быть совместимой с существующими Intel x86 зоголовками ПЗУ расширения для ISA, EISA и MC адаптеров, но она также будет поддерживать и другие архитектуры машин. Информация, доступная в заголовке была расширена так, что больше оптимальной пользы можно извлечь из функций, поддерживаемых адаптером и так, чтоб исполняемая порция кода ПЗУ расширения занимала минимальный объём памяти.

Информация заголовка ПЗУ расширения PCI обеспечивает следующие функции:

•	Код длины представлен для идентификации всего непрерывного адресного пространства, необходимого для образца ПЗУ устройства PCI при инициализации.

•	Индикатор указывает тип исполняемого или интерпретируемого кода, который существует в адресном пространстве ПЗУ в каждом образце ПЗУ.

•	Уровень ревизии для кода и данных в ПЗУ предоставляется.

•	Указатель на жизненно-важные данные производителя устройства.

•	Идентификатор производителя и идентификатор устройства поддерживаемого устройства PCI включён в ПЗУ.

Одно главное различие в использовании модели между ПЗУ расширения PCI и стандартным ПЗУ ISA, EISA и MC состоит в том, что код ПЗУ никогда не выполняется в нём самом. Он всегда копируется из ПЗУ устройства в ОЗУ и исполняется из ОЗУ. Это разрешает динамическое изменение размера кода (для инициализации и во время исполнения) и обеспечивает улучшение скорости при исполнении кода.

Содержимое ПЗУ расширения PCI

ПЗУ расширения PCI может содержать код (исполняемый или интерпретируемый) для многих процессорных архитектур. Это может быть введено в одиночном физическом ПЗУ, которое может содержать сколько угодно образцов кода для разных систем и процессорных архитектур (см. рис 8). Каждый образец должен начинаться на 512-байтной границе и должен содержать заголовок ПЗУ расширения PCI. Начальная точка каждого образца зависит от размера предыдущего образца. Последний образец в ПЗУ иимеет специальное кодирование в заголовке для идентификации последнего образца.

Образец 0

Образец 1

o

o

o

Образец N

Рис. 8 Структура ПЗУ платы расширения PCI

Формат заголовка ПЗУ расширения PCI

Информация, требуемая в каждом образце ПЗУ разделяется на две различные области. Требуется, чтобы первая область, заголовок ПЗУ, размещался в начале образца ПЗУ. Вторая область, структура данных PCI должна быть размещена в первых 64К образца. Формат заголовка ПЗУ расширения PCI даётся ниже. Смещение- шестнадцатиричное число с начала образца и длина каждого поля даётся в байтах.

Дополнения к ПЗУ расширения и/или структура данных PCI могут быть определены конкретными системными архитектурами. Дополнения к PC-AT совместимым системам описаны в разделе 3.3

Смещение	Длина	Значение	Описание
0h	1	55h	Пометка ПЗУ, байт 1
1h	1	AAh	Пометка ПЗУ, байт 2
2h-17h	16h	vv	Зарезервировано (данные, уникальные для процессорной архитектуры)
18h-19h	2	vv	Указатель на сруктуру данных PCI
Пометка ПЗУ	Пометка ПЗУ- 2-байтное поле, содержащее 55h

первым байтом и AАh вторым байтом. Это

пометка должна быть первыми двумя байтами

адресного пространства ПЗУ для каждого

образца ПЗУ.

Указатель на PCI-	Указатель на структуру данных PCI-

структуру данных	двухбайтный указатель в формате little-

endian, который указывает на структуру

данных PCI. Точка ссылки для этого

указателя- начало образца ПЗУ

Формат структуры данных PCI

Структура данных PCI должна быть расположена внутри первых 64 К байт образца ПЗУ и должна быть выровняна по двойным словам. Структура данных PCI содержит следующую информацию:

Смещение	Длина	Описание
0	4	Пометка, строка “PCIR”
4	2	Идентификация производителя
6	2	Идентификация устройства
8	2	Указатель на жизненно важные данные
А	2	Длина структуры данных PCI
С	1	Ревизия структуры данных PCI
D	3	Код класса
10	2	Длина образца
12	2	Уровень ревизии
14	1	Тип кода
15	1	Индикатор
16	2	Зарезервировано
Пометка	Эти 4 байта обеспечивают уникальную

“подпись” для структуры данных PCI. Строка

“PCIR”- пометка с “P”, начинающегося со

смещения 0, “С” со смещения 1 и т.д.

Идентификация	Идентификация производителя- 16-битное поле

производителя	с тем же определением, что и поле

идентификации производителя в

конфигурационном пространстве для этого

устройства

Идентификация	Идентификация устройства- 16-битное поле с

устройства	тем же определением, что и поле

идентификации устройства в конфигурационном

пространстве для этого устройства

Указатель на	Указатель на жизненно важные данные о

жизненно важные	продукте (VPD)- 16-битное поле, являющееся

данные	смещением от начала образца ПЗУ и указывает

на VPD. Это поле в формате little-endian.

VPD должно быть внутри первых 64 Кб образца

ПЗУ. Значение 0 указывает на то, что в

образце ПЗУ нат жизненно важных данных о

продукте.

Длина структуры	Длина структуры данных PCI- 16-битное поле,

данных PCI	которое определяет длину структуры данных с

начала структуры данных (первый байт поля

пометки). Это поле в формате little-endian

и в единицах байтов.

Версия структуры	Версия структуры данных PCI- 8-битное поле,

данных PCI	которое идентифицирует уровень ревизии

структуры данных PCI. Этот уровень ревизии-

0.

Код класса	Код класса- 24-битное поле с тем же

определением, что и код класса в

конфигурационном пространстве для этого

устройства.

Длина образца	Длина образца- 2-байтное поле,

представляющее длину образца. Это поле

имеет формат little-endian и его значение в

единицах 512 байт.

Уровень версии	Уровень версии- 2-байтное поле, содержащее

уровень ревизии кода в образце ПЗУ.

Тип кода	Тип кода- 1-байтное поле, идентифицирующее

тип кода, содержащийся в этом разделе ПЗУ.

Этот код может быть исполнимым двоичным для

указанного процессора и системной

архитектуры или интерпретируемым кодом.

Следующие типы кода присвоены:

Тип	Описание
0	Intel x86, PC-AT совместимые
1	стандарт OPENBOOT PCI
2-FF	Зарезервировано
Индикатор	Бит 7 в этом поле показывает, последний или

нет это образец в ПЗУ. Значение 1 означает

“последний”, значение 0 означает, что

следует другой образец. Биты 0-6

зарезервированы.

Код самотеста включения (POST)

В большинстве случаев системный POST код воспринимает дополнительные устройства PCI идентично тому, как бы они были упорядочены на материнской плате. Единственное исключение- взаимодействие с ПЗУ расширения. POST-код обнаруживает наличие опционального ПЗУ в два шага. Сперва код определяет, ввело ли устройство регистр базового адреса ПЗУ расширения в конфигурационном пространстве. Если регистр введен, POST должен установить соответствие и разрешить ПЗУ в неиспользованной порции адресного пространства и проверить первые 2 байта пометки AA55h. Если они найдены, тогда присутствует ПЗУ, иначе к устройству не прилагается ПЗУ.

Если ПЗУ прилагается, тогда POST должен вести поиск в ПЗУ образца, который имеет подходящий тип кода и чьи поля идентификатора производителя и идентификатора устройства соответствуют одноименным полям в устройстве.

После нахождения подходящего образца, POST копирует необходимое количество данных в ОЗУ. Затем исполняется инициализационный код устройства. Определение подходящего количества данных для копирования и того, как инициализационный код устройства запускается, будет зависеть от типа кода для поля.

PC-совместимые ПЗУ расширения

Этот раздел описывает будущие требования для образцов ПЗУ и взаимодействие образцов ПЗУ, которые используются в PC-совместимых системах. Это применяется для любого образца, который указывает в поле типа кода структуры данных PCI Intel x86, PC-AT совместимую ЭВМ и любую другую платформу, которая является PC-совместимой.

Расширения заголовка ПЗУ

Стандартный заголовок ПЗУ расширения PCI слегка расширен для совместимости с PC. Два поля добавлено, одно по смещению 02h, обеспечивающее инициализационный размер для образца. Смещение 03h - входная точка функций инициализации ПЗУ расширения.

Смещение	Длина	Значение	Описание
0h	1	55h	Пометка ПЗУ, байт 1
1h	1	AAh	Пометка ПЗУ, байт 2
2h	1	vv	Размер инициализации- размер кода в единицах 512 байт.
3h	4	vv	Точка вхождения для функции INIT. POST делает дальний вызов к этому месту.
7h-17h	11h	vv	Зарезервировано (уникальные данные приложения)
18h-19h	2	vv	Указатель на структуру данных PCI
Расширения POST кода

POST-код в этих системах копирует число байтов, указанное полем размера инициализации в ОЗУ и затем вызывает функцию INIT, чья точка вхождения по смещению 03h. POST-коду требуется покинуть область ОЗУ, куда был скопирован код ПЗУ расширения для разрешения записи после выполнения функции INIT. Это позволяет INIT-коду сохранять некоторые статические данные в области ОЗУ, и чтобы отрегулировать исполняемый размер кода так, чтоб он потребил меньшее пространство, когда система запущена.

PC-совместимый специальный набор шагов для системного POST-кода при взаимодействии с каждым ПЗУ расширения:

1.	Скопировать из ПЗУ в ОЗУ число байт указанное размером инициализации.

2.	Покинуть записываемое пространство ОЗУ и вызвать функцию INIT.

3.	Использовать байт по смещению 02h (который мог быть модифицирован), чтобы определить, сколько памяти было использовано при выполнении.

Перед системной загрузкой POST-код должен сделать область ОЗУ, содержащую код ПЗУ расширения только-для-чтения.

POST-код должен взаимодействовать с устройствами VGA с ПЗУ расширения специальным образом. BIOS расширения устройства VGA должен быть скопирован в 0C0000h. Устройства VGA могут быть идентифицированы проверкой поля кода класса в пространстве конфигурации устройства.

Расширения функции INIT

PC-совместимые ПЗУ расширения содержат функцию INIT, которая отвечает за инициализацию устройств ввода/вывода и подготовки к исполнительным действиям. Функциям INIT в PCI ПЗУ расширения позволены некоторые расширенные мандаты, поскольку в область ОЗУ, где расположен код разрешена запись, пока выполняется INIT-функция.

INIT-функция может сохранить статические параметры внутри области ОЗУ в течение функции INIT. Данные затем могут быть использованы BIOS исполнения или драйверами устройств. Эта область ОЗУ не будет записываема в момент исполнения.

Функция INIT может также отрегулировать количество ОЗУ, которое она потребляет в момент исполнения. Это делается модификацией байта размера по смещению 02h в образце. Это помогает сохранить ограниченный ресурс памяти в области ПЗУ расширения (0C0000h-0DFFFFh).

Например, ПЗУ расширения устройства может потребовать 24 Кб для своейинициализации и кода исполнения и лишь 8 Кб только для кода исполнения. Образец в ПЗУ покажет размер 24 Кб, так что POST код скопирует сразу всё в ОЗУ. Затем, когда запускается функция INIT, она может отрегулировать байт размера до 8 Кб. Когда функция INIT возвращается, POST видит, что исполнительный размер 8 Кб и может копировать следующий BIOS расширения в оптимальное место.

Функция INIT ответственна за гарантирование того, что контрольная сумма по размеру образца верна. Если функция INIT модифицирует область ОЗУ в любом случае, тогда новая контрольная сумма должна быть вычислена и сохранена в образце.

На входе функции INIT передаются 3 параметра, номер шины, номер устройства, номер функции устройства, что имеет ПЗУ расширения. Эти параметры могут использоваться для доступа к инициализируемому устройству. Они передаются в регистрах x86. [AH] содержит номер шины, верхние 5 битов [AL] содержат номер устройства и нижние 3 бита [AL] содержат номер функции.


Основы протоколов PCI

Основной механизм шинных передач на PCI это “пакет”. Пакет состоит из адресной фазы и одной или более фазы данных. PCI поддерживает пакеты и в пространстве памяти и в пространстве ввода/вывода. Хост-мост (который держит связь между хост-процессором и PCI) может объединять (или собирать) доступ к памяти на запись в единый запрос без посторонних эффектов. Устройство подтверждает, что их нет (позволяет предупреждать чтение данных и объединять записи данных в любом порядке) путём установки бита выборки в базовом адресном регистре. Мост может различать, где позволено объединение данных, а где нет путём адресного диапазона, который может быть предоставлен софтом конфигурации в процессе инициализации. Объединение данных в такой буфер должно остановиться (а буфер очищен), когда происходит последовательная запись, которая не подпадает под выборку или чтение (в любом диапазоне).

Так как доступы к ресурсу на в/в не могут быть скомбинированы, они обычно имеют только одиночную фазу данных. Вообще, ни один процессор или задатчик на шине не генерирует пакеты в пространстве в/в. Все доступы в/в должны появляться на PCI как только ЦП их сгенерировал. Почти все сигналы выровняны по фронту синхроимпульса.

см. также:

•	Управление базовыми передачами

•	Выполнение операций на шине


Выполнение операций на шине

Начало и продолжение транзакции.

     Транзакцию начинает задатчик, предварительно получив разрешение на работу на шине. Это разрешение задатчик получает от арбитра, послав ему сигнал запроса REQ# и получив разрешение GRN# от него.

     После этого задатчик начинает транзакцию с адресной фазы  путем установки  по  1-ому  импульсу  транзакции  сигналов FRAME#,  адреса AD[31::0] и команды C/BE[3::0]#. Эти сигналы становятся достоверными ко 2-ому импульсу транзакции. На первом импульсе начинается адресная фаза.

     Рассмотрим сигналы транзакции чтения.

     По второму импульсу, в соответствии с установленным адресом определяется исполнитель и соответствующая команда.  При операции чтения по этому импульсу задатчик выставляет сигнал IRDY#,  который говорит исполнителю, что задатчик готов принять данные. Исполнитель ко 2-ому импульсу организует Т-цикл для сигналов AD[31::0].

     По 2-ому импульсу он может установить, если успеет, сигнал DEVSEL#,  сообщающий задатчику,  что исполнитель найден и  имеет  право проводить транзакцию,  если не успевает из-за Т-цикла на шине АD, то установка DEVSEL# происходит на 3-м импульсе. На 2-м импульсе исполнитель  устанавливает  сигналы  указателя  байт  при передаче данных C/BE[3::0]#.  После 2-го  импульса  задатчик  не  управляет  линиями AD[31::0] и C/BE[3::0]#, ими управляет исполнитель. На 2-ом импульсе заканчивается фаза адреса и начинается фаза данных.

     На 3-ем импульсе исполнитель определяет, что задатчик готов (по сигналу IRDY#) к  приему  данных,  и  выставляет  первые  данные  на AD[31::0] и устанавливает сигнал TRDY#,  который сообщает задатчику, что на линиях AD[31::0] имеются первые достоверные данные.  На  этом такте может устанавливаться сигнал DEVSEL#,  если исполнитель не успел его установить на втором импульсе.

     Сигнал DEVSEL# должен устанавливаться после декодирования адреса и перед или вместе с сигналами IRDY#, STOP# и данных. Исполнитель не должен сбрасывать DEVSEL#, пока не закончится последняя фаза данных. Т.к. на 3-м импульсе фазы данных передачи данных от исполнителя к задатчику не произошло, то этот такт называется тактом ожидания.

     Только на 4-м импульсе задатчик определяет (по сигналу  TRDY#), что  на  шине AD[31::0] находятся достоверные данные и считывает их, завершая первую фазу данных.  На 4-м импульсе начинается вторая фаза данных и т.д.  Фазы данных могут занимать один такт, если нет тактов ожидания, или несколько тактов, если есть такты ожидания. Такты ожидания могут формироваться либо задатчиком (сбросом IRDY#),  либо исполнителем (сбросом TRDY#).

     Задатчик или исполнитель могут менять значения данных  на  шине AD только  при  активных  значениях сигналов IRDY# и TRDY# соответственно. Если эти сигналы сброшены, то на шине AD удерживаются старые значения данных.

     При операции записи,  значения сигналов на шине C/BE#  меняется на каждой фазе данных. При чтении значения C/BE# не меняется в течение всех фаз данных транзакции.

Окончание транзакции.

     На последней  фазе данных обязательно сбрасывается FRAME# и устанавливается IRDY#.  FRAME# может быть сброшен только тогда,  когда IRDY# установлен. После тог как исполнитель на последней фазе данных установит TRDY#, может быть проведена последняя передача от исполнителя  к задатчику,  и транзакция закончится сбросом на последнем импульсе транзакции сигнала IRDY#.  Т.к. сброшены сигналы FRAME# и IRDY#, то следующий такт будет тактом холостого хода (IDLE циклом).

     По последнему импульсу  тразакции  также  сбрасываются  сигналы TRDY# и DEVSEL#.

     Операция записи.  Транзакция записи выполняется точно также, за исключением  того,  что в ней отсутствует Т-цикл на 3-м импульсе для сигналов AD[31::0].  Поэтому на 3-м импульсе отсутствует такт очищения, и исполнитель на 3-м импульсе считывает первые данные,  выстав ленные задатчиком.  При транзакции записи шинами AD и C/BE управляет задатчик.

     Сигнал STOP# используется для завершения транзакции по инициативе исполнителя.

Способы завершения транзакций.

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

     1.Способ завершения транзакции задатчиком заключается в следующем. Задатчик инициализирует завершение  транзакции,  когда  сигнал FRAME# сброшен,  а IRDY# установлен.  Это указывает исполнителю, что наступает последняя фаза данных.  Последняя передача данных происходит, когда  установлены  и IRDY#,  и TRDY#.  Транзакция завершается, когда и FRAME#, и IRDY# сброшены (состояние холостого хода шины).

     Задатчик может прекращать транзакцию этим способом по двум причинам:

     - когда задатчик заканчивает начатую им транзакцию;

     - когда линия разрешения захвата шины задатчиком GRN cброшена и наступил момент Тайм-аут, когда исчерпано время, задаваемое Таймером задержки.

     Модифицированная версия этого способа завершения транзакции задатчиком используется тогда,  когда исполнитель не отвечает  на  его адресацию сигналом DEVSEL#.

     2.Способ завершения транзакции исполнителем  заключается в следующем. В этом случае используется сигнал STOP#.  Исполнитель выдает сигнал STOP#,  чтобы запросить завершение транзакции  от  задатчика.

     После установки, STOP# сохраняет активное значение до момента сброса FRAME#. Взаимосвязь между IRDY# и TRDY# не зависит  от  взаимодействия между STOP# и FRAME#. Поэтому данные могут быть переданы или не переданы до конца в текущей транзакции.  Это зависит единственно  от состояния IRDY#  и TRDY#.  Однако,  когда STOP# установлен,  а TRDY# сброшен, это указывает на невозможность дальнейшей  передачи  данных исполнителя. В этом случае, задатчик не ждет последней передачи данных, а немедленно завершает транзакцию.


Задержка доступа
Задержка доступа (Latency Access)

     Задержка доступа (Latency Access)  является  задержкой  доступа задатчика к исполнителю. Она представляет из себя временной интервал от момента выдачи задатчиком сигнала запроса шины  REQ#  до  момента получения им от исполнителя сигнала TRDY#, говорящего о том, что исполнитель готов принять данные при записи или  исполнитель  выставил данные на шину AD[31...00] при чтении.

     Эта задержка измеряется количеством импульсов  от  первого  импульса CLK,  соответствующего  стабильному  значению сигнала RQE# до первого импульса CLK,  соответствующего стабильному значению сигнала TRDY#.

     Задержка доступа состоит из 3-х задержек следующих одна за другой (см.рисунок).

     Первая - это задержка арбитрации (Arbitration Latency).  От момента выдачи задатчиком арбитру сигнала запроса шины REQ# до момента получения им от арбитра сигнала разрешения GNT#.  Вторая -  это  задержка  ожидания  задатчиком захвата шины (Bus Asquisition of Access Latency).  От момента получения им  от  арбитра  сигнала  разрешения GNT#,  до  момента начала транзакции,  которой соответствуюет началу установки задатчиком сигнала FRAME#.  Третья задержка - это задержка исполнителя  (Target Latency),  начинается от первого импульса транзакции,  фронтом которого установка сигнала FRAME# до момента  установки сигнала TRDY# исполнителя.

     Все эти задержки измеряются количеством импульсов между импульсами начала и конца временного интервала данной задержки.

     Рассмотрим величины этих задержек.

Задержка арбитрации.

     Задержка арбитрации зависит от уровня приоритета задатчика, алгоритма арбитрации, состояния шины в момент выдачи запроса на захват шины.

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

     В случае,  когда арбитр удерживает для задатчика сигнала разрешения захвата шины GNT#,  т.к. нет запросов на шину от других объектов,  то задержка арбитрации равна нулю. Этот задатчик в любое время может начать транзакцию,  установив сигнал FRAME#, т.к. имеется сигнал GNT# и шина находится в состоянии холостого хода (IDLE).

     Если на шине нет работающего задатчика и нет сигналов GNT#,  то для любого объекта задержка арбитрации равна одному импульсу.

     Если на  шине работает текущий задатчик со своим сигналом GNT#, то в этом случае объект с большим приоритетом имеет задержку  арбитрации в два импульса. Для объектов с меньшим приоритетом эта задержка может быть больше и зависит от его уровня приоритета  и  величины транзакции текущего задатчика.

Задержка захвата шины.

     Эта задержка может иметь разную величину  и  определяется  тем, что задатчик с большим приоритетом,  получив сигнал разрешения GNT#, может начать транзакцию только тогда, когда текущий задатчик освободит шину и она перейдет в состояние холостого хода.

     Минимальная задержка, равная нулю, получается тогда, когда сигнал FRAME# текущего задатчика сброшен,  и шина находится в состоянии холостого хода при получении задатчиком с большим приоритетом разрешения на захват шины,  и он поэтому может начать транзакцию в момент получения сигнала разрешения GNT#, а текущий задатчик лишается права на доступ к шине.  Это правило действует всегда, кроме одного исключения,  когда сигнал разрешения задатчика с большим приоритетом GNT# приходит на том же импульсе,  когда начинается  текущая  транзакция, установкой сигнала FRAME#.  В этом случае текущая транзакция продолжается и задатчик с большим приоритетом получит доступ к шине только после  ее  прекращения.  Для этой ситуации величина задержки захвата шины зависит от количества импульсов,  идущих на фазу адреса и  данных,  а также от заданной величины Таймера задержки.  Будем считать, что число импульсов транзакции равно N,  а величина Таймера задержки равна T импульсам.  Тогда, если T>N, то величина задержки равна N+1, где к N добавляется еще один импульс холостого хода.  Если  T<N,  то задержка равна T+1 (см. раздел Таймер задержки).

     В случае,  когда задатчик с большим приоритетом получает разрешение в момент,  когда сигнал FRAME# текущего задатчика еще установлен, то текущая транзакция либо продолжится,  либо прервется.  Будем считать, что сигнал GNT# текущего задатчика сбрасывается одновременно с установкой GNT# объекта с большим приоритетом.  В этой ситуации величину задержки можно определить следующим образом. Пусть время от начала текущей  транзакции  до  момента  установки (сброса) сигналов GNT# равно S<N импульсов.  Тогда, если T>N, то задержка равна N+1-S. Если T<N,  то  когда S>T задержка равна S+1,  а когда S<T - задержка равна T+1 импульс.

Задержка исполнителя.

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

     Рассмотрим два примера расчета задержки доступа,  приведенных в спецификации  шины  PCI. Расчет ведется при следующих предположениях:

     - шина PCI работает с частотой 33 МГц;

     - задержка  исполнителя  составляет 16 импульсов (0.5мксек) для

       всех устройств на шине PCI;

     - время на одну фазу данных в пакете равно 8 импульсам.

Пример 1. Задатчик делает запрос,  когда других запросов нет и шина находится в состоянии холостого хода.

     Задержка арбитрации является типовой и равна 2-м импульсам. Задержка захвата шины равна 0,  т.к.  шина в состоянии холостого хода. Задержка исполнителя равна  16  импульсам.  Общая  задержка  доступа равна 18 импульсам (0.54мксек).

Пример 2. Задатчик делает запрос на захват шины в момент, когда текущий  задатчик начинает транзакцию.

     Задатчик производит передачу 16 фаз данных. Таймер задержки в системе установлен на 66 импульсов, которые  эквивалентны 2 мксек.  Подсчитаем величину времени задержки доступа задатчика с большим приоритетом к шине, когда на ней работает текущий задатчик.

     Отсчет задержки доступа начинается с импульса,  по которому арбитр получает запрос REQ# от задатчика с большим приоритетом,  а текущий задатчик начинает транзакцию,  установив по  переднему  фронту этого импульса сигнал FRAME#.

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

     Считаем также,  что получение разрешения GNT# задатчика с большим приоритетом происходит одновременно со сбросом GNT# текущего задатчика.

     Видно, что в данном примере происходит прерывание текущей транзакции, т.к.  время требуемое  для ее выполнения равно 136 импульсов (16 импульсов на фазу адреса и первую фазу данных, т.к. задержка исполнителя равна  16 импульсам,  и на 15 фаз данных идет 15*8=120 импульсов).

     Тогда суммарная задержка арбитрации и захвата шины задатчиком с большим приоритетом равно времени от начала текущей транзакции до её прекращения по сигналу Тайм-аут, когда исчерпаны 66 импульсов Таймера задержки.  За это время, текущий задатчик выполняет фазу адреса и первую  фазу  данных,  что составляет 16 импульсов,  затем еще 6 фаз данных,  что в сумме составляет 16+8*6=64 импульса и затем последнюю фазу данных в 8 импульсов.

     Получается, что на 72 импульсе завершается текущая транзакция и наступает состояние  холостого хода шины.  На 77 импульсе начинается транзакция задатчика с большим приоритетом,  и начинается отсчет его задержки исполнителя, равной 16 импульсам.

     Поэтому суммарная задержка доступа к шине задатчика  с  большим приоритетом, составляет   72+16=88   импульсов,   что   эквивалентно 2.7 мксек.

     На приведенной временной диаграмме к примеру 2,  текущий задатчик - это задатчик А, другой - задатчик В.


Таймер задержки
Таймер задержки (Latency Timer)

     На шине могут работать несколько задатчиков.  Для разделения во времени  шины  между ними используется арбитр, который соединяется с каждым задатчиком с помощью  двух  индивидуальных  линий  типа  точка-точка. Одна идет от задатчика - линия запроса шины (REQ),  другая от арбитра - линия разрешения подключения задатчика к шине (GRN).

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

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

     Чтобы уйти от таких неприятностей, на шине PCI предусмотрен механизм Таймера задержек (Latency Timer).  Он заключается в том,  что для любого задатчика вводится фиксированное время, в течении которого прерывать транзакцию нельзя.  Это время задается Таймером задержки, который включается в начале транзакции.  Время задается  в  виде количества импульсов CLK. После исчерпания времени, задаваемого Таймером задержки,  выдается сигнал Тайм-аут.  Если в момент  Тайм-аута сигнал разрешения  GNT# текущего задатчика был сброшен,  то он сразу завершает транзакцию  не  дожидаясь  ее  окончания.  Если  в  момент Тайм-аута сигнал GNT# не сброшен,  то транзакция продолжается до момента Тайм-аута,  после чего  транзакция  прерывается.  Если  сигнал Тайм-аут отсутствует, то транзакция продолжается до конца.

     Этот механизм  отслеживает максимальную задержку доступа к шине не более N+1 тактов шины, где N - это число импульсов записываемое в Таймер задержки.


Арбитрация

     Каждый задатчик на шине PCI получает доступ к шине только после разрешения на захват шины от Арбитра.  Для этого используется специальные, индивидуальные  для каждого задатчика линии (типа точка-точка) запроса REQ# к арбитру и разрешения GNT# к задатчику от арбитра.

     Для доступа к шине, задатчик выдает арбитру сигнал запроса REQ# и может захватить шину только после  получения  от  арбитра  сигнала разрешения GNT#.

     Процесс арбитрации не требует дополнительных циклов шины,  т.к. он совмещается  с выполнением других операций,  кроме случая,  когда шина не занята и находится в состоянии холостого хода (IDLE цикл).

     Захват шины задатчиком и выполнение транзакции идет в такой  последовательности. Задатчик выдает запрос REQ#, через время задержки арбитрации арбитр выдает задатчику сигнал разрешения GNT#,  через  время задержки ожидания захвата шины задатчик начинает транзакцию,  выставив сигнал FRAME#.  Идет передача одной или нескольких транзакций, в конце последней транзакции производится сброс сигнала REQ#, затем GNT#.

     Такой процесс происходит тогда, когда нет запросов шины от задатчиков с большим приоритетом.

     Если во время работы текущего задатчика  появляется  запрос  от объекта с  большим приоритетом,  то либо идет прерывание транзакции, либо она выполняется до конца,  а затем шина переходит к задатчику с большим приоритетом.

Рассмотрим процессы установки и сброса сигналов REQ# и  GNT#  в различных ситуациях.

•	Задатчик выдает сигнал REQ# по фронту любого импульса синхронизации шины (CLK).

•	Задатчик может сбросить сигнал  REQ#  на  любом  импульсе  CLK, сброс этого  сигнала арбитр интерпретирует  как то,  что задатчику больше шина не требуется и  можно  сбросить  его  сигнал  разрешения GNT#.

•	Если задатчику требуется выполнение только одной транзакции, то он сбрасывает  REQ#  на первом импульсе CLK,  начинающем транзакцию, одновременно с установкой сигнал FRAME# этой транзакции.

•	Если задатчику требуется передаче нескольких транзакций,  то он должен удерживать свой REQ# до последней транзакции, т.к. арбитр дает разрешение только на одну транзакцию.

•	Когда транзакция заканчивается по инициативе исполнителя  установкой сигнала STOP#,  задатчик должен сбросить свой REQ# минимум за два импульса CLK.  Если задатчик намеревается продолжить  прерванную исполнителем транзакцию, он должен переустановить свой сигнал REQ#.

     Таким образом  в одно и то же время могут быть установлены REQ# от нескольких задатчиков.

     В ответ на  запрос  арбитр выдает сигнал разрешения GNT#.  При нескольких запросах REQ# арбитр выдает сигнал разрешения GNT# задатчику, имеющему в данный момент времени наивысший приоритет.

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

     Арбитр выдает сигнал разрешения GNT# в ответ на запрос REQ# с некоторой задержкой арбитрации.  Эта задержка измеряется от  момента установки REQ# (т.е.  от первого импульса CLK, которому соответствует стабильное значение REQ#) до момента получения стабильного значения сигнала GNT# задатчиком (т.е.  до первого импульса CLK, которому соответствует стабильное значение GNT#). Это время измеряется в числе импульсов CLK.

     Время задержки арбитрации зависит от алгоритма арбитрации, уровня приоритета устройства.  Минимальная задержка арбитрации получается в случае,  когда шина находится в  состоянии  холостого  хода (IDLE).

     Типовая задержка арбитрации для задатчика с наивысшим приоритетом, при  наличие  на шине текущего задатчика,  равна двум импульсам CLK.

     Если текущего задатчика нет, то задержка равна одному импульсу.

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

     Арбитр может  сбросить  сигнал GNT# задатчика на любом импульсе CLK для обслуживания объекта с большим приоритетом.

     Сброс сигнала  GNT#  может  производиться либо в ответ на сброс своего сигнала запроса REQ#,  либо в случае,  когда пришел запрос от задатчика с большим приоритетом.

     Арбитр может сохранить установленный сигнал разрешения GNT# для данного  задатчика  и при сбросе этим задатчиком сигнала REQ#,  если нет других требований на захват шины.

     Если FRAME# сброшен, GNT# этого задатчика может быть снят в любой момент времени в порядке обслуживания задатчика с более высоким  приоритетом или в ответ на сброс своего REQ#.

     Арбитр может сбросить GNT# одного объекта  в  момент  установки GNT# другого с более высоким приоритетом, если на шине нет состояния холостого хода.  В противном случае,  требуется задержка в один  импульс  между сбросом одного GNT# и установкой другого,  чтобы исключить состязания на шине по сигналам AD и PAR.

     Если шина находится в состоянии холостого хода (IDLE) и  арбитр сбросил  GNT#,  то  задатчик прекращает транзакцию и теряет доступ к шине,  за исключением случая когда происходит одновременно (на одном и том же импульсе CLK) сброс GNT# и установка FRAME# объекта. В этом случае транзакция продолжается.

     Если задатчик не использует шину после получения сигнала разрешения GNT#  (его REQ# установлен) в течении 16 импульсов,  то арбитр отключает его от шины.

     Получив сигнал GNT# задатчик не сразу захватывает шину, а через некоторое время, называемое задержкой ожидания захвата шины (задержкой захвата).  Это  время  от получения GNT# задатчиком до установки стабильного значения сигнала FRAME#.  Оно также измеряется количеством импульсов CLK.

     Задержка захвата определяется тем,  что задатчик получив разрешение GNT# может начать свою транзакцию только тогда, когда шина будет находиться в состоянии холостого хода (сброшены FRAME# и IRDI#). Поэтому этот задатчик ждет,  пока текущий задатчик завершит транзакцию и шина перейдет в состояние холостого хода.

     Текущий задатчик завершает транзакцию в следующих случаях:

1.	Нормальное завершение в конце транзакции.

2.	Завершение по прерыванию транзакции:

•	прерывание от задатчика, когда появляется сигнал тайм-аут (время таймера задержки истекло) и сброшен его сигнал GNT#;

•	прерывание от исполнителя,  когда исполнитель выдает сигнал STOP#.


Электронный урок

В электронном уроке вам предлагается смоделировать транзакции чтения или записи на шине PCI. Для этого вам предлагается два задания. На пустой временной диаграмме задания отмечены: сигнал CLK и сигналы шины PCI, участвующие в данной транзакции и представленные на диаграмме в пассивном состоянии.

Рисование временных диаграмм производится в представленной на экране сетке, где по горизонтали идут два типа линий. Одна вертикальная линия (штриховая) соответствует переднему фронту каждого импульса CLK, а другая (штрих-пунктирная) отмечает точки, где рисуются фронты сигналов шины, (показывающие моменты переключения сигналов от пассивного к активному состоянию и наоборот. Таким образом отображается задержка между фронтом импульса CLK, по которому переключается сигнал и стабильным значением этого сигнала.

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

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

Итак, как выполнить моделирование?

Прочтите текст задания в первой строке окна. Затем продумайте, какие сигналы становятся активными в заданной транзакции и в каких тактах и когда они становятся опять пассивными и в каких тактах, где располагаются фазы адреса/данных на временной диаграмме от начала транзакции до её конца.

Теперь смоделируйте заданную транзакцию. Для этого последовательно изобразите с помощью мыши активность/пассивность для каждого из участвующих в транзакции сигналов. Нажмите левую кнопку мыши, указав ею на рабочую область сигнала. Она выделится цветом. Затем щелкните правой кнопкой, указав на то место транзакции, где сигнал станет активным, затем щелкните правой кнопкой, указав на то место транзакции, где он опять становится пассивным. Если сигнал станет активным в данной транзакции еще раз, проделайте то же самое.

Рисование сигнала продолжить до последнего импульса транзакции. Затем щелкните левой кнопкой мыши на следующем сигнале и таким же способом изобразите его временную диаграмму. И так для всех сигналов, участвующих в транзакции. Пользуйтесь также кнопкой “Очистить” для очистки всей диаграммы редактируемого сигнала.

Когда вся временная диаграмма будет готова, нажмите кнопку "Готово" и в результате проверки в верхней строке окна появятся названия тех сигналов, во временных диаграммах которых вы допустили ошибку.

Вы можете еще раз попробовать смоделировать ту же транзакцию, учтя ошибки. Для этого нажмите кнопку "Ещё раз". И отредактируйте диаграмму (пользуйтесь кнопкой "Очистить"). Когда диаграмма будет готова снова нажмите кнопку "Готово". Если же вы не можете одолеть это задание, нажимайте кнопку "Дальше" для перехода к следующему заданию.

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

Моделирование протоколов транзакции и их отрисовка стали возможны благодаря следующему:

•	Переключение всех сигналов шины идёт синхронно с передним фронтом импульсов синхронизации CLK.

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

•	Все сигналы на временных диаграммах могут быть изображены с помощью двух типовых форм начертания. Одна для сигналов AD и C/BE#. Другая для всех остальных сигналов.


Контрольные вопросы

В экране контрольных вопросов вам будет предложено несколько контрольных вопросов, ответ на которые вы должны указать выбором единственного варианта из группы ответов щелчком мыши и нажав кнопку “Ответ готов”.