¿Qué es un bus?
En el ámbito de la informática y la electrónica, un bus se refiere a un conjunto de líneas o cables que se utilizan para transmitir datos, señales y energía entre diferentes componentes de un sistema informático o electrónico. Un canal de comunicación y permite la transferencia de información entre los diferentes dispositivos conectados a él.
El bus puede transmitir diferentes tipos de información, como direcciones de memoria, datos, señales de control y energía eléctrica para alimentar los dispositivos conectados a él. Estas señales pueden ser de tipo digital o analógico, y pueden tener multitud de especificaciones diferentes, como distintos anchos de banda, diferentes protocolos de comunicación, diferentes tecnologías o estándares, etc.
Tipos de bus
Sin entrar en otros detalles, vamos a ver cómo se pueden clasificar los buses, es decir, los tipos de bus que existen y qué son cada uno de estos tipos:
Según la generación
Primera generación
Los primeros buses que aparecieron en el mundo de la computación eran simplemente haces de cables que conectaban los diferentes dispositivos o periféricos. En esta época ni siquiera se denominaban bus, sino digit trunk. Además, estos buses eran lentos, y se necesitaba esperar a que un proceso de transferencia terminase y que el dispositivo origen y destino estuviesen listos para otra transferencia.
Además, la CPU podía solo ejecutar código para un periférico a la vez en esta época, por lo que los ingenieros de estos buses de primera generación hicieron que los periféricos pudieran interrumpir a la CPU para realizar transferencias. Por otro lado, algunos sistemas de alta gama introdujeron también un controlador de canal para manejar el sistema de E/S de una mejor forma, como los casos del IBM 709 de 1958, que se convertiría en una referencia para otros buses posteriores, como los de CDC.
Más tarde, con la implementación de sistemas con múltiples CPUs también tuvieron que compartir un bus de memoria común, y tuvieron que buscar soluciones para este tipo de sistemas. La complejidad estaba creciendo. También llegaría DEC (Digital Equipment Corp) para hacer que el sistema de E/S se implementara como direcciones de memoria y que compartieran este mismo bus. Esto se empleó en el Unibus del famoso PDP-11 en 1969.
Conforme las CPUs fueron siendo cada vez más rápidas y dejando atrás a otros dispositivos, el sistema de buses tuvo que cambiar en forma de jerarquía, y cambiar…
Segunda generación
La segunda generación de bus llegó con sistemas como NuBus, cuando abordaron los problemas presentes en la primera generación, separando el bus de CPU-RAM del sistema de E/S. Además, se empezaron a implementar nuevos protocolos para acelerar ciertas configuraciones, como puede ser el AGP para conectar CPU-GPU, y también el PCIe que lo sustituyó. Durante las décadas de 1980 y 1990 aparecieron también otros muchos buses para periféricos modernos, como los IDE, SCSI, etc.
Tercera generación
La tercera y actual generación de buses llegaría sobre 2001, con la llegada de buses como HyperTransport de AMD o InfiniBand para redes HPC. Nuevos buses para resolver nuevos problemas de los sistemas actuales. Además, también han surgido proyectos para estandarizar la conexión entre la CPU-disipositivos y la CPU-memoria como puede ser CXL (Compute Express Link).
Según la ubicación
Bus interno
Se denomina bus interno a aquel que forma parte fundamental de un ordenador, como puede ser el bus de memoria, el bus del sistema o FSB, el bus de datos, etc. Es decir, aquellos que interconectan la CPU y la memoria RAM y otros elementos de la placa base.
Bus externo
Un bus exterior o bus de expansión es aquel que se destina a interconectar o transmitir información con dispositivos externos, como pueden ser periféricos como la impresora, etc-
Según el uso
Bus dedicado
El término «bus dedicado» se utiliza para referirse a un tipo de sistema en el que cada elemento individual que forma parte de un sistema basado en microprocesador tiene asignada una línea o conjunto de líneas de comunicación exclusivas. Esta configuración permite la generación simultánea de múltiples ciclos de bus. No obstante, este sistema es más complejo en comparación con otros, ya que requiere un gran número de líneas. Por ejemplo, un sistema con una CPU de 8 bits podría necesitar hasta 160 líneas en su bus. El elevado número de líneas, como su nombre indica, se debe a que se dedican líneas específicas para direcciones de memoria, instrucciones de memoria, datos, control del sistema de E/S, datos de E/S, entre otros. Debido a esta razón, esta solución no es ideal para sistemas modulares contemporáneos. Los buses dedicados solo se utilizaron en casos particulares en los que el costo no era un problema y se requería un mayor rendimiento.
Bus compartido
También se encuentra el concepto opuesto conocido como «bus compartido». En este caso, se evitan los desafíos de complejidad asociados con el elevado número de líneas, ya que, como su nombre sugiere, el bus puede ser compartido por varios dispositivos. El bus compartido consta únicamente de líneas separadas para el control, los datos y las direcciones, y estas líneas pueden ser multiplexadas. Una gran ventaja de este tipo de bus es que unifica el espacio de memoria y programa, lo que permite que la CPU funcione de manera más sencilla sin tener que distinguir si una dirección se refiere a memoria de instrucciones o de datos. Un ejemplo de este tipo de bus es el bus del sistema o el FSB (Front Side Bus) que ha sido utilizado en muchos sistemas, así como las implementaciones más recientes de las que ya hemos mencionado. Sin embargo, a diferencia del caso anterior, este tipo de bus no permite realizar múltiples ciclos simultáneamente, lo que implica que se necesitarán más líneas de control para gestionar los tiempos de transferencia y controlar el turno de acceso para los diferentes dispositivos compartidos.
Según las direcciones
Unidireccional o simplex
Existe también el concepto de «bus simplex» o «bus unidireccional», que se refiere a un bus que solo permite la transmisión en una dirección o sentido. En este caso, se utiliza, por ejemplo, como bus de direcciones en un sistema de CPU simple, donde solo se envían direcciones hacia la memoria. También puede emplearse para algunas señales de control que deben viajar en un único sentido.
Bidireccional o half-duplex
Seguramente estés familiarizado con el término «half-duplex» o «semi-duplex» en relación a un bus. En este caso, se trata de un bus que permite la transmisión de datos en una dirección u otra, pero no en ambas al mismo tiempo. Por ejemplo, puede haber un bus entre la CPU y la memoria RAM que permita acceder a los datos, ya sea para leerlos o escribirlos, lo que requiere transferencias en ambas direcciones. Para que este sistema funcione, se necesitarán señales de control adicionales y una señal que indique el sentido de la transmisión, como un semáforo para controlar el tráfico o un sistema de arbitraje. Además, solo se puede realizar un ciclo de lectura o escritura a la vez. Una vez que se completa la transferencia, el bus queda libre para realizar otra. Una ventaja de este enfoque es que su implementación física es simple y su costo es bajo, aunque su rendimiento no es adecuado para sistemas de alto rendimiento.
Full-duplex
Existen otros buses más avanzados y con un mayor rendimiento en comparación a los mencionados anteriormente, y se les conoce como «full-duplex» o «duplex completo». Esto significa que pueden transmitir datos en ambos sentidos o direcciones de manera simultánea. Muchos sistemas basados en microprocesadores utilizan este tipo de buses para mejorar su rendimiento y evitar posibles cuellos de botella. Para lograr estas transmisiones simultáneas, se requiere el uso de múltiples vías separadas, cada una de las cuales transmitirá en una dirección a la vez.
Según la forma de compartirse el bus
Bus directo
El concepto de «bus directo» se refiere a un tipo de bus que permite la transmisión de un solo tipo de información, como el bus de datos, el bus de direcciones o el bus de control. Estos son ejemplos de buses directos, diseñados específicamente para un propósito particular. No pueden transferir otros tipos de información, lo que los hace muy simplificados y enfocados en su función específica.
Multiplexado
El caso opuesto al mencionado anteriormente es el de un «bus multiplexado». Este tipo de bus permite la transmisión de múltiples tipos de información o desde múltiples fuentes hacia múltiples destinos. En lugar de tener líneas separadas para cada tipo de dato, cuenta con líneas de control que indican el tipo de información transmitida. Por ejemplo, algunos sistemas basados en CPU utilizan temporalmente un bus multiplexado para enviar una dirección a la memoria a la que se desea acceder y luego esperar a que el mismo bus devuelva los datos almacenados en esa dirección. Existen diversas formas de realizar la multiplexación (DMA o Acceso Múltiple por División), como la multiplexación en frecuencia (FDMA), en tiempo (TDMA), en código (CDMA), entre otras.
Según la forma de transmitir la información
Paralelo
Un bus paralelo se caracteriza por permitir la transmisión simultánea de todos los bits. Esto se logra mediante la utilización de múltiples líneas de transmisión. Por ejemplo, si deseamos crear un bus paralelo para transmitir datos de 8 bits, necesitaríamos 8 líneas individuales, cada una responsable de transportar un bit. Algunos ejemplos de buses paralelos incluyen el puerto LPT utilizado en antiguas impresoras y el estándar IEEE 1284, entre otros.
Serie
El bus serie se caracteriza por transmitir la información de manera bit a bit, lo que implica que solo se necesita una línea de datos. En la actualidad, existen numerosos ejemplos de este tipo de buses, como el utilizado para los puertos USB (Universal Serial Bus), ISP, I2C, entre otros. Para lograr un ancho de banda alto en este caso, es necesario aumentar la frecuencia de reloj. Esto permite enviar una mayor cantidad de bits por segundo, aprovechando los múltiples ciclos de reloj que se generan. Por ejemplo, si consideramos una frecuencia de 1 Hz y queremos transmitir un dato de 8 bits, requeriremos 8 ciclos, uno para cada bit, lo que llevará 8 segundos. Si aumentamos la frecuencia a 2 Hz, tomará 4 segundos, y si alcanzamos una frecuencia de 1 MHz, solo llevará 1 milisegundo.
Según el reloj
Bus asíncrono
Un bus asíncrono se caracteriza por prescindir de cualquier tipo de temporización o reloj. Este enfoque puede resultar útil en buses donde las señales se emiten solo en momentos específicos o para controlar ciertos aspectos del sistema. Aunque pueda parecer lo contrario, los buses asíncronos pueden ser algo más complejos, ya que requieren de líneas adicionales para señales que determinen cuándo se está enviando un dato, cuándo se completa la transmisión y cuándo se puede enviar otro dato. Estas señales adicionales añaden un nivel de sofisticación al diseño y funcionamiento del bus.
Bus síncrono
La mayoría de los buses utilizados en la actualidad son síncronos, lo que significa que están controlados por una señal de reloj que establece el ritmo de las transferencias de datos. Al aprovechar el flanco ascendente o descendente de la señal de reloj, se pueden realizar las transferencias sin necesidad de líneas adicionales como ocurre en los buses asíncronos. Sin embargo, aunque los buses síncronos ofrecen varias ventajas, también pueden ser menos flexibles en comparación con los buses asíncronos.
Con o sin paridad
Sin paridad
En un bus sin paridad, no se realiza ninguna comprobación para verificar si el dato recibido en el destino es idéntico al dato enviado desde el origen. En otras palabras, no se verifica la integridad de la transferencia y no se detectan posibles errores. Aunque esto hace que los buses sin paridad sean más económicos y fáciles de implementar, también implica que son menos confiables en términos de la integridad de los datos transmitidos.
Con paridad
El bus que verifica la integridad del dato recibido en el destino puede utilizar diversos métodos, más allá del simple bit de paridad. Un enfoque común es emplear una línea adicional para indicar si el número binario del origen tiene una paridad par o impar. De esta manera, si la paridad en el destino no coincide, se sabe que ha ocurrido un error en uno o más bits que han cambiado de valor. En esos casos, se puede realizar una nueva transferencia para evitar la corrupción de los datos y prevenir errores mayores.
En la actualidad, existen numerosas técnicas para verificar la integridad de los datos transmitidos, que van más allá del simple bit de paridad. Se utilizan algoritmos más complejos que permiten detectar y corregir errores en las transferencias. Además, en algunos casos se implementa redundancia para mejorar aún más la fiabilidad del sistema.
Híbridos
Por supuesto, puede haber un bus que pertenezca a varias categorías a la vez. Por ejemplo, puede haber un bus paralelo que sea bidireccional, y que sea multiplexado a la vez. O tal vez un serial, directo, y que sea síncrono, etc.