Аппаратные интерфейсы ПК

Обычная передача данных


Для передачи данных от исполнителя к задатчику предназначены циклы чте­ния ячейки памяти или порта ввода-вывода, для передачи данных от задатчика к исполнителю — циклы записи ячейки памяти или порта ввода-вывода. В каждом цикле текущий (на время данного цикла) задатчик формирует адрес обращения и управляющие сигналы, а в циклах записи еще и данные на шине. Адресуемое устройство-исполнитель в соответствии с полученными управляющими сигнала­ми принимает (в цикле записи) или формирует (в цикле чтения) данные. Также оно может, при необходимости, управлять длительностью цикла и разрядностью передачи. Обобщенные временные диаграммы циклов чтения или записи памяти или ввода-вывода приведены на рис. 6.2. Здесь условный сигнал CMD* изобра­жает один из следующих сигналов:

¦ SMEMR#, MEMR# — в цикле чтения памяти;

¦     SMEMW#, MEMW# — в цикле записи памяти;

¦     IOR# — в цикле чтения порта ввода-вывода;

¦     IOW# — в цикле записи порта ввода-вывода.

В каждом из рассматриваемых циклов активными (с низким уровнем) могут быть только сигналы лишь из одной строки данного списка, и во время всего цикла сиг­нал AEN имеет низкий уровень. Цикл прямого доступа к памяти, в котором это пра­вило не соблюдается, рассмотрен ниже, и в таком цикле сигнал AEN будет иметь высо­кий уровень. Сигналы SMEMR* и SMEMW* вырабатываются из сигналов MEMR# и MEMW# соответственно, когда адрес принадлежит диапазону О-FFFFFh. Поэтому сигналы SMEMR* и SMEMW* задержаны относительно MEMR# и MEMW* на 5-10 не.

152

Глава 6. Шины и карты расширения

Рис. 6.2. Временные диаграммы циклов чтения или записи на шине ISA

В начале каждого цикла контроллер шины устанавливает адрес обращения: на линиях SA[19:0] и SBHE# действительный адрес сохраняется на время всего теку­щего цикла; на линиях 1_А[23:17] адрес действителен только в начале цикла, так что требуется его «защелкивание». Каждое устройство имеет дешифратор адре­са — комбинационную схему, срабатывающую только тогда, когда на шине при­сутствует адрес, относящийся к данному устройству.
В фазе адресации устройства еще «не знают», к какому из пространств (памяти или ввода-вывода) относится выставленный адрес. Но дешифраторы адресов уже срабатывают, и, когда в сле­дующей фазе шина управления сообщает тип операции, адресуемое устройство уже оказывается готовым к ее исполнению. Если устройство использует линии LA[23:17] (они нужны лишь для обращений к памяти выше границы FFFFFh), то они на дешифратор адреса должны проходить через регистр-защелку, «прозрач­ный» во время действия сигнала BALE и фиксирующий состояние выходов по его спаду. Это позволяет дешифратору, всегда вносящему некоторую задержку, начи­нать работу раньше, чем поступит управляющий сигнал чтения или записи. При обращении к портам ввода-вывода сигналы 1_А[32:17] не используются.



Если устройство имеет более одного регистра (ячейки), то для выбора конкретно­го регистра (ячейки) ему требуется несколько линий адреса. Как правило, стар­шие биты шины адреса поступают на вход дешифраторов адреса, формирующих сигналы выборки устройств, а младшие биты — на адресные входы самих устройств. Тогда каждое устройство в пространстве будет занимать наиболее компактную область смежных адресов размером в 2П байт, где п — номер младшей линии адре­са, поступающей на дешифратор. Из них реально необходимы 2Ш адресов, где m — номер самой старшей линии адреса, участвующей в выборе регистра устройства. В идеале должно быть n=m+l: при большем значении п отведенное (по дешиф-

6.1. Шины ISA, EISA и PC/104_______________________________ 153

ратору) пространство адресов не будет использовано полностью и регистры уст­ройства будут повторяться в отведенной области 2n"m"1

раз, то есть у них появятся адреса-псевдонимы (alias). Адреса-псевдонимы будут отличаться от истинного адреса (минимального из всех псевдонимов) на Kx2m+1, где К — целое число. Мень­шее значение п недопустимо, поскольку тогда не все регистры устройства будут доступны задатчику. В принципе можно использовать дешифратор адреса, сра­батывающий только на какой-то части адресов из области 2П (не кратной степени двойки), если устройству требуется «неудобное» количество регистров.


