──────────────────────────────────────────
Контроллер прямого доступа к памяти
──────────────────────────────────────────
Контроллер прямого доступа к памяти
(ПДП, DMA - Direct Memory Access) обеспе-
чивает высокоскоростной обмен данными меж-
ду устройствами ввода-вывода и ОЗУ без ис-
пользования центрального процессора, что
позволяет освободить процессор для выпол-
нения вычислений параллельно с обменом и
независимо от него. Наиболее часто возмож-
ности ПДП используются при работе с диско-
выми накопителями, однако реализовано ис-
пользование ПДП адаптерами накопителей на
магнитной ленте и рядом других устройств.
Ощутимые преимущества дает использование
ПДП в процессе обмена с устройствами, при-
нимающими или передающими данные достаточ-
но большими порциями с высокой скоростью.
В PC-подобных компьютерах функции конт-
роллера ПДП выполняет микросхема 8237А
фирмы INTEL (советский аналог КР1810ВТ37)
или ее аналоги 8237А-4 и 8237А-5, работаю-
щие с тактовой частотой 4 и 5 Мгц соот-
ветственно (стандартная микросхема 8237А
работает на частоте 3 Мгц). Контроллер
имеет 4 независимых канала, каждый из ко-
торых может обслуживать одно периферийное
устройство.
1. Принципы работы контроллера ПДП
В работе ПДП различаются 2 главных цик-
ла: цикл ожидания (Idle cycle) и активный
цикл (Active cycle). Каждый цикл подразде-
ляется на ряд состояний, занимающих по
времени один период тактовой частоты
(тик). Из цикла ожидания контроллер может
быть переведен в состояние программирова-
ния (Program Condition) путем подачи на
вход RESET сигнала высокого уровня, дли-
тельностью не менее 300 нc и следующей за
ним подачи сигнала низкого уровня (уровня
0) на вывод CS (Chip Select). В состоянии
программирования контроллер будет находит-
ся до тех пор, пока на выводе CS сохранит-
ся сигнал низкого уровня. В процессе прог-
раммирования контроллеру задаются:
- начальный адрес памяти для обмена;
- уменьшенное на единицу число переда-
ваемых байтов;
- направление обмена,
а также устанавливаются требуемые режи-
мы работы (разрешить или запретить цикли-
ческое изменение приоритетов, автоинициа-
лизацию, задать направление изменения ад-
реса при обмене и т. д.).
Загрузка 16-разрядных регистров конт-
роллера осуществляется через 8-разрядные
порты ввода-вывода. Перед загрузкой перво-
го (младшего) байта должен быть сброшен
(очищен) триггер-защелка (триггер первый/-
последний, First/Last flip-flop), который
изменяет свое состояние после вывода в
порт первого байта и таким образом дает
возможность следующей командой вывода в
тот же порт загрузить старший байт соот-
ветствующего регистра.
Запрограммированный канал может быть
демаскирован (бит маски канала устанавли-
вается при этом в 0), после чего он может
принимать сигналы "Запрос на ПДП", генери-
руемые тем внешним устройством, которое
обслуживается через этот канал. Сигнал
"запрос на ПДП" может быть также иницииро-
ван установкой в 1 бита запроса даного
канала в регистре запросов контроллера.
После появления сигнала запроса контроллер
входит в активный цикл, в котором выпол-
няется обмен данными. Обмен может осу-
ществляться в одном из четырех режимов:
1) Режим одиночной передачи (Signle
Transfer Mode). После каждого цикла пере-
дачи контроллер освобождает шину процессо-
ру, но сразу же начинает проверку сигналов
запроса и, как только обнаруживает актив-
ный сигнал запроса, инициирует следующий
цикл передачи.
2) Режим блочной передачи (Block
Transfer Mode). В этом режиме наличие сиг-
нала запроса требуется только до момента
выдачи контроллером сигнала "Подтверждение
запроса на ПДП" (DACK), после чего шина не
освобождается вплоть до завершения переда-
чи всего блока.
3) Режим передачи по требованию (Demand
Transfer Mode). Данный режим является
промежуточным между двумя первыми: переда-
ча идет непрерывно до тех пор, пока акти-
вен сигнал запроса, состояние которого
проверяется после каждого цикла передачи.
Как только устройство не может продолжить
передачу, сигнал запроса сбрасывается им
и контроллер приостанавливает работу.
Этот режим применяется для обмена с мед-
ленными устройствами, не позволяющими по
своим временным характеристикам работать с
ПДП в режиме блочной передачи.
4) Каскадный режим (Cascade Mode). Ре-
жим позволяет включить в подсистему ПДП
более одного контроллера в тех случаях,
когда недостаточно четырех каналов ПДП. В
этом режиме один из каналов ведущего конт-
роллера используется для каскадирования
с контроллером второго уровня. Для работы
в каскаде сигнал HRQ ("Запрос на захват")
ведомого контроллера подается на вход DREG
("Запрос на канал ПДП") ведущего, а сиг-
нал DACK ("Подтверждение запроса") ведуще-
го подается на вход HDLA ("Потверждение
захвата") ведомого.
Такая схема подключения аналогична
подключению ведущего (первого) контроллера
к микропроцессору, с которым он обмени-
вается сигналами HRQ и HDLA.
2. Типы передач
2.1. Передача память-память
(Memory-to-memory DMA).
Используется для передачи блока данных
из одного места памяти в другое. Исходный
адрес определяется в регистрах нулевого
канала, выходной - в регистрах первого ка-
нала. Число циклов обмена (число байт ми-
нус 1) задается в регистре числа циклов
канала 1. Передача происходит с использо-
ванием рабочего регистра контроллера в ка-
честве промежуточного звена для хранения
информации. При передачe память-память мо-
жет быть задан специальный режим фиксации
адреса (Address hold), при котором значе-
ние текущего адреса в регистре нулевого
канала не изменяется, при этом весь выход-
ной блок памяти заполняется одним и тем же
элементом данных, находящимся по заданному
адресу.
2.2. Автоинициализация
(автозагрузка, Autoinitialization).
После завершения обычной передачи ис-
пользованный канал ПДП маскируется и дол-
жен быть перепрограммирован для дальнейшей
работы с ним. При автоинициализации маски-
ровка канала после окончания передачи не
происходит, а регистры текущего адреса и
счетчик циклов автоматически загружаются
из соответствующих регистров с начальными
значениями. Таким образом для продолжения
(повторения) обмена достаточно выставить
сигнал запроса на ПДП по данному каналу.
2.3. Режим фиксированных приоритетов.
В этом режиме канал 0 всегда имеет мак-
симальный приоритет, а канал 3 - минималь-
ный. Это означает, что любая передача по
каналу с более высоким приоритетом будет
выполняться раньше, чем по каналу с более
низким приоритетом.
2.4. Циклический сдвиг приоритетов.
Позволяет избежать "забивания" шины од-
ним каналом при одновременной передачe по
нескольким каналам. Каждому каналу, по ко-
торому прошла передача, автоматически
присваивается низший приоритет, после чего
право на передачу получает канал с наивыс-
шим приоритетом, для которого передача в
данный момент возможна. Таким образом, ес-
ли в начале работы распределение приорите-
тов было обычным (канал 0 - наивысший), и
пришли сигналы запроса на ПДП по 1-му и
2-му каналам, то сначала будет выполняться
передача по первому каналу, затем он по-
лучит низший приоритет (а канал 2, соот-
ветственно, высший, т. к. сдвиг приорите-
тов циклический) и передача выполнится по
2-му каналу, который затем получит низший
приоритет, а высший приоритет получит,
сответственно, канал 3, который и будет
обладать преимущественным правом на пере-
дачу.
2.5. Сжатие времени передачи
(Compressed transfer timing).
В случае, если временные характеристики
быстродействия обменивающихся устройств
совпадают, ПДП может сократить время вы-
полнения каждого такта передачи на 2 цикла
тактовой частоты за счет тактов ожидания,
входящих в каждый цикл передачи.
3. Описание внутренних регистров ПДП.
Контроллер имеет 344 бита внутренней
памяти, организованной в виде регистров.
Описание внутренних регистров ПДП приведе-
но в таблице.
┌───────────────────────────────────┬──────────────┬───────────┐
│ Наименование │ Разрядность │ Число │
│ регистра │ (бит) │ регистров │
├───────────────────────────────────┼──────────────┼───────────┤
│ Регистр начального адреса │ 16 │ 4 │
│ (Base Address Register) │ │ │
│ Регистр начального счетчика циклов│ 16 │ 4 │
│ (Base Word Count Register) │ │ │
│ Регистр текущего адреса │ 16 │ 4 │
│ (Current Address Register) │ │ │
│ Регистр текущего счетчика циклов │ 16 │ 4 │
│ (Current Word Count Register) │ │ │
│ Рабочий регистр адреса │ 16 │ 1 │
│ (Temporary Address Register) │ │ │
│ Рабочий регистр счетчика циклов │ 16 │ 1 │
│ (Temporary Word Count Register) │ │ │
│ Регистр состояния │ 8 │ 1 │
│ (Status Register) │ │ │
│ Регистр команд │ 8 │ 1 │
│ (Command Register) │ │ │
│ Регистр режима (Mode Register) │ 6 │ 4 │
│ Рабочий регистр │ 8 │ 1 │
│ (Temporary Register) │ │ │
│ Регистр масок (Mask Register) │ 4 │ 1 │
│ Регистр запросов │ 4 │ 1 │
│ (Request Register) │ │ │
└───────────────────────────────────┴──────────────┴───────────┘
3.1. Регистр начального адреса
(Base Address Register).
В этом регистре задается стартовый ад-
рес ОЗУ, с которого начинается передача.
Регистр содержит 16 разрядов и определяет
адрес внутри заданного банка памяти разме-
ром 64К. Задание номера банков памяти осу-
ществляется через специальные регистры
банков (Bank Registers), поддерживаемые
внешней логикой. Каждый канал ПДП имеет
свой регистр начального адреса и регистр
банка. Такое деление памяти на банки не
позволяет осуществить обмен с блоком памя-
ти, находящимся на пересечении двух бан-
ков. Каждый банк состоит из четырех стра-
ниц и начинается со страницы с номером,
кратным 4 (0, 1, 2, 3; 8, 9, 10, 11 и т.
д.).
3.2. Регистр начального
счетчика циклов
(Base Word Count Register).
В этом регистре задается начальное чис-
ло циклов передачи для программируемого
канала. Фактическое число передаваемых во
время работы ПДП элементов данных на еди-
ницу превышает заданное число циклов, т.
е. если Вы задаете 100 циклов передачи, а
размер элемента будет равен 1 байту, то за
сеанс обмена будет передан 101 байт инфор-
мации.
3.3. Регистр текущего адреса
(Current Address Register).
Начальное значение заносится в этот ре-
гистр одновременно с регистром начального
адреса. В дальнейшем в ходе передачи зна-
чение текущего адреса автоматически увели-
чивается или уменьшается (конкретное нап-
равление изменения задается при программи-
ровании в регистре режима). Если разрешена
автоинициализация, то после окончания пе-
редачи в регистр автоматически устанавли-
вается значение из регистра начального ад-
реса.
3.4. Регистр текущего счетчика циклов
(Current Word Count Register).
Регистр содержит текущее значение счет-
чика циклов (число оставшихся циклов пере-
дачи). Отображаемое в нем число циклов
всегда на единицу меньше числа еще не пе-
реданных элементов данных, так как измене-
ние значения в этом регистре производится
в конце цикла передачи, уже после фактиче-
ской передачи элемента данных, а конец пе-
редачи фиксируется в момент переполнения
счетчика (изменение его значения с 0 на
0FFFFh).
3.5. Регистр режима
(Mode Register).
Данный регистр задает режимы работы
своего канала контроллера.
7 6 5 4 3 2 1 0
╔═╤═╤═╤═╤═╤═╤═╤═╗
║x│x│ │ │ │ │ │ ║
╚═╧═╧╤╧╤╧╤╧╤╧╤╧╤╝ Раскладка битов:
│ │ │ │ │ │ ────────────────
│ │ │ │ └─┴ 0-1: Режим работы:
│ │ │ │ 00=запись(в память)
│ │ │ │ 10=чтение(из памяти)
│ │ │ │ 11=недопустимая комбинация
│ │ │ └──── 2: Автоинициализация:
│ │ │ 0=запрещена
│ │ │ 1=разрешена
│ │ └────── 3: Изменение текущего адреса при обмене:
│ │ 0=увеличение
│ │ 1=уменьшение
└─┴──────── 4-5: Тип передачи:
00=режим передачи по требованию
01=режим одиночной передачи
10=режим блочной передачи
11=каскадный режим
Каждый из четырех каналов ПДП имеет
свой набор регистров, описанных выше. Кро-
ме того, имеется следующий набор регист-
ров, общих для всех каналов.
3.7. Регистр команд
(Command Register).
Этот 8-битный регистр управляет работой
контроллера. Он программируется, когда
контроллер находится в состоянии програм-
мирования и очищается командами сброса
"Reset" и "Master Clear". Назначение битов
регистра команд приведено на рисунке.
7 6 5 4 3 2 1 0
╔═╤═╤═╤═╤═╤═╤═╤═╗
║ │ │ │ │ │ │ │ ║
╚╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╝ Раскладка битов:
│ │ │ │ │ │ │ │ ────────────────
│ │ │ │ │ │ │ └ 0:0=запретить передачу память-память
│ │ │ │ │ │ │ 1=разрешить
│ │ │ │ │ │ └── 1:0=запретить фиксацию адреса в канале 0
│ │ │ │ │ │ 1=разрешить
│ │ │ │ │ └──── 2:0=разблокировать контроллер
│ │ │ │ │ 1=заблокировать
│ │ │ │ └────── 3:0=нормальная временная диаграмма
│ │ │ │ 1=сжатие времени передачи,
│ │ │ │ если бит 0 установлен, то игнорируется
│ │ │ └──────── 4:0=режим фиксированных приоритетов
│ │ │ 1=реим циклического сдвига приоритетов
│ │ └────────── 5:1=режим расширенной записи
│ │ 0=задержки при записи,
│ │ если бит 3 установлен, то игнорируется
│ └──────────── 6:0=активен высокий уровень сигнала запроса
│ 1=низкий DREQ
└────────────── 7:0=активен высокий уровень сигнала
подтверждения запроса на ПДП(DACK)
1=низкий
3.8. Регистр состояния
(Status Register).
Регистр отражает текущее состояние зап-
росов и передач по всем четырем каналам.
Биты 0 - 3 устанавливаются в единицу после
завершения передачи по каналам 0-3 (бит 0
- канал 0, бит 1 - канал 1 и т. д.), если
не задан режим автоинициализации. Эти биты
очищаются после команды сброса контроллера
и после каждой операции считывания состоя-
ния из регистра состояния. Биты 4-7 указы-
вают по какому из каналов 0-3 активен в
текущий момент сигнал запроса на ПДП.
3.9. Регистр масок
(Mask Register).
Каждый бит этого 4-битового регистра
маскирует/демаскирует свой канал ПДП, при
этом значение 1 маскирует канал, значение
0 демаскирует канал и разрешает прием сиг-
нала запроса по этому каналу.
3.10. Регистр запросов
(Request Register).
Сигнал запроса на ПДП (DREQ) может быть
издан как обслуживаемым устройством, так и
программно. Для программного издания сиг-
нала запроса по одному из 4-х каналов ПДП
необходимо установить соответствующий бит
в 4-разрядном регистре запросов. Запрос на
ПДП может быть отменен записью нулевого
значения в соответствующий бит регистра.
Бит запроса очищается автоматически при
окончании передачи по данному каналу. Все
биты запросов очищаются при сбросе конт-
роллера. Для того, чтобы воспринимать
программные запросы на ПДП, канал должен
находиться в режиме блочной передачи.
3.11. Рабочий регистр
(Temporary Register).
Этот 8-разрядный регистр используется
для хранения элемента данных, передаваемо-
го в режиме фиксированного адреса при пе-
редаче память-память или для временного
хранения передаваемого байта при всех ос-
тальных режимах передачи.
4. Программное управление
контроллером ПДП
Программное управление контроллером ПДП
осуществляется через порты ввода-вывода.
Доступ к каждому регистру контроллера мо-
жет быть осуществлен через свои порты вво-
да-вывода.
В таблице приведено описание портов
ввода-вывода, предназначенных для управле-
ния контроллером ПДП. В таблице указан
только старший байт адреса, младший байт
адреса для всех портов один и тот же. Он
равен #77.
┌────┬──────┬──────────────────────────────────────────────────┐
│Порт│Режим │ Назначение │
├────┼──────┼──────────────────────────────────────────────────┤
│#0C │запись│Запись начального адреса в регистр начального │
│ │ │адреса и регистр текущего адреса канала 0 │
│#2C │запись│то же для канала 1 │
│#4C │запись│то же для канала 2 │
│#6C │запись│то же для канала 3 │
├────┼──────┼──────────────────────────────────────────────────┤
│#0C │чтение│Чтение текущего адреса из регистра текущего │
│ │ │адреса канала 0 │
│#2C │чтение│тоже для канала 1 │
│#4C │чтение│тоже для канала 2 │
│#6C │чтение│тоже для канала 3 │
├────┼──────┼──────────────────────────────────────────────────┤
│#1C │запись│Запись в регистр начального счетчика циклов и в │
│ │ │регистр текущего счетчика циклов канала 0 │
│#3C │запись│то же для канала 1 │
│#5C │запись│то же для канала 2 │
│#7C │запись│то же для канала 3 │
├────┼──────┼──────────────────────────────────────────────────┤
│#1C │чтение│Чтение текущего значения из регистра текущего │
│ │ │счетчика циклов канала 0 │
│#3C │чтение│то же для канала 1 │
│#5C │чтение│то же для канала 2 │
│#7C │чтение│то же для канала 3 │
├────┼──────┼──────────────────────────────────────────────────┤
│#8C │запись│Запись регистра команд ПДП │
│#8C │чтение│Чтение регистра состояния ПДП │
│#9C │запись│Запись в регистр запросов ПДП │
│#AC │запись│Запись бита маски для одного из каналов ПДП │
│#BC │запись│Запись регистра режимов для одного из каналов ПДП │
│#CC │запись│Очистка (сброс) триггера-защелки(триггера первого/│
│ │ │последнего) │
│#DC │запись│Программный сброс контроллера │
│#EC │запись│Очистка битов масок всех 4-х каналов │
│#FC │запись│Запись регистра масок для всех 4-х каналов │
│#DC │ │ │
│или │чтение│Чтение рабочего регистра ПДП │
│#FC │ │ │
├────┼──────┼──────────────────────────────────────────────────┤
│#07 │запись│Задание номера банка для канала 0 │
│#17 │запись│то же для канала 1 │
│#27 │запись│то же для канала 2 │
│#37 │запись│то же для канала 3 │
└────┴──────┴──────────────────────────────────────────────────┘
Порты #0C-#7C предназначены для записи
исходных значений в регистры начального и
текущего адреса, начального и текущего
счетчика циклов для всех 4-х каналов. Так
как порты восьмиразрядные, а регистры, в
которые через них заносятся данные,
16-разрядные, то запись производится в два
приема. Перед первой командой вывода в
требуемый порт необходимо сбросить триг-
гер-защелку, для чего выполняется команда
вывода произвольного значения в порт #CC,
после чего в требуемый порт выводится
младший байт 16-разрядного значения и за-
тем старший байт следующей команды вывода
в тот же порт.
Вывод в порт #8C позволяет занести зна-
чение в регистр команд ПДП (Описание битов
регистра команд приведено в п. 3).
Чтение из порта #8C считывает регистр
состояния ПДП (Описание битов регистра
состояния приведено в п. 3).
Запись в порт #9C позволяет установить
или сбросить бит запроса в регистр запро-
сов для одного из каналов. Формат команды
следующий:
7 6 5 4 3 2 1 0
╔═╤═╤═╤═╤═╤═╤═╤═╗
║x│x│x│x│x│ │ │ ║ Раскладка битов
╚═╧═╧═╧═╧═╧╤╧╤╧╤╝ ───────────────
│ └─┴─ 0-1:выбор канала 00-0
│ 01-1
│ 10-2
│ 11-3
└───── 2: 1=установить бит запроса на ПДП
0=сбросить бит запроса на ПДП
Запись в порт #AC позволяет установить
или сбросить бит маски в регистре масок
для одного из каналов. Формат команды:
7 6 5 4 3 2 1 0
╔═╤═╤═╤═╤═╤═╤═╤═╗
║x│x│x│x│x│ │ │ ║ Раскладка битов
╚═╧═╧═╧═╧═╧╤╧╤╧╤╝ ───────────────
│ └─┴─ 0-1:выбор канала 00-0
│ 01-1
│ 10-2
│ 11-3
└───── 2: 1=установить бит маски
0=сбросить бит маски
Запись в порт #BC устанавливает значе-
ние в регистре режимов одного из 4-х кана-
лов ПДП. Биты 0 и 1 задают номер кана-
ла(00-0, 01-1, 10-2, 11-3). В биты 2-7 за-
носятся значения, передаваемые соответст-
венно в биты 0-6 регистра режимов. (Описа-
ние битов регистра режимов приведено в п.
3).
Запись в порт #DC задает программный
сброс контроллера (Master Clear). Вывод
любого байта в этот порт имеет один и тот-
же эффект, что и аппаратный сброс контрол-
лера. При программном сбросе очищаются ре-
гистры команд, состояния, запросов и рабо-
чий регистр. Также сбрасывается триггер-
защелка и устанавливаются все биты масок в
регистре масок. После программного сброса
контроллер переходит в цикл ожидания.
Вывод любого байта в порт #EC очищает
регистр масок-сбрасывает биты всех четырех
каналов ПДП и таким образом разрешает
прием запросов на ПДП по всем каналам.
Через порт #FC можно задать произволь-
ное значение регистра масок ПДП. Для этого
необходимо в битах 0-3 регистра A устано-
вить требуемое значение масок каналов 0-3
соответственно и вывести это значение в
порт.
Регистры банков ПДП предназначены для
задания номера банка памяти, с которой бу-
дет производиться обмен. Под номером банка
понимаются старшие биты номера страницы,
начиная со 2-го бита. Напомним, что архи-
тектура ПДП позволяет работать только с
банками памяти размером 64К, а логика,
обеспечивающая переключение банков устрое-
на так, что банки имеют жесткие границы,
описанные выше. Из-за этой особенности не-
возможно с помощью ПДП осуществить обмен
с блоками памяти, пересекающими границу
между двумя такими банками. Каждый канал
ПДП имеет свой регистр банка, поэтому дос-
туп канала к памяти независим ни от банков
других каналов, ни от портов страничной
памяти (#7FFD, #DFFD, #1FFD и т. п.).