# Periférico de entrada/salida

En informática, un periférico de entrada/salida o E/S (en inglés: input/output o I/O) es aquel tipo de dispositivo periférico de un computador capaz de interactuar con los elementos externos a ese sistema de forma bidireccional, es decir, que permite tanto que sea ingresada información desde un sistema externo, como emitir información a partir de ese sistema.

## Funciones

Un periférico de E/S es el que se utiliza para ingresar (E) datos a la computadora, y luego de ser procesados por la unidad central de procesamiento (CPU), genera la salida (S) de información. Su función es leer o grabar, permanente o virtualmente, todo aquello que se haga con la computadora, para que pueda ser utilizado por los usuarios u otros sistemas.
Un sistema de E/S debe poder, como mínimo, direccionar los diferentes periféricos con los que puede establecer comunicación, establecer un sistema de comunicación entre el procesador y los controladores, y sincronizar los dispositivos de manera que no se produzcan inconsistencias o errores. Además, debería ser capaz de convertir los datos entre diferentes formatos, controlar el estado de los periféricos, llevar la cuenta de las transmisiones y tener un sistema de detección de errores.

### Direccionamiento o selección de periférico

A la hora de comunicarse con un dispositivo, el procesador sitúa su dirección asociada en el bus de direcciones. De esta forma, selecciona el dispositivo con el que quiere iniciar una transferencia de datos. La forma de identificar cada periférico es el llamado direccionamiento.
Tiene las siguientes características:
* Es necesario prevenir que varios dispositivos puedan acceder simultáneamente al mismo bus, ya que se pueden producir cortocircuitos (en el caso de una arquitectura de bus compartido).
* Cada dirección no tiene por qué referirse a un solo puerto, pero es necesario que ésta se pueda identificar unívocamente y no produzca incoherencias o ambigüedades con el resto del sistema.
* Los controladores suelen tener varios puertos asociados.

#### Bus de direcciones

El bus de direcciones comunica el procesador con los periféricos, seleccionando aquel con el que se desea interaccionar. Este puede ser:
* Mapeado: El mapa de periféricos pertenece al mismo que el de memoria, es decir, el procesador no distingue entre accesos a memoria y accesos a los dispositivos de E/S, por tanto no hay instrucciones específicas de E/S que no sean las propias de acceso a memoria, sino que se utilizan LOAD, STORE o MOVE. La ventaja de usar una E/S mapeada es que hay menor complejidad a la hora de diseñar el procesador.
* Independiente: El mapa de periféricos es independiente (y valga la redundancia) al mapa de memoria ya que usa la plantilla IO/M# del procesador, por tanto existen instrucciones dedicadas a las transferencias con periféricos distintos a la memoria principal (nemotécnicos más comunes: IN, OUT, TESTI/O, CONTROLI/O). Las ventajas de usar E/S independiente es que, facilita la protección de E/S y los programas son más rápidos al tener una decodificación más sencilla y tener un tamaño menor las instrucciones de E/S. Al contrario que la E/S mapeada, el diseño del procesador es más complejo.

#### Técnicas de direccionamiento para controladores

En función del tipo de sistema E/S, podemos encontrar diferentes formas de direccionamiento:
* Direccionamiento por selección lineal: Consiste en asignar un bit del bus de direcciones a cada puerto. Si tenemos n "líneas" para direccionar periféricos podemos especificar, a lo sumo, n periféricos distintos. Este tipo de direccionamiento no se suele utilizar ya que tiene importantes restricciones tales como que solo un periférico puede estar activo a la vez.
* Direccionamiento por selección por decodificación: La dirección del periférico está codificada y se requiere un decodificador para activar el periférico deseado. Dentro de este tipo de direccionamiento se hallan dos posibilidades:
** Centralizado: Se emplea un decodificador para todos los puertos.
** Distribuido: Cada puerto "reconoce" su propia dirección.

### Comunicación física entre el controlador y el procesador

Existen distintas formas de interconexión que se pueden dar entre controlador y procesador. Las más destacadas son las basadas en buffer tri-estado y en las MUX/DEMUX indicando sus ventajas/inconvenientes.
Se suele usar más la alternativa basada en buffer tri-estado pues permite un mejor aprovechamiento de los dispositivos de E/S y la mejora de los mismos al dedicar mayor área de estos en la mejora de prestaciones y no en el interconexionado.

#### Basados en buffer tri-estado

