Циклы системного интерфейса PCI


Любой цикл системного интерфейса состоит из двух фаз: фазы адреса и фазы данных. Т.к. интерфейс синхронный, то длительность адресной фазы и фазы данных задается тактовым сигналом.

Системный интерфейс PCI может работать в 3 режимах:

1. IDLE — пассивный режим.

2. ADR — режим передачи адреса или командная часть цикла.

3. DATA — часть цикла связанная с обменом данных.

Диаграмма общего способа обмена данными по интерфейсу PCI

Рис. 1. 9. Диаграмма общего способа обмена данными по интерфейсу PCI

D – данные.

Первый режим — это пассивный (IDLE). На него отводится 2 такта.

При этом режиме: FRAME# – высокий уровень

C/BE# — безразличный уровень (или 0 или 1).

AD – безразличный уровень.

IRDY#, TRDY#, DEVSEL# — высокий уровень.

Цикл системного интерфейса начинается с сигнала FRAME#, поэтому сигнал фиксируется по переднему фронту вплоть до постоянного уровня. Значит, по переднему фронту происходит изменение всех сигналов так, чтобы, когда сигнал CLK станет вплоть до постоянного уровня, сигналы могут быть зафиксированы, то есть должны быть воспринимаемы на интерфейсе.

Под адресный режим (ADR) отводим 1 такт. Далее в этой части передается также еще и команда, то есть, какой тип цикла в данный момент будет выполняться. Причем команда передается ровно 1 такт, после этого передаются сигналы BE# и наступает фаза передачи данных (отводится 2 такта). Далее в AD выставляется адрес, который сменяется данными. При чтении данных данные выставляются позже, а при записи выставляются сразу.

Понятно, что при записи данных, данные сразу же готовы, а при чтении – выдали команду, выдали адрес; устройство должно иметь время сообразить каким образом, какие данные нужно передать – на это дается целый такт. Далее IRDY# сообщает о том, что он готов передать или принять данные, то есть сразу после адреса. TRDY# сообщает о своей готовности конечно позже. В данном случае с опозданием на 1 такт. Как только устройство дешифрировало адрес, то есть опознало, что идет обращение в его адресное пространство, оно выставляет сигнал DEVSEL#.

Далее идет цикл с двойным адресом (ADR2). В этом случае сигнал FRAME# ведет себя точно также и в AD передаются 2 порции адреса, если это 32 разрядный интерфейс — это 64 бита адреса передается, если 64 разрядный, то 128 бит, сначала младшая часть адреса (A0), потом старшая часть (А1). Далее все идет стандартным образом: 2 периода тактового сигнала идет на фазу передачи данных и происходит тоже самое. Потом идет IDLE.

Всего существует порядка 12 типов обмена по системному интерфейсу PCI.

Протокол арбитража

Рис. 1. 10. Протокол арбитража

ADR – адрес

Цикл чтения

Рис. 1. 11. Цикл чтения

CMD – команда.

Цикл записи

Рис. 1. 12. Цикл записи

Сигнал FRAME# сигнализирует о завершении транзакции на системной шине. В момент перехода в пассивное состояние передаётся последняя порция данных. На системном интерфейсе PCI выставляется адрес байта и увеличивается адрес.

Множественная запись в память – Multiple Memory Write

Множественная запись в память - Multiple Memory Write

Рис. 1. 13. Множественная запись в память — Multiple Memory Write

Запись в память это 7-й номер обмена на системном интерфейсе. Он интересен в следующем: после выставления команды тут же выставляются данные, но так как это запись, инициатор уже имеет эти данные для того, чтобы их передавать. Понятно, что он при этом говорит, что он готов и выдал данные. Далее через некоторое время устройство отвечает, что оно эти данные приняло и предварительно сообщает, что оно найдено. Для памяти существуют 2 варианта чтения или записи: обычное (похожее на чтение ввода/вывода) и множественное. Управляет множественным доступом к системному интерфейсу сигнал FRAME#: если сигнал FRAME# инициатором не восстанавливается после адресной части цикла, то это означает, что режимом работы этого системного интерфейса является множественный обмен, то есть выставляются какие-то данные D1 и, как правило, чтобы завершился обмен между инициатором и ресурсом требуется не один, а два цикла, поэтому минимальная длительность этой части по передачи первой порции данных равна двум тактам. После этого, если сигнал FRAME# не установлен в исходное состояние и остался активным, считается множественная запись когда, не передавая адреса, выставляется следующая порция данных. Данные меняются каждый такт, пока сигнал FRAME# активен. Это позволяет увеличить на 30% эффективность передачи данных по интерфейсу. Оказывается, есть такая локальная парадигма, которая часто используется в области вычислительной технике, а именно принцип локальности – когда часто данные, которые требуются для следующего обмена передачи использования обработки, находятся рядом. Поэтому подразумевается, что мы передали начальную часть адреса массива, а дальше со смещением 0, со смещением 1 и так далее. Тоже самое происходит при множественной записи. Единственное отличие – данные появляются не сразу, а с опозданием. Подразумевается, что адреса увеличиваются на размер передаваемых данных, то есть адреса увеличиваются на 4 для 32 разрядного интерфейса и на 8 для 64 битного интерфейса.