Однако на практике « фигурное выпиливание» областей из пространства адресов обычно не делают, так что часть адресов может пропадать бесполезно.

Разрядность данных в каждом цикле обращения определяется потребностями текущего задатчика и возможностями исполнителя. В IBM PC/XT и системная шина, и шина ISA были 8-разрядными, так что вопросов согласования разрядно­сти не возникало. В IBM PC/AT286 (и 386-SX) системная шина уже 16-разряд­ная, и в современных ПК с 32- и 64-разрядными системными шинами контроллер шины ISA является ее 16-разрядным задатчиком. На системной плате имеется «косой буфер», он же перестановщик байтов, который при необходимости транс­лирует данные с младшего байта шины на старшую или обратно. Логика управле­ния этим буфером использует сигналы SBHE#, SAO, IOCS16* и MEMCS16*. Под­держка 16-разрядных передач сообщается адресуемым исполнителем сигналами IOCS16* и MEMCS16* при срабатывании его дешифратора адреса. Сигнал IOCS16# влияет только на разрядность обращений к портам, MEMCS16* — к памяти. Все операции обмена (транзакции) начинаются задатчиком единообразно, поскольку он еще не «знает» возможностей исполнителя. Развитие событий зависит от наме­рений задатчика и полученных сигналов разрешения 16-битных передач. В чисто 16-разрядных машинах начальный адрес однозначно соответствует передаваемо­му байту или младшему байту передаваемого слова1. В машинах с 32-разрядными процессорами начальный адрес, выставляемый на шине в начале транзакции, за­висит от разрядности данных, запланированной задатчиком, и может зависеть от положения адресуемых данных относительно границы двойного слова (32 битно­го). 16-разрядные передачи выполняются за 1 цикл только при условии передачи по четному адресу (АСНО) и при ответе исполнителя сигналом IOCS16* или MEMCS16*, в иных случаях они разбиваются на два цикла. 32-разрядные пере­дачи будут разбиваться на 2 (16+16), 3 (8+16+8) или 4 (8+8+8+8) цикла, в за­висимости от возможностей исполнителя и четности адреса.


Порядок, в котором передаются байты (во времени), неоднозначен (возможен как инкремент, так и дек­ремент адреса), но в адресном пространстве они раскладываются по своим местам однозначно.

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

1 То есть адрес слова в L-H порядке, принятом для изделий Intel.

154_____________________________________ Глава 6. Шины и карты расширения

16-разрядных данных выполнялся командой OUT DX,AX (в DX — адрес порта, в АХ —

данные; AL содержит младший байт, АН — старший), вывод 8-разрядных — коман­

дой OUT DX,AL. Несколько неожиданные (для автора) варианты 3 и 6 с декремен­

том адреса, возможно, будут иметь место не на всех системных платах, но их сле­

дует иметь в виду при проектировании устройств, претендующих на глобальную

совместимость. Правда на практике 16-битных передач по нечетным адресам

обычно избегают (даже чисто подсознательно), и побочные эффекты от такого

порядка маловероятны.                        /

Таблица 6.4. Состояние сигналов при 8- и 16-битных обращениях к устройству ISA

Сигнал (шина)                        1 цикл                                             2 цикл

1. Вывод 16-разрядных данных в 16-битное устройство по четному адресу

SBHE#                                     L

SA                                           DX(AO=0)

D[15:8]                                    АН

D[7:0]                                      AL                                                   -

IOCS16#                                 L

2. Вывод 16-разрядных данных в 16-битное устройство по нечетному адресу ххх1,ххх5, xxx9,xxxD

SBHE#                                     L                                                      H

SA                                           DX(AO=1)                                      DX+1 (A0=0)

D[15:8]                                    AL                                                   0



D[7:0]                                      AL                                                   AH

IOCS16#                                 L                                                      L

3. Вывод 16-разрядных данных в 16- битное устройство по нечетному адресу хххЗ,ххх7, xxxB.xxxF

SBHE#                                     H                                                     L

SA                                           DX+1 (A0=0)                                 DX (A0= 1)

D[15:8]                                    0                                                      AL

D[7:0]                                      AH                                                   0

IOCS16*                                 L                                                      L

4. Вывод 16-разрядных данных в 8-битное устройство по четному адресу

SBHE#                                     L                                                      L

SA[1:0]                                    DX(AO=0)                                     DX+1(AO=1)

D[15:8]                                    AH                                                   AH

D[7:0]                                      AL                                                   AH

IOCS16*                                 H                                                      H

5. Вывод 16-разрядных данных в 8-битное устройство по нечетному адресу ххх1,ххх5, xxx9,xxxD

SBHE#                                     L                                                      H

SA[ 1:0]                                   DX (A0= 1)                                     DX+1 (A0=0)

D[15:8]                                    AL                                                   0

D[7:0]                                      AL                                                   AH

IOCS16#                                 H                                                     H

6.1. Шины ISA, EISA и PC/104________________________________________ 155



Сигнал (шина)____________ 1 цикл______________________ 2 цикл______________________

6. Вывод 16-разрядных данных в 8- битное устройство по нечетному адресу хххЗ,ххх7, xxxB,xxxF

SBHE#                                     H                                                     L

SA[1:OJ                                  DX+1(AO=0)                                 DX(AO=1)

D[15:8]                                    0                                                      AL

D[7:0]                                      AH                                                  AL

IOCS16#                                 H                                                     H

7. Вывод 8-разрядных данных в 16-битное устройство по четному адресу

SBHE#                                     H

SA[1:0]                                    DX(AO=0)

D[15:8]                                    0

D[7:0]                                      AL

IOCS16*                                 L

8. Вывод 8-разрядных данных в 16-битное устройство по нечетному адресу

SBHE#                                     L

SA[1:0]                                    DX(AO=1)

D[15:8]                                    AL

D[7:0]                                      0(AL?)

IOCS16*                                 L

Момент помещения действительных данных на линии SD[15:0] определяется управляющими сигналами чтения/записи, так что исполнителю не требуется син­хронизация с тактовым сигналом шины. В циклах чтения адресованный исполни­тель должен выдать данные на шину по началу (спаду) соответствующего сигнала чтения (IOR#, MEMR#, SMEMR#) и удерживать их до конца действия сигнала (пока не произойдет подъем сигнала). В циклах записи задатчик выставляет действи­тельные данные несколько позже начала (спада) сигнала записи (IOW#, MEMW#, SMEMW#). Устройство-исполнитель должно фиксировать для себя эти данные в конце цикла по подъему сигнала записи. От устройства-исполнителя не преду­сматривается никаких подтверждений исполнения циклов; длительность цикла устанавливает задатчик, но исполнитель может потребовать удлинения или уко­рочения циклов.


С помощью сигнала IOCHRDY исполнитель может удлинить цикл на произвольное число тактов, при этом задатчик будет вводить дополнительные такты ожидания (wait states). Обычно контроллер шины следит за длительностью цикла и по достижении критического времени принудительно его завершает (по тайм-ауту, возможно, и не сообщая об этом событии). Слишком длинные циклы тормозят работу компьютера, а превышение длительности 15 мкс может привести к сбою регенерации и потере данных в ОЗУ. С помощью сигнала OWS# исполни­тель предлагает задатчику укоротить цикл, исключив такты ожидания. Реакция задатчика на одновременное использование сигналов IOCHRDY и OWS# непред­сказуема, этой ситуации следует избегать.

ВНИМАНИЕ

Некорректное управление сигналом IOCHRDY (его «залипание» на низком уровне) тормозит работу компьютера.

156_______________________________         Глава 6. Шины и карты расширения

Номинальная длительность цикла определяется чипсетом и может программиро­ваться в BIOS Setup заданием числа тактов ожидания (wait states). При этом цик­лы обращения к памяти, как правило, короче циклов обращения к портам ввода-вывода. Для управления длительностью цикла используются также сигналы управления разрядностью передачи: если устройство поддерживает 16-битные передачи, предполагается, что оно может работать с меньшим количеством тактов ожидания. Этим объясняется, что в BIOS Setup длительности циклов ISA задают­ся раздельно как для памяти и ввода-вывода, так и для 8- и 16-битных операций. Кроме длительности цикла, устройства могут быть критичны к времени восста­новления (recovery time) — длительности пассивного состояния управляющих сигналов чтения-записи между циклами. Этот параметр также может программи­роваться в BIOS Setup и тоже раздельно для 8- и 16-разрядных операций.

Карты расширения для подключения к шине данных, как правило, используют буферные микросхемы, раздельные для линий SD[7:0] и SD[15:8]. Здесь широко применяются микросхемы 74ALS245 (1533АП6) — 8-разрядные двунаправленные приемопередатчики.


Буфер должен открываться сигналом ОЕ# (Output Enable — разрешение выхода), когда на шине адреса присутствует адрес, относящийся к ди­апазону адресов подключаемого устройства. «Дежурным» является направле­ние передачи «от шины — к устройству»; переключение в обратную сторону про­изводится по сигналу IOR#, если устройство представляет порты ввода-вывода, или MEMRD*, если устройство приписано к пространству памяти. Таким образом, буферы имеют право передавать данные на шину (управлять шиной данных) толь­ко во время действия сигнала чтения, относящегося к зоне адресов данного устрой­ства. Карта расширения может являться комбинацией 8- и 16-битных устройств; например, некогда популярные мультикарты содержали 16-битный адаптер AT A и набор 8-битных контроллеров портов COM, LPT, GAME и контроллера НГМД. В таких картах логика управления буферами и сигналами IOCS16* и MSC16* управляется сигналами от дешифратора адреса. Если устройство по данному адре­су является 8-разрядным (не формирует сигналы IOCS16* или MSC16*), то оно имеет право разрешать чтение только через буфер линий SD[7:0], а буфер старших линий SD[15:8] (если он имеется на карте) должен быть переведен в третье состо­яние. Если устройство по данному адресу является 16-разрядным, то оно форми­рует сигнал IOCS16* или MSC16*, а разрешением буферов управляют сигналы SBHE* и SAO. В этом случае буфер линий SD[7:0] разрешается только при SAO=0, а буфер линий SD[15:8] разрешается только при SBHE#=L. Некорректное раз­решение буферов может приводить к их конфликту с перестановщиком байтов системной платы и искажениям данных.

Восьмиразрядные устройства (например, микросхемы 8255, 8250, 8253 и т. п.) следует подключать только к линиям SD[7:0] и при обращении к ним не формиро­вать сигналы IOCS16* или MSC16*. Никакие «косые» буферы (перестановщики байтов) на интерфейсных картах не нужны.

В одном из источников описывается эффект перестановки байтов при обращении к порту ввода-вывода: «Если прочитать слово из порта по четному адресу, значе­ние одно, а если по нечетному — старшие 8 бит предыдущего значения становятся



6.1. Шины ISA, EISA и PC/104_________________________________________ 157

младшими, а старшие нового = FFh». Первые подозрения падают на ошибку в логи­ке управления буферами. На самом деле все объясняется гораздо проще. Пусть имеется устройство с двухбайтным регистром, младший байт которого имеет ад­рес RO (четный), старший — RO+1, а по адресу R+2 устройство (и никакие другие) не откликается. Пусть в данный момент в нем записано число AA55h, тогда чтени­ем порта по команде IN AX, R0 получим в регистрах процессора AL=55h, AH=AAh. Теперь если попытаться его «прочитать по нечетному адресу», то есть командой IN АХ, R0+1, то получим AL=AAh (содержимое RO+1, к которому мы на самом деле и адресовались!), a AH=FFh (результат чтения «пустоты»). Так что это не «эффект перестановки», а просто незнание общего правила «интеловской» адресации: ад­ресом слова (двойного, учетверенного...) является адрес его младшего байта. Если в нашем устройстве применяется неполная дешифрация адреса (линия SA1 не ис­пользуется ни для дешифрации адреса, ни для выбора регистра), то мы увидим полную перестановку байт — в AH=55h, результат чтения RO по адресу-псевдони­му RO+2. Логика работы контроллера шины вместе со всеми буферами делает обращение к любой ячейке памяти или порту инвариантным к способу программ­ной адресации — что закажешь, то и получишь, но требуется учитывать особенно­сти периферийных устройств, у которых в адресации портов нередко встречаются псевдонимы. Адреса-псевдонимы встречаются и в пространстве памяти (напри­мер, копии образов BIOS под границей 1^го и 16-го мегабайтами памяти в «клас­сических» PC/AT).


Содержание раздела