Se implementan usando un bus compartido y buffer tri-estado para cada puerto y evitar así el "volcado" de información por parte de dos o más periféricos en el bus. Las características principales de este tipo de interconexión son:
* Facilidad en la expansión por medio de tarjetas o circuitería específica
* Permite conectar en paralelo muchos periféricos

#### Basados en MUX/DEMUX

Se emplean MUX y DEMUX para seleccionar el periférico que podrá usar el bus compartido en un momento dado, impidiendo al resto de dispositivos acceder a este último. Las características principales de este tipo de interconexión son:
* Escasa posibilidad de expansión
* Mucha circuitería: Suelen dedicar gran parte del área del dispositivo en el cableado del mismo.

### Sincronización

La sincronización con el procesador o la memoria de los dispositivos de E/S consiste en la acomodación de velocidades de ambos, ya que los periféricos suelen ser más lentos. A fin de que no se imponga el ritmo del dispositivo más lento se establecen mecanismos para saber cuándo se deben enviar/recibir datos y es común que los controladores dispongan de buffers de almacenamiento temporal de palabras y permitan aceptar señales de control de conformidad que reflejan el estado del periférico en un momento dado (listo, petición, reconocimiento, ocupado, etc).

#### Tipos de temporización

La temporización de las operaciones de E/S puede ser de dos tipos:
* Síncrona: Aquella en la que los dispositivos que se conectan poseen velocidades similares, por lo que ninguno de ellos debe esperar al otro.
* Asíncrona: Aquella en los que los dispositivos tienen velocidades dispares, lo cual provoca que uno deba esperar al otro para que no se produzcan errores/inconsistencias en los datos.
Existe otra definición de los términos Sincrono/Asincrono que se puede encontrar en diferentes textos/escritos de diferentes autores dichos términos refiriéndose a las distintas definiciones:
* Síncronos: Se dice de los dispositivos que comparten una señal de reloj común.
* Asíncronos: Aquellos que no comparten la misma señal de reloj. Debido a que no tienen la misma señal de reloj, pueden acomodar una amplia variedad de dispositivos, y el bus puede alargarse sin preocuparse por los problemas de sincronización. Para coordinar la transmisión de datos entre emisor y receptor, utilizan un protocolo de presentación (handshaking protocol). Éste protocolo consta de una serie de pasos en los cuales emisor y receptor proceden al siguiente paso solamente cuando ambas partes están de acuerdo. Para implementar éste protocolo se requiere de un conjunto adicional de líneas de control, entre ellas:
* ReadReq o RD: Se utiliza para indicar una petición de lectura de memoria. La dirección se pone en la línea de datos al mismo tiempo.
* WriteReq o WR: Se utiliza para indicar una petición de escritura en memoria.
* Data: Se utiliza para indicar que la palabra de datos está preparada en las líneas de datos (datos estables).
* Ack: Se utiliza para conocer la señal de ReadReq o Data, es decir, esta señal de aceptación se necesita para que el controlador del periférico conteste a la petición de transferencia generada por el procesador.

##### Temporización síncrona

En la temporización síncrona, la aparición de un evento está determinada por el reloj. El bus incluye una línea de reloj que es común a todos los dispositivos, y se suelen sincronizar durante el flanco de subida. Casi todos los eventos duran un único ciclo de reloj.
Este tipo de temporización sólo funciona si el dispositivo de E/S es suficientemente rápido para responder a la espera que le brinda el procesador, en caso contrario se producirán errores en la escritura de los puertos y se leerán datos no válidos del bus, por lo que las operaciones de E/S no serían correctas. Otro tema importante es que, si no se incorporan rutinas para detectar hardware inexistente, el programa podría fallar por tratar de direccionar un dispositivo que o bien no existe o bien ha sido "desconectado" del equipo.
Las operaciones de lectura y escritura funcionan de la siguiente manera:
* Escritura: El procesador activa la señal WR#, que es la de escritura, y espera un tiempo, que es determinado por el procesador (no es una espera al otro dispositivo), y una vez transcurrido ese periodo de tiempo desactiva la señal de escritura, por lo que si el dispositivo de E/S no es suficientemente rápido la escritura no se realizará correctamente. Cabe destacar que en este tipo de temporización no se produce ninguna espera por parte del procesador ni por parte del periférico.
* Lectura: El procesador activa la señal RD# que es la de lectura y espera un tiempo determinado por el mismo (como ocurría en el caso de la Escritura) y acto seguido lee del bus de datos la información, sin comprobar si esta contiene los datos válidos suministrados por el periférico.

