Из газеты Echo #06, Брест, 07.2000 ------------------------------------------ Контроллер прямого доступа к памяти ------------------------------------------ Контроллер прямого доступа к памяти (ПДП, 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 и т. п.).