Шрифт:
Варианты схем, приведенные на рис. 11.5, учитывают практические детали. Оказывается, в большинстве логических семейств отсутствуют 3-входовые вентили ИЛИ! Одним из возможных решений является использование 2-входовых вентилей, как показано на рис. 11.5. Более современный способ - поместить всю вентильную логику в комбинационную ПЛМ; помимо уменьшения числа микросхем, это дает вам возможность, используя высокую плотность вентилей в ПЛМ, генерировать с помощью одной микросхемы стробирующие и разрешающие сигналы для дополнительных периферийных портов.
Одна незначительная деталь приведенного примера предвосхитила материал следующего раздела. В процессе обработки прерывания (см. ниже) МП 68008 выполняет цикл подтверждения прерывания, выглядящий, как цикл чтения самого верха памяти (линии А4-А19 установлены в 1). Если в этой области адресного пространства вы располагаете память или какие-то регистры, их надо заблокировать на время цикла прерывания, идентифицируемого по состоянию битов FC0-2 «функционального кода». Все это поясняется в следующем разделе.
Прерывания. В МП 68008 реализуются и автовекторизуемые, и полностью векторизуемые (с подтверждением) прерывания (если вы забыли, что это такое, см. разд. 10.11), для чего используется вторая группа сигналов шины из табл. 11.4. В обоих случаях вы запрашиваете прерывание, устанавливая на двух линиях приоритетного запроса (IPL') некоторую комбинацию низких уровней. Две линии определяют три уровня прерываний (четвертое состояние - на обеих линиях высокий потенциал - соответствует отсутствию прерывания). Эти линии схожи с линиями IRQ магистрали IBM PC, но поскольку они чувствительны к уровню, к каждому уровню прерываний можно подключить несколько прерывающих устройств, (Полезно заметить, что МП 68000, а также некоторые варианты МП 68008 имеют 3 линии IPL', что позволяет определить 7 уровней прерываний.)
ЦП, обнаружив запрос прерывания (по крайней мере одна линия в низком состоянии), выполняет цикл подтверждения (рис. 11.6), в течение которого идентифицируется источник прерываний.
Рис. 11.6. Цикл подтверждения прерывания.
ЦП устанавливает на линиях А1-А3 значение уровня прерывания, а на линиях А4-А19 высокий уровень; все линии функционального кода FC0-2 устанавливаются в высокое состояние. Затем ЦП выполняет цикл чтения (устанавливая сигнал R/W' в высокое состояние). Теперь ваши внешние цепи определяют вид цикла подтверждения: автовекторизуемое (переход в соответствии с уровнем IPL') или с подтверждением (переход в соответствии с вектором, установленным прерывающим устройством на линиях D0-D7). Более просто реализуется автовекторизуемое прерывание (рис. 11.7).
Рис. 11.7. Автовекторизуемое прерывание.
Внешняя цепь обнаруживает цикл подтверждения по сигналам FC0-2 и одновременно с AS' устанавливает входной сигнал VPA'. После этого ЦП осуществляет переход на программу обслуживания, соответствующую уровню IPL прерывания. Для перехода используются векторы (т. е. 32-разрядные адреса программ обслуживания), расположенные по абсолютным адресам $68, $74 или $7C. Если число прерывающих устройств не превышает трех, автовекторизация весьма удобна. Собственно говоря, устройств может быть и больше, но вам придется опрашивать регистры состояния всех «подозрительных» устройств (т. е. устройств, подключенных к обслуживаемому уровню прерываний), чтобы найти виновника. И лишь в случае, когда у вам много потенциальных источников прерываний (маловероятная ситуация в небольшом устройстве на базе МП 68008), и к тому же требуется обеспечить минимальные временные задержки, целесообразно обратиться к схеме прерываний с подтверждением.
Полностью векторизируемые прерывания реализуются следующим образом. Прежде всего оставьте сигнал VPA' на входе ЦП в сброшенном состоянии (высокий уровень). Организуйте схему таким образом, чтобы каждое устройство, работающее в режиме прерываний, выставляло бы свой вектор на линии данных в ответ на цикл чтения ЦП, выполняемый при установленных в высокое состояние сигналах FC0-2 и при уровне IPL (считываемом с линией А1-3), совпадающем с уровнем запроса устройства. При этом схема должна обеспечить выдачу вектора только одним прерывающим устройством, даже если несколько устройств одновременно выставили запросы на прерывание. Этого можно добиться, используя сигнал приоритета прерывания INPT, проходящий последовательно через все устройства, образующие, таким образом, приоритетную цепочку, как это было описано в разд. 10.11; тем самым гарантируется, что подтверждение прерывания выполняется только устройством (соответствующего уровня IPL), которое электрически расположено ближе других к ЦП, даже если запросы на прерывание поступают от нескольких устройств одного уровня IPL.
Другой, более элегантный метод показан на рис. 11.8.
Рис. 11.8. Полновекторизованное прерывание.
Здесь нет необходимости использовать неуклюжую цепочечную структуру, которая заменяется линиями запроса от каждого устройства. Состояния этих линий фиксируются в начале каждого цикла магистрали (фронтом сигнала AS) и поступают в дешифратор приоритета (который генерирует двоичный адрес возбужденного входа с максимальным номером, см. разд. 8.14). Кроме этого, дешифратор генерирует выходной сигнал (GS'), если возбуждается любой из входов; этот сигнал используется для инициации прерывания ЦП. Для простоты мы поместили прерывания от всех устройств на один уровень IPL. ЦП отзывается на прерывание, сохраняя в стеке адрес возврата, после чего инициирует цикл подтверждения (рис. 11.6). В течение цикла подтверждения наша схема устанавливает вектор (образованный в схеме приоритетного отбора), а также сигнал DTACK'. После этого ЦП выполняет векторный переход на соответствующий обработчик.
Рассмотренная схема проста в реализации, и для семейства МП 68000 она работает быстрее, чем схема автовекторизации. Далее, относительно просто достигается увеличение числа прерывающих устройств степенями 8 при использовании дополнительных микросхем `574 и `148. От каждого периферийного устройства требуется выделенная линия (не одна линия шины); хотя при этом нарушается симметрия шины данных, такой способ предпочтительнее приоритетной цепочки, которая совершенно перестает работать, если забыть надеть перемычки на неиспользуемые разъемы. Фактически в новых компьютерных магистралях (например, магистраль NuBus машины Macintosh II) все чаще используются линии прерываний, разведенные по разъемам.