Diga que quiero diseñar un sistema de n bits, por ejemplo. 256 bits. ¿Puedo generalizar una ALU de 4 bits que creo que conozco a 256 bits? Estos son mis diagramas.
Diga que quiero diseñar un sistema de n bits, por ejemplo. 256 bits. ¿Puedo generalizar una ALU de 4 bits que creo que conozco a 256 bits? Estos son mis diagramas.
Se pueden hacer algunos aspectos de un sistema para usar anchos de datos arbitrarios, aunque a menudo hay relaciones entre diferentes partes de un sistema. Por ejemplo, en la mayoría de los casos, el número de palabras por instrucción o instrucciones por palabra variaría con el ancho de los datos. Uno probablemente no querría intentar usar instrucciones de cuatro bits, incluso si usara una palabra de datos de cuatro bits (creo que el Intel 4004 utilizó principalmente instrucciones de 8 bits), ni tampoco querría usar instrucciones de 256 bits si uno utiliza una palabra de datos de 256 bits. Si las instrucciones se obtienen en un bus diferente al de los datos, es posible que estos problemas no se apliquen de manera significativa, al menos una vez que el bus de datos sea lo suficientemente ancho como para contener una dirección completa.
Como señaló Chris Stratton, la velocidad de propagación del transporte puede ser un problema, pero no tiene que ser tan severa como sugiere, ya que hay algunos trucos que pueden acelerar la propagación del transporte. Un truco importante es producir lo que se llaman señales "P" y "G". Una señal "P" para un bloque significa que la salida de acarreo del bloque se establecerá si se establece su entrada de acarreo. Una señal "G" significa que la salida de acarreo del bloque se establecerá si su entrada está configurada o no. Para un sumador de una entrada y dos entradas de una etapa, la señal "P" es el "OR" de las entradas de datos, mientras que la señal "G" es el "Y" de las entradas de datos. Se pueden combinar dos bloques sumadores H y L de cualquier tamaño en un bloque más grande al hacer que la señal "P" del bloque más grande sea (PH y PL), y la señal "G" del bloque más grande sea "GH" o ( PH y GL) ". Incluso un sumador de 256 bits podría generar sus señales P y G dentro de aproximadamente 16 retardos de puerta para que la entrada sea válida; si la transferencia al sumador es válida en ese punto, la demora del sumador se volverá válida dos demoras de puerta más adelante, y las señales P y G se pueden usar para calcular la carga en cada etapa individual dentro de las demoras de 16 puertas. Por lo tanto, incluso una adición de 256 bits se puede realizar en aproximadamente 32 retardos de puerta.
Si incluso eso sería demasiado lento, uno podría beneficiarse de un dispositivo llamado Adicionar para guardar datos. Básicamente, la idea de un sumador Carry Save es que toma tres números arbitrarios como entrada y genera dos números cuya suma será la misma que la de los tres originales. En realidad es muy simple: solo use un sumador completo en cada etapa de bit, use la salida de "datos" de cada sumador para formar un número, y la salida de "acarreo", desplazada a la izquierda un bit, para formar el otro. Mientras que un sumador convencional requiere algo más de tiempo para realizar el cálculo en números más grandes que en números más pequeños, un sumador de guardar guardar siempre realiza su cálculo en aproximadamente dos retrasos de compuerta, independientemente del tamaño del operando. La combinación de tres números en dos no es terriblemente útil por sí misma, pero al usar dos sumadores de acarreo y guardado, uno puede combinar cuatro números en dos. Si uno tuviera que duplicar el tamaño de sus registros, podría hacer que cada registro contenga dos números que, al sumarlos, arrojen el valor "correcto" del registro. Agregar dos registros implicaría agregar cuatro números para obtener dos, una operación que podría realizarse en cuatro tiempos de propagación de la puerta. Tenga en cuenta que este enfoque permitiría cálculos extremadamente rápidos cuando los registros se usaron para sumas o restas consecutivas. Si uno quisiera realizar otras operaciones (por ejemplo, utilizar los registros para la suscripción de matrices, o realizar operaciones de enmascaramiento booleano en ellos), primero habría que resolver los valores numéricos reales de los registros.
En realidad no.
Para algunos propósitos, puede configurar una matriz de unidades de cómputo de 4 bits para actuar sobre una palabra de 256 bits, pero muchas operaciones tienen interdependencia entre los bits, por ejemplo, el acarreo adicional y la resta. Dentro de una etapa, la generación de acarreo anticipada especial se utiliza para asegurar que los bits más significativos obtengan su entrada de acarreo a tiempo para producir su salida al mismo tiempo que los bits menos significativos.
Pero no podrá obtener eso entre etapas, especialmente no entre una serie de 64 etapas. En términos simples, cada etapa demorará el período de acarreo por un período de reloj, por lo que el cálculo de su etapa de orden más alto podría comenzar solo 63 relojes después del cómputo del orden más bajo, cuando la entrada de acarreo necesaria esté finalmente disponible.
Es posible construir un sistema que compense esto, utilizando registros para retrasar las entradas de orden superior mediante los ciclos de reloj necesarios hasta que las entradas de acarreo estén disponibles, y otros registros para retrasar las salidas de orden inferior hasta el orden superior correspondiente Las salidas están disponibles. Esto se denomina canalización: puede tener un sistema que requiere 64 relojes para producir una respuesta (latencia). Pero puede tener una respuesta a un problema distinto en progreso en cada etapa de la tubería, por lo que se produce una respuesta en cada ciclo de reloj (rendimiento).
Esto se suele hacer con una longitud más razonable en los procesadores de propósito general, pero hay un gran precio que pagar. ¿Qué sucede si una instrucción posterior se basa en el resultado de un cálculo que es lo suficientemente reciente como para que se siga filtrando a través de la tubería cuando el cálculo dependiente ingresa a la tubería? Los procesadores reales tienen "rutas de desvío" adicionales para permitir retroalimentar los resultados anteriores más rápido de lo que los sacaría de la parte inferior de la tubería y volver a la parte superior. Esto ayuda a evitar paradas en las tuberías, pero solo hasta cierto punto.
También hay otro problema: ¿qué sucede con una instrucción de rama condicional? ¿Sigues llenando la tubería con los cálculos potencialmente necesarios suponiendo que se toma la sucursal? Suponiendo que no se toma? ¿Tiene una especie de procesador de doble núcleo que intenta ambas posibilidades? Si prueba ambos, ¿qué pasa si golpea una segunda rama, va a probar ambas posibilidades para eso también?
En resumen, está preguntando qué es para la mayoría de los propósitos un ejemplo irrazonablemente extremo de una técnica que realmente se usa a escalas más razonables, sujeto a algunos costos bastante graves.
Y hay una gran clase de excepción donde las tuberías de este tipo no serían inconcebibles. Se trata de motores de computación que hacen lo mismo con una gran cantidad de datos de una manera altamente repetible: chips DSP, algunos tipos de construcciones en FPGA y ASIC, y posiblemente también GPU. Si el flujo del programa es un bucle simple, necesita operar con una gran cantidad de datos, y es correcto que los resultados se retrasen con muchos relojes, entonces los procesos bastante largos pueden ser un enfoque bastante razonable.
Lea otras preguntas en las etiquetas flipflop alu multiplexer adder