Chip DMA 8237

Chip DMA 8259
Información sobre la plantilla
Instalador del chip.jpg

Chip DMA 8259. El acceso directo a memoria es una técnica de diseño del hardware que permite a los periféricos conectados a un sistema realizar transferencias sobre la memoria sin la intervención del procesador.

Descripción del integrado 8237

Circuito Integrado

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. Además de las funciones tradicionales, el 8237 soporta también 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 diseñado para sistemas basados en el Z80 y 8085; aunque puede operar también con procesadores más avanzados, como la serie 80x86, pero sin alcanzar a aprovechar todas sus posibilidades.

  • CLK: Señal de reloj básica.
  • CS: Línea de habilitación del chip.
  • RESET: Esta señal provoca la limpieza de los registros de comando, estado, solicitud y los temporales; borra el banderín last/first y el contador de registro de modo; el registro de máscara se asigna para ignorar las solicitudes. El 8237 queda en Ciclo Inactivo.
  • READY: Señal que puede ser empleada para extender los pulsos de lectura y escritura en memoria del 8237 para trabajar con memorias lentas.
  • HLDA: Hold Acknowledge, línea por la que la CPU indica que ha liberado los buses.
  • DREQ0..3: DMA Request; son 4 líneas asíncronas de petición de DMA. En el modo de prioridad fija, DREQ0 tiene la máxima y DREQ3 la mínima. Los periféricos solicitan el servicio de DMA en estas líneas y esperan a bajarlas hasta el correspondiente DACK. La polaridad de DREQ es programable. Las líneas no usadas deben ser enmascaradas.
  • DB0..DB7: BUS de datos bidireccional y triestado. Durante los ciclos de DMA, los 8 bits más significativos de la dirección son colocados en 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 envía los bytes a transferir.
  • IOR: I/O Read. Línea 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 actúa como línea de salida para que el 8237 controle la lectura de datos de los periféricos.
  • IOW: I/O Write. Línea 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 actúa como línea de salida para que el 8237 controle la escritura de datos en los periféricos.
  • EOP: End Of Process. Línea bidireccional que informa de la finalización del servicio DMA. El 8237 permite que un ente exterior fuerce el final de un servicio bajando esta línea. El propio 8237 genera un pulso en ella cuando se alcanza un TC (Terminal Count, fin de cuenta) en algún canal, salvo en el modo memoria-memoria del canal 0 (en ese caso, la señal 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 señal -EOP, el 8237 finaliza el servicio aunque en el modo de autoinicialización los registros base volverán a ser escritos en los registros en curso del canal implicado. El canal resulta enmascarado salvo en el caso del modo de autoinicialización.A0..A3:Líneas 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 dirección.
  • A4..A7: Líneas triestado de salida de direcciones. Proveen los 4 bits altos de la dirección durante el ciclo activo.
  • HRQ: Hold Request. Línea 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 periféricos de que ha sido atendida su petición. El nivel de operación de esta línea es programable. RESET las baja.
  • AEN: Address Enable. Habilita el latch de 8 bits que guarda la parte alta de la dirección. Sirve también para inhibir el acceso al bus por parte de otras fuentes.
  • ADSTB: Address Strobe. Línea que controla el almacenamiento de la parte alta de la dirección, 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.

Descripción Funcional

Los modos de operación del 8237 están diseñados para soportar transferencias de una sola palabra de datos y flujos de datos discontinuos entre la memoria y los periféricos. El controlador de DMA es realmente un circuito secuencial generador de señales de control y direcciones que permite la transferencia directa de los datos sin necesidad de registros temporales intermedios, lo que incrementa drásticamente 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 que son al menos dos veces más lentas que las de E/S, aunque en algunos casos aún más 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 señales de tiempo internas y las señales de control externas; un bloque de gestión de prioridades, que resuelve los conflictos de prioridad cuando varios canales de DMA son accedidos a la vez; también posee un elevado número de registros para gestionar el funcionamiento. Los registros internos del 8237 están resumidos en la figura de la derecha.

Operación del DMA

En un sistema, los buses del 8237 están conectados en paralelo al bus general del ordenador, siendo necesario un latch externo para almacenar la parte alta de la dirección de memoria. Cuando está inactivo, el 8237 está desconectado de los buses; cuando se produce una petición de DMA pasa a controlar los buses y a generar las señales necesarias para realizar las transferencias. La operación que realiza el 8237 es consecuencia de la programación realizada previamente en los registros de comando, modo, base de dirección 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 básicamente 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 algún canal o vía 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 función 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 petición de DMA válida, al final de la secuencia de transferencia, o tras un reset o un Master Clear (que se verá más 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 través de la línea HRQ pero la CPU aún no ha respondido a través de HLDA. En esta situación, el 8237 puede aún todavía 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 más tiempo, está prevista la posibilidad de insertar estados de espera entre S2 ó S3 y S4 a través de la patilla READY. Téngase en cuenta que los datos son pasados directamente de la memoria hacia/desde los periféricos, por lo tanto no cruzan a través del DMA (las líneas -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 operación de lectura (en unos estados denominados S11, S12, S13 y S14) y después la de escritura (estados S21, S22, S23, S24).

Ciclo Inactivo

Es el estado en el que el 8237 espera pacientemente a que aparezca alguna solicitud de DMA, comprobando las líneas DREQ en los flancos de bajada de las señales de reloj: en esto consisten los estados S1. En esta situación, el 8237 puede ser programado por la CPU. Para ello, las líneas 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 operación 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 también comandos especiales para controlarlo). Algunas combinaciones de A0..A3 y las líneas -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 petición 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)
  • Block Transfer Mode (Modo de transferencia de bloque).
  • Demand Transfer Mode (Modo de transferencia por demanda).
  • Conexión en cascada de varios 8237.

Single Transfer Mode

El dispositivo es programado para realizar una única transferencia. El registro contador de palabras es decrementado y el de direcciones se incrementa/decrementa según 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 automáticamente el bit de máscara para inhibir hasta nueva orden ese canal.

Block Transfer Mode

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. Lógicamente, también se acaba el proceso si alguien actúa sobre la patilla -EOP. DREQ sólo es preciso activarlo hasta que DACK responde.

Demand Transfer Mode

Se diferencia del anterior en que la transferencia se realiza sólo mientras DREQ permanece activo. Esto significa que se pueden transferir datos hasta agotar las posibilidades del dispositivo; cuando el dispositivo tenga más 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. Además, en los períodos de inactividad, los valores de dirección 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.

Conexión en cascada de varios 8237.

Sistema DMA de tres niveles

Esta conexión es empleada para conectar más de un 8237 en el sistema. La línea HRQ de los 8237 hijo es conectada a la DREQ del 8237 padre; la HLDA lo es a la DACK. Esto permite que las peticiones en los diversos 8237 se propaguen de uno a otro a través de la escala de prioridades del 8237 del que cuelgan. La estructura de prioridades es por tanto preservada. Teniendo en cuenta que el canal del 8237 padre es empleado sólo para priorizar el 8237 adicional que cuelga (hijo), no puede emitir direcciones ni señales de control por sí mismo: esto podría causar conflictos con las salidas del canal activo en el 8237 hijo. Por tanto, el 8237 padre se limita en el canal del que cuelga el 8237 hijo a controlar DREQ, DACK y HRQ, dejando inhibidas las demás señales. El -EOP externo será ignorado por el 8237 padre, pero sí tendrá efecto en el 8237 hijo correspondiente.

Programación 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 petición de DMA en el mismo antes de acabar la programación, y probablemente en un punto crítico (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, desinhibiéndolo después.

Véase también

Fuentes

  • CD, Carrera de Informática. MINED. Materiales Bibliográficos para los ISP, Versión 4 y 5