##### Temporización asíncrona o con "handshaking"

La traducción de "handshaking" es "apretón de manos" y viene a significar que el procesador y los periféricos intercambian señales de control que les permiten sincronizar sus acciones y "colaborar" conjuntamente en la transferencia de información. Generalmente se suele considerar que existe sólo una señal de sincronización llamada ACK (aunque puede haber tantas señales de sincronización como se necesiten y esto depende del hardware del dispositivo en cuestión).
Con este procedimiento mejoramos el rendimiento de las operaciones de E/S e impedimos que se produzcan los fallos en la escritura/lectura que podían suceder con la temporización síncrona para un dispositivo existente. Sin embargo al igual que en el caso sincrono se han de incorporar rutinas que determinen si se intenta acceder a un dispositivo inexistente o "desconectado" puesto que esto si provocaría errores (entraría en un bucle infinito esperando a ACK). La solución que generalmente se adopta es que el procesador da un tiempo límite de espera por encima del cual se genera una excepción y se aborta la operación E/S.
El funcionamiento de las operaciones de lectura y escritura es el siguiente:
* Escritura: El procesador activa la señal de escritura, WR# y espera hasta que el periférico activa su línea de sincronización ACK, cuando esto sucede el procesador deshabilita la señal de escritura y se produce la escritura (y valga la redundancia) de los datos en el puerto del periférico correspondiente. Finalmente el periférico desactiva ACK.
* Lectura: El procesador habilita la señal de lectura, RD# y espera hasta que el dispositivo le "indique" mediante ACK que los datos están listos para su lectura. Una vez que ACK esta activa el procesador lee los datos del bus de datos y desactiva la señal RD#. Finalmente el periférico reconoce la deshabilitación de RD# y este desactiva la señal de sincronización, ACK.

### Otras funciones importantes

Además de las funciones principales, existen otras tareas de las que un sistema de E/S debe hacerse cargo. Estas son las más importantes:
* Conversión de datos: Acomodación de las características físicas y lógicas de las señales de datos empleadas por el dispositivo de E/S y por el bus del sistema. Permite "compatibilizar" los datos del bus de datos y los datos que acepta el periférico en cuestión, es decir, realiza conversiones entre distintos formatos de datos, por ejemplo:
** Conversión de códigos (BCD, ASCII, UNICODE, ANSI, etc).
** Conversión serie/paralelo.
** Conversión de niveles lógicos para representar 0 y 1 (necesario para compatibilizar distintas tecnologías lógicas como la CMOS y la TTL).
** Conversiones A/D y D/A.
* Control de periféricos: Permite conocer el estado en el que se encuentra el dispositivo y modificarlo, pudiendo además enviar otras señales de control para afectar su funcionalidad actual.
* Control de los "paquetes" transferidos: Se debe encargar de determinar qué cantidad de información se envía en cada operación de E/S (lo llamaremos "paquete") y contar la cantidad de paquetes que se llevan enviados para poder determinar cuándo se termina la transferencia de datos.
* Detección de errores: Pueden ser errores propios del funcionamiento del hardware del periférico o bien de los datos (pueden haber sido corrompidos intencionadamente o accidentalmente) y en caso de ser necesario "relanzar" la operación de E/S correspondiente.

## Tipos

Dispositivos o periféricos de comunicación entre computadoras, tales como módems y tarjetas de red, por lo general sirven para entrada y salida. También, los dispositivos de almacenamiento de datos, como los discos rígidos, la unidad de estado sólido, las memorias flash, las disqueteras, entre otros, se pueden considerar periféricos de entrada/salida.
Ejemplos:
* Multitáctil
* Casco virtual
* Impresora multifunción

### Almacenamiento de datos

En ocasiones, se consideran periféricos de E/S a los dispositivos de almacenamiento de datos, como por ejemplo, las lectograbadoras de discos ópticos, ‘lectoras’ de tarjetas de memoria, discos duros portátiles o externos, memorias USB o memorias flash, etcétera.

### Dispositivos de redes

También, los dispositivos de redes o de comunicación, suelen considerarse periféricos de E/S porque su función es la interacción o interconexión entre dos o más computadoras, o entre la computadora y otro periférico externo.
Ejemplos: módem, tarjeta de red, concentrador, conmutador (dispositivo de red), enrutador, comunicación inalámbrica, bluetooth.