1
EL CHIP DMA 8237.
EL ACCESO DIRECTO A MEMORIA.
El acceso directo a memoria es una tcnica de diseo del hardware que permite a los
perifricos conectados a un sistema realizar transferencias sobre la memoria sin la intervencin
del procesador. De esta manera, las lentas operaciones de entrada y salida de bloques de datos,
se pueden realizar en la sombra mientras la CPU se dedica a otras tareas ms tiles. Como la
memoria del ordenador slo puede ser accedida a un tiempo por una fuente, en el momento en
que el DMA realiza las transferencias el microprocesador se desconecta de los buses, cedindole
el control. El funcionamiento del controlador de DMA se basa en unos registros que indican la
direccin de memoria a ser accedida y cuntas posiciones de memoria quedan an por transferir.
La transferencia de datos entre los perifricos y la memoria por DMA no suele efectuarse de
golpe, sino ms bien poco a poco, robndole algunos ciclos a la CPU. Los controladores de
DMA suelen disponer de varias lneas de peticin de DMA, pudiendo atender las necesidades
de varios perifricos que soliciten una transferencia, quienes deben haber sido diseados
expresamente para soportar el DMA.
12.5.2 - DESCRIPCIN DEL INTEGRADO 8237.
El 8237 es un controlador de DMA de 4 canales programables en 3 modos diferentes, con
posibilidad de ser conectado en cascada con otros de su misma especie. Adems de las
funciones tradicionales, el 8237 soporta tambin transferencias memoria-memoria, incluyendo
la posibilidad de rellenar un rea de la memoria con cierto dato. La arquitectura es de 16 bits,
tanto para direcciones como datos, por lo que est especialmente diseado para sistemas
basados en el Z80 y 8085; aunque puede operar tambin
con procesadores ms avanzados, como la serie 80x86,
pero sin alcanzar a aprovechar todas sus posibilidades.
CLK: Seal de reloj bsica.
-CS: Lnea de habilitacin del chip.
RESET:
Esta seal provoca la limpieza de los registros
de comando, estado, solicitud y los temporales;
borra el bandern last/first y el contador de
registro de modo; el registro de mscara se
asigna para ignorar las solicitudes. El 8237
queda en Ciclo Inactivo.
READY:
Seal que puede ser empleada para extender
los pulsos de lectura y escritura en memoria del
8237 para trabajar con memorias lentas.
HLDA:
Hold Acknowledge, lnea por la que la CPU
indica que ha liberado los buses.
DREQ0..3:
DMA Request; son 4 lneas asncronas de
peticin de DMA. En el modo de prioridad fija,
DREQ0 tiene la mxima y DREQ3 la mnima.
Los perifricos solicitan el servicio de DMA en
estas lneas y esperan a bajarlas hasta el
correspondiente DACK. La polaridad de
DREQ es programable. Las lneas no usadas
deben ser enmascaradas.
DB0..DB7:
BUS de datos bidireccional y triestado.
Durante los ciclos de DMA, los 8 bits ms
significativos de la direccin son colocados en
2
el bus de datos con objeto de ser almacenados
en un latch exterior controlado por ADSTB. En
las operaciones memoria-memoria, el bus de
datos recibe y enva los bytes a transferir.
-IOR:
I/O Read. Lnea bidireccional de 3 estados. En
el ciclo inactivo es una entrada empleada por la
CPU para leer los registros de control; en el
ciclo activo acta como lnea de salida para
que el 8237 controle la lectura de datos de los
perifricos.
-IOW:
I/O Write. Lnea bidireccional de 3 estados. En el ciclo inactivo es una entrada
empleada por la CPU para escribir los registros del 8237; en el ciclo activo acta
como lnea de salida para que el 8237 controle la escritura de datos en los
perifricos.
-EOP:
End Of Process. Lnea bidireccional que informa de la finalizacin del servicio
DMA. El 8237 permite que un ente exterior fuerce el final de un servicio bajando
esta lnea. El propio 8237 genera un pulso en ella cuando se alcanza un TC
(Terminal Count, fin de cuenta) en algn canal, salvo en el modo memoria-memoria
del canal 0 (en ese caso, la seal se produce al alcanzarse el TC del canal 1). Esta
patilla est conectada en el interior del chip a un transistor en colector abierto, por
lo que requiere una resistencia externa. Cuando llega una seal -EOP, el 8237
finaliza el servicio aunque en el modo de autoinicializacin los registros base
volvern a ser escritos en los registros en curso del canal implicado. El canal resulta
enmascarado salvo en el caso del modo de autoinicializacin.A0..A3:Lneas
bidireccionales triestado de direcciones. En el ciclo inactivo son entradas empleadas
para direccionar los registros internos a leer o escribir. En el ciclo activo, son
salidas y proveen los 4 bits menos significativos de la direccin.
A4..A7:
Lneas triestado de salida de direcciones. Proveen los 4 bits altos de la direccin
durante el ciclo activo.
HRQ:
Hold Request. Lnea de salida para solicitar los buses a la CPU, en el caso en que
haya que realizar una transferencia. En los sistemas en que el 8237 controla
totalmente el bus, esta patilla puede ir directamente conectada a HLDA.
DACK0..3:
DMA Acknowledge. Avisa a los perifricos de que ha sido atendida su peticin. El
nivel de operacin de esta lnea es programable. RESET las baja.
AEN:
Address Enable. Habilita el latch de 8 bits que guarda la parte alta de la direccin.
Sirve tambin para inhibir el acceso al bus por parte de otras fuentes.
ADSTB:
Address Strobe. Lnea que controla el almacenamiento de la parte alta de la
direccin, cuando est en el bus de datos, en el latch externo.
-MEMR:
Memory Read. Salida triestado empleada para acceder a la memoria durante la
lectura o las transferencias memoria-memoria.
-MEMW:
Memory Write. Salida triestado empleada para acceder a la memoria durante la
escritura o las transferencias memoria-memoria.
DESCRIPCIN FUNCIONAL
Los modos de operacin del 8237 estn diseados para soportar transferencias de una sola
palabra de datos y flujos de datos discontinuos entre la memoria y los perifricos. El controlador
de DMA es realmente un circuito secuencial generador de seales de control y direcciones que
permite la transferencia directa de los datos sin necesidad de registros temporales intermedios,
lo que incrementa drsticamente la tasa de transferencia de datos y libera la CPU para otras
tareas. Las operaciones memoria-memoria precisan de un registro temporal intermedio, por lo
3
que son al menos dos veces ms lentas que las de E/S, aunque en algunos casos an ms veloces
que la propia CPU (no es el caso de los ordenadores compatibles).
El 8237 consta internamente de varios bloques: un bloque de control de tiempos que genera
las seales de tiempo internas y las seales de control externas; un bloque de gestin de
prioridades, que resuelve los conflictos de prioridad cuando varios canales de DMA son
accedidos a la vez; tambin posee un elevado nmero de registros para gestionar el
funcionamiento. Los registros internos del 8237 estn resumidos en la figura.
OPERACIN DEL DMA
En un sistema, los buses del 8237 estn conectados en paralelo al bus general del ordenador,
siendo necesario un latch externo para almacenar la parte alta de la direccin de memoria.
Cuando est inactivo, el 8237 est desconectado de los buses; cuando se produce una peticin
de DMA pasa a controlar los buses y a generar las seales necesarias para realizar las
transferencias. La operacin que realiza el 8237 es consecuencia de la programacin realizada
previamente en los registros de comando, modo, base de direccin y contador de palabras a
transferir.
Para comprender mejor el funcionamiento del 8237 es conveniente considerar los estados
generados por cada ciclo. El DMA opera bsicamente en dos ciclos: el activo y
el inactivo (o idle). Tras ser programado, el DMA permanece normalmente inactivo hasta que
se produce la solicitud de DMA en algn canal o va software. Cuando sta llega, si ese canal no
estaba enmascarado (es decir, inhibido) el 8237 solicita los buses a la CPU y se pasa al ciclo
activo. El ciclo activo se compone de varios estados internos, en funcin de la manera en que
sea programado el chip.
El 8237 puede asumir 7 diferentes estados, cada uno de ellos compuesto de un ciclo de reloj
completo. El estado 1 (S1) es el estado inactivo o idle. En l se entra cuando no hay pendiente
una peticin de DMA vlida, al final de la secuencia de transferencia, o tras un reset o
un Master Clear (que se ver ms adelante). En S1 el DMA est inactivo pero puede ser
programado por el microprocesador del sistema. El estado 0 (S0) es el primer estado de servicio
DMA. El 8237 ha solicitado los buses a la CPU a travs de la lnea HRQ pero la CPU an no ha
respondido a travs de HLDA. En esta situacin, el 8237 puede an todava ser programado.
Una vez que la CPU responde, la labor del 8237 puede comenzar: los estados S2, S3 y S4 se
suceden entonces para realizar el servicio. Si se necesitara ms tiempo, est prevista la
posibilidad de insertar estados de espera entre S2 S3 y S4 a travs de la patilla READY.
Tngase en cuenta que los datos son pasados directamente de la memoria hacia/desde los
perifricos, por lo tanto no cruzan a travs del DMA (las lneas -IOR y -MEMW, o -IOW y -
MEMR, son activadas al mismo tiempo). El caso de las operaciones memoria-memoria es
especial, ya que para cada palabra a mover hay que realizar la operacin de lectura (en unos
Tipo de registro Tamao N registros
Registro base de direccin
Registro base contador de palabras
Registro de direccin en curso
Registro contador de palabras en curso
Registro temporal de direccin
Registro temporal contador de palabras
Registro de estado
Registro de comandos
Registro temporal
Registro de modo
Registro de mscara
Registro de peticin
16 bits
16 bits
16 bits
16 bits
16 bits
16 bits
8 bits
8 bits
8 bits
6 bits
4 bits
4 bits
4
4
4
4
1
1
1
1
1
4
1
1
4
estados denominados S11, S12, S13 y S14) y despus la de escritura (estados S21, S22, S23,
S24).
Ciclo Inactivo.
Este es el estado en el que el 8237 espera pacientemente a que aparezca alguna solicitud de
DMA, comprobando las lneas DREQ en los flancos de bajada de las seales de reloj: en esto
consisten los estados S1. En esta situacin, el 8237 puede ser programado por la CPU. Para ello,
las lneas A0..A3 seleccionan el registro interno y -IOR e -IOW indican si se trata de leer o
escribir. Como algunos de los registros internos son de 16 bits, existe un flip-flop interno que
conmuta en cada operacin de escritura sobre ellos, para que el 8237 sepa si est recibiendo el
byte alto o el bajo (este flip-flop es puesto a cero en un Reset o en un comando Master Clear,
existiendo tambin comandos especiales para controlarlo). Algunas combinaciones de A0..A3 y
las lneas -IOR e -IOW, en lugar de acceder a los registros, constituyen comandos especiales.
Ciclo Activo.
Cuando el 8237 est en el ciclo inactivo y se produce una peticin por software o un canal no
enmascarado solicita servicio DMA, se pasa al estado activo y se opera en uno de estos 4
modos:
Single Transfer Mode (Modo de transferencia nica):
El dispositivo es programado para realizar una nica transferencia. El registro contador de
palabras es decrementado y el de direcciones se incrementa/decrementa segn ha sido
programado. Cuando el registro contador de palabras se desborda (pasa de 0 a 0FFFFh) se
activa el bit Terminal Count (fin de cuenta) en el registro de estado y la patilla -EOP genera un
pulso. Si el canal estaba programado para autoinicializarse esto es lo que realiza; en caso
contrario, se activa automticamente el bit de mscara para inhibir hasta nueva orden ese canal.
DREQ debe permanecer activo hasta que DACK responda. Sin embargo, si DREQ
permanece activo hasta que acaba el proceso de transferencia, la lnea HRQ baja y se ceden
momentneamente los buses al sistema. Despus, vuelve a subir, y cuando se recibe el HLDA
de la CPU se pueden realizar ms transferencias de este tipo. En la serie 8080 y 80x86, esto
asegura al menos un ciclo para la CPU entre las sucesivas transferencias del DMA.
Block Transfer Mode (Modo de transferencia de bloque).
Se diferencia del anterior en que en lugar de transferir una sola palabra se mueven todas las
necesarias hasta que el registro contador de palabras se desborda. Lgicamente, tambin se
acaba el proceso si alguien acta sobre la patilla -EOP. DREQ slo es preciso activarlo hasta
que DACK responde.
Demand Transfer Mode (Modo de transferencia por demanda).
Se diferencia del anterior en que la transferencia se realiza slo mientras DREQ permanece
activo. Esto significa que se pueden transferir datos hasta agotar las posibilidades del
dispositivo; cuando el dispositivo tenga ms datos listos puede volver a activar DREQ para
continuar donde lo dej. Esta modalidad permite dejar ciclos a la CPU cuando no es realmente
necesario que el DMA opere. Adems, en los perodos de inactividad, los valores de direccin
en curso y contador de palabras son almacenados en el Registro de direcciones en curso y en
el Registro contador de palabras en curso correspondientes al canal implicado; mientras
tanto, otros canales de mayor prioridad pueden ser atendidos por el 8237.
Modos de transferencia.
Cada uno de los 3 modos de transferencia puede realizar 3 tipos distintos de transferencias:
lectura, escritura y verificacin. La lectura pasa datos de la memoria al dispositivo E/S
(activando -IOW y -MEMR); la escritura mueve datos desde los dispositivos E/S a la memoria
5
(activando -IOR y -MEMW). Las transferencias de tipo verificacin son pseudotransferencias:
el funcionamiento es similar a la lectura o escritura pero sin tocar las lneas de control de la
memoria ni de los perifricos; durante el modo de verificacin se ignora la lnea READY; este
modo no es permitido en las operaciones memoria-memoria.
Autoinicializacin.
Cualquier canal puede ser programado para incluir esta caracterstica. En el momento de
programar el chip, los registros base de direccin y base contador de palabras son cargados a la
vez y con el mismo valor que los registros de direccin en curso y contador de palabras en
curso. Los registros base permanecen inalterados en todo momento, por lo que al final del
servicio sirven, en este modo de trabajo, para recargar de nuevo los registros en curso. Esto
sucede justo tras la seal -EOP, quedando el 8237 listo para repetir de nuevo la misma
transferencia (cuando se solicite a travs de la lnea DREQ o por software). En esta modalidad,
los bits de mscara estn a 0.
Memoria-Memoria.
En este tipo de transferencia se emplean siempre los canales 0 y 1. La transferencia comienza
activando la lnea DREQ del canal 0, bien por hardware o por software. El 8237 solicita
entonces un servicio de DMA ordinario, con el que lee el byte de la memoria a travs de 4
estados y empleando el Block Transfer Mode visto con anterioridad. El registro de direccin en
curso del canal 0, que indica la direccinorigen en la memoria, es incrementado/decrementado
(segn haya sido programado) y el dato es almacenado en el registro temporal del 8237. En
otros 4 estados ms, el dato es pasado del 8237 de nuevo a la memoria, usando la direccin del
registro de direccin en curso del canal 1, que indica la direccin destino en memoria, el cual es
tambin incrementado/decrementado segn proceda. Adems, se decrementa el registro
contador de palabras en curso del canal 1: si al decrementar se desborda (pasa de 0 a 0FFFFh) se
activa el bit TC del registro de estado (Terminal Count, fin de cuenta) y se genera un pulso -
EOP, finalizando el proceso. En el caso de que el valor del registro contador de palabras del
canal 0 pase de 0 a 0FFFFh, sin embargo, no se acta sobre TC ni sobre EOP (no finaliza el
proceso) aunque este canal se autoinicializa si as estaba programado.
Si se desea una autoinicializacin total en este tipo de transferencias, los registros contadores
de palabras del canal 0 y 1 han de ser programados con el mismo valor inicial; de lo contrario,
slo uno de los dos canales se autoinicializar (el que primero desborde su registro contador de
palabras).
El canal 0 puede ser tambin programado para retener siempre la misma direccin durante
todas las transferencias, lo que permite copiar un mismo byte en todo un bloque de la memoria.
El 8237 puede responder a seales -EOP externas durante este tipo de transferencias, pero
slo cede el control de los buses despus de completar la transferencia de la palabra que tenga
entre manos. Los circuitos para comparar datos en bsquedas de bloques pueden emplear -EOP
para terminar la operacin tras encontrar lo que buscan. Las operaciones memoria-memoria se
pueden detectar por hardware como una combinacin de AEN activo sin que al mismo tiempo
se produzcan salidas DACK.
Prioridad.
El 8237 tiene dos maneras de codificar la prioridad, seleccionables por software. La primera
es la prioridad fija, basada en el nmero del canal (0-mxima, 3-mnima). Una vez que un canal
es atendido, los dems esperan hasta que acabe. La segunda modalidad es la prioridad rotatoria:
el ltimo canal servido pasa a tener la menor prioridad y el que le sigue la mxima. La rotacin
de prioridades se produce cada vez que se devuelven los buses a la CPU. Esta ltima modalidad
de prioridad asegura que un canal sea atendido al menos despus de haber atendido los otros 3,
6
evitando que un solo canal monopolice el uso del DMA. Con independencia del tipo de
prioridad programada, sta es evaluada cada vez que el 8237 recibe un HLDA.
Compresin de tiempo.
De cara a mejorar el rendimiento en los sistemas ms potentes, el 8237 puede ser
programado para comprimir el tiempo de transferencia a dos ciclos de reloj. En cualquier caso,
esta posibilidad no est disponible en las transferencias memoria-memoria.
Generacin de direcciones.
Para reducir el nmero de pines, el 8237 tiene multiplexada la parte alta del bus de
direcciones. En el estado S1, los 8 bits ms significativos de la direccin son depositados en un
latch externo a travs del bus de datos. La lnea AEN indica a la circuitera externa que debe
habilitar el latch como parte alta del bus de direcciones cuando llega el momento (la parte baja
la suministra directamente el 8237). En el Block Transfer Mode y en el Demand Transfer Mode,
que implican mltiples transferencias, el 8237 es suficientemente inteligente como para generar
estados S1 slo cuando hay acarreo en la parte baja del bus de direcciones (1 de cada 256 veces)
evitando acceder al latch externo cuando no es necesario modificarlo y ahorrando tiempo.
PROGRAMACIN DEL 8237
El 8237 puede ser programado cuando HLDA est inactivo, siendo responsabilidad del
programador que esto sea as (es decir, programarlo antes de que comience a operar). En
cualquier caso, puede existir el riesgo de que mientras se programa un canal, se produzca una
peticin de DMA en el mismo antes de acabar la programacin, y probablemente en un punto
crtico (cuando, por ejemplo, se acababa de enviar la mitad de un valor de 16 bits). Para evitar
este riesgo, antes de comenzar a programar un canal puede ser necesario enmascararlo,
desinhibindolo despus.
Registros internos del 8237.
Current Address Register (Registro de direccin en curso).
Cada canal tiene un registro de direccin en curso que almacena la direccin de memoria
empleada durante las transferencias del DMA. Su contenido es incrementado/decrementado
despus de cada transferencia. Este registro es inicializado por la CPU enviando dos bytes
consecutivos; en modo autoinicializacin, su contenido inicial se restaura cuando sta se
produce.
Current Word Register (Registro contador de palabras en curso).
Cada canal tiene un registro contador de palabras en curso, que determina el nmero de bytes
a transferir en la operacin menos uno (para un valor inicial 100, por ejemplo, se transmiten 101
bytes). Tras cada transferencia se decrementa: cuando pasa de 0 a 0FFFFh se genera el TC
(Terminal Count) y el proceso finaliza. Este registro es inicializado por la CPU enviando dos
bytes consecutivos; en modo autoinicializacin, su contenido inicial se restaura cuando sta se
produce; de lo contrario contina con un valor 0FFFFh.
Base Address & Base Word Count Registers (Registros base de direccin y base contador
de palabras).
Cada canal tiene tambin un registro base de direccin y otra base contador de palabras.
Estos registros almacenan el valor inicial de los registros de direccin en curso y contador de
palabras en curso, ya que ambos tipos de registros se cargan simultneamente durante la
programacin. El valor almacenado en estos registros se emplea en la autoinicializacin, para
recargar los registros en curso.
Command Register (Registro de comandos).
7
Es un registro de 8 bits que controla el funcionamiento del 8237. Se borra tras un Reset o un
comando Master Clear:
Mode Register (Registro de modo).
Cada canal tiene un registro de modo asociado, de 6 bits. Cuando se escribe el registro de
modo, se enva un byte al 8237 que selecciona (en los bits 0 y 1) el canal cuyo registro de modo
se desea escribir, y el resto de los bits cargan el registro de modo. Cuando se lee, dichos bits
estarn a 1 (para leer un registro de modo hay que utilizar antes el comando Clear Mode
Register Counter, como se ver en la seccin de comandos).
Request Register (Registro de peticin de DMA).
El 8237 puede responder a peticiones de DMA tanto por hardware (lnea DREQ) como por
software. En este registro posee un bit para cada canal de DMA. Las peticiones por software no
se pueden enmascarar, aunque estn sujetas a la lgica de evaluacin de prioridades. Cada bit de
este registro es activado o borrado selectivamente por software. Todo el registro es borrado ante
un Reset. Para modificar sus bits, se debe enviar el comando Write Request register. Si se lee el
registro, los bits 0 al 3 muestran el estado de las peticiones en los canales 0 al 3 (los dems bits
estn a 1). Las peticiones de DMA por software pueden serlo indistintamente en el
modo single o en el block. Para operaciones memoria-memoria, hay que hacer una peticin de
DMA por software en el canal 0.
8
Mask Register (Registro de mscara de DMA).
Cada canal tiene asociado un bit de mscara que puede ser activado para inhibir las
solicitudes de DMA a travs de la lnea DREQ. Este bit es automticamente activado cada vez
que se produce un -EOP (al final de la transferencia) a menos que el canal est en modo
autoinicializacin. Cada bit de mscara puede ser modificado por separado, o todos a la vez, con
el comando apropiado. Todo el registro es puesto a 1 a travs del comando Master Clear o
debido a un Reset, lo que inhibe las solicitudes de DMA por hardware hasta que se enva un
comando para limpiar el registro de mscara (o se borran los bits que se desee en el mismo).
Existen tres rdenes para actuar sobre el registro de mscara; la primera es a travs del
comando Clear Mask Register, que borra todos los bits de mscara; la segunda es por medio del
comando Write Single Mask Bit, modificando un solo bit; la tercera forma consiste en los
comandos Read y Write All Mask Bits, con los que se pueden consultar y alterar todos los bits
de mscara a la vez.
Status Register (Registro de estado).
Contiene informacin de estado lista para ser leda por la CPU. Los bits 0 al 3 indican si los
respectivos canales han alcanzado un TC (Terminal Count) o se les ha aplicado una seal -EOP
externa. Estos bits se borran ante un Reset, un comando Master Clear o, simplemente, al leer el
propio registro de estado. Los bits 4 al 7 indican qu canales estn solicitando servicio, con
independencia de que estn enmascarados o no. De esta manera, enmascarando todos los
canales y leyendo el registro de estado, por software se puede decidir qu canales conviene
desenmascarar, pudiendo el sistema operativo aplicar la gestin de prioridades que desee
llegado el caso. Estos bits (4 al 7) son actualizados cuando el reloj est en alto; un Reset o un
comando Master Clear los borran.
Temporary Register (Registro temporal).
Se emplea para contener los bytes que se transfieren en las operaciones memoria-memoria.
Tras completar el proceso de transferencia, la CPU puede averiguar la ltima palabra transferida
leyendo este registro, a no ser que el registro haya sido borrado por un Reset o un
comando Master Clear.