¿Cómo imita las puertas lógicas un PC que no es FPGA (es decir, una PC con CPU, RAM o disco duro)?

5

Sé que un FPGA utiliza tablas de consulta (LUT) para sintetizar puertas lógicas. Una LUT es un bloque de RAM que se indexa mediante una serie de entradas. La salida es el valor almacenado en esa dirección de memoria. La magia es que la LUT puede programarse para mostrar lo que desee para una entrada en particular. Por lo tanto, una LUT se puede programar con la tabla de verdad de cualquier puerta lógica para imitarla. Así es como un FPGA sintetiza las puertas lógicas que especifica en su código HDL.

Estaba pensando el otro día, ¿cómo una computadora normal imita las puertas lógicas? Por lo que sé (que no está lejos), si escribo un programa en C ++, primero debe compilarse en código de máquina para que la CPU pueda leerlo. Luego, cuando presiono "ejecutar", el código de la máquina va a la memoria para esperar el procesamiento de la CPU. No tengo muy claro qué sucede a continuación, pero en algún momento la CPU debe ejecutar las operaciones lógicas que contiene mi programa, ¿verdad? A diferencia de un FGPA, la CPU no puede sintetizar los recursos que necesita. Entonces, ¿cómo ejecuta el programa?

Mis conjeturas:

  1. La CPU tiene una serie de compuertas lógicas pre-construidas. Cuando se encuentra con un La instrucción AND en el código C ++ se está ejecutando, usa uno de sus AND puertas Si ve una declaración OR, usa una de sus puertas OR; si se ve una declaración IF, usa una de sus puertas IF; etc.

  2. O, la lógica se implementa en la memoria de alguna manera similar a una LUT. Esto tiene más sentido para mí, ya que no se basa en un limitado Número de recursos de la puerta. Si mi programa requiere toneladas de lógica OR     por ejemplo, la CPU no se embotellará por la falta de puertas OR.

Entonces, ¿qué tan lejos estoy?

Edit: Gracias por las respuestas a todos, aprendí bastante sobre las CPU y las ALU. Además, el "IF gate" en mi primera suposición es un error tipográfico, que debería ser "OR gate" (aunque es solo un ejemplo, cualquier compuerta lógica funcionaría). Lo siento por esa confusión.

    
pregunta user3716057

6 respuestas

15

En realidad, su primera suposición no es tan lejana como algunos afirman.

Una CPU se construye alrededor de algo llamado "Unidad de lógica aritmética" (ALU) y una implementación simplista de eso es tener las puertas lógicas que implementan todas las operaciones básicas conectadas a las entradas en paralelo. Por lo tanto, todos los cálculos elementales posibles se realizan en paralelo, con la salida de la que realmente se desea seleccionar por un multiplexor.

En una CPU extremadamente simple (modelo de tablero de tiza), algunos bits del código de operación de la instrucción que se está ejecutando actualmente están conectados a ese multiplexor para decirle qué función lógica debe utilizar. (Los otros resultados, no deseados, simplemente se desperdician)

La tecnología real utilizada para implementar los cálculos en la ALU varía: podría ser puertas lógicas "reales", o podría ser LUT si la CPU se implementa dentro de un FPGA basado en LUT (una muy buena manera de entender lo esencial La computación de programas almacenados consiste en diseñar un procesador simple y construirlo en un simulador lógico y, quizás, en un FPGA).

    
respondido por el Chris Stratton
7

Muy lejos.

Una CPU está formada por puertas reales (no LUT programables). Las operaciones clave en los datos se realizan en un bloque de lógica a menudo conocido como ALU (unidad de lógica aritmética). Dentro de este bloque hay un conjunto de puertas que pueden, por ejemplo, Y dos operandos juntos, bit por bit. Hay otro conjunto de puertas que pueden sumarlas, y así sucesivamente.

Cuando ejecuta instrucciones en la CPU, las instrucciones se decodifican una a la vez y la lógica asociada con esa instrucción se activa dentro de la ALU.

La diferencia es una compensación entre el tiempo y el área. Si tiene una gran cantidad de AND que hacer, puede hacerlos en un FPGA utilizando muchas LUT en paralelo y hacerlas en un corto período de tiempo. Si los hace en una CPU, se harán uno a la vez (secuencialmente) en el pequeño bloque de lógica que está diseñado para esa tarea.

    
respondido por el Dave Tweed
1

La CPU no solo tiene 'un número' de compuertas lógicas pre-compiladas. Un procesador moderno tiene entre aproximadamente 50 millones y varios miles de millones de transistores, que corresponden a muchos millones de puertas.

La CPU ya tiene todos los recursos necesarios para ejecutar su programa C ++. Los recursos proporcionados cumplen con el conjunto de instrucciones definido por esa plataforma de hardware, ya sea x86, ARM, MIPS, etc. Todas esas instrucciones incluyen instrucciones aritméticas, movimiento de memoria, condicionales, etc. Mire los conjuntos de instrucciones de su plataforma para obtener un entendimiento de cómo funciona realmente la CPU.

Cuando la CPU realiza una operación "AND", mientras que en algún lugar usa una compuerta AND, hay millones de compuertas AND en la CPU para todo tipo de operaciones.

Todas estas instrucciones están implementadas en el diseño de los transistores en el chip. Para ver cómo funcionan algunos de esos, busque cosas como flip-flops, Adders , u otra lógica digital.

    
respondido por el whatsisname
1

Otras respuestas han abordado las preguntas específicas a un nivel de detalle de tuercas y tornillos, pero creo que hay una oportunidad aquí para verlo desde un ángulo diferente. Los procesadores de hoy tienen muchos millones (miles de millones en CPU de escritorio de la generación actual) de transistores que implementan un número comparable de puertas. Si bien solo algunas de esas puertas se utilizan para implementar el cálculo de XOR , es difícil verlas en el enorme bosque de funciones de soporte.

Los veteranos de aquí (creo que puedo admitir que también gané esa etiqueta) vieron crecer el bosque, pero es fácil ver cómo un recién llegado al campo con solo una pequeña experiencia en diseño digital podría encontrarlo difícil. para ver los paralelismos entre una computación de hardware puro y una CPU moderna de múltiples núcleos con muchas capas de caché, predicción de bifurcación y ejecución segmentada.

Le recomendaría que encuentre las hojas de datos y el material de referencia del programador para varios (pero de uno en uno) de los antiguos microprocesadores de 8 bits de los años 70 y 80. En muchos casos, incluso puede encontrar implementaciones de código abierto de ellos en forma de emuladores de software puro, así como Verilog o VHDL para su uso en un FPGA.

Recomiendo comenzar aquí porque el 8080 (utilizado en el Altair 8800 de 1975 que lanzó el mercado de computadoras más interesante), < a href="http://en.wikipedia.org/wiki/Motorola_6800"> MC6800 (apareció en muchas computadoras pequeñas a finales de los 70), 6809 (RadioShack Coco y otros), 6502 (Apple 1, Apple ] [ y muchos más) y muchos más parecidos fueron diseñados e implementados en gran parte por ingenieros individuales o equipos muy pequeños y, por lo tanto, un equipo muy pequeño los tenía que entender completamente. También demuestran el número mínimo de funciones necesarias para una CPU exitosa comercialmente sin agregar memoria adicional, caché o periféricos.

Gran parte del patrimonio de 8080 se conserva en la página de la familia Z80 . El Z80 fue la extensión de Zilog de la plataforma Intel 8080, y los núcleos que la implementan todavía se pueden encontrar en la actualidad. Un Verilog 8080 está en OpenCores.org, junto con varias implementaciones más de 8080 y Z80. Existe una gran cantidad de documentación, sistemas operativos, ensambladores y compiladores para la arquitectura MCS80 y su extensa familia.

OpenCores tiene una gran cantidad de núcleos de código abierto. Hay cerca de 100 CPU puras, junto con otros 50 SOC que podrían ser la base para una mayor exploración.

    
respondido por el RBerteig
0

Como ha observado, el contenido de la tabla de búsqueda determina si una determinada LUT es una compuerta OR (0, 1, 1, 1) y una compuerta AND (0, 0, 0, 1), una XOR (0). , 1, 1, 0) etc.

La propia tabla de búsqueda se implementa utilizando puertas codificadas, es decir, el resultado es

(lut[0] AND NOT a AND NOT b) OR
(lut[1] AND     a AND NOT b) OR
(lut[2] AND NOT a AND     b) OR
(lut[3] AND     a AND     b)

Si observa esta línea por línea, puede ver que solo una de estas líneas puede tener una lógica, por lo que se selecciona una de las entradas de LUT. De la misma manera, también puede seleccionar entre múltiples fuentes de datos:

Si op1 es el número de registro de dos bits, el operando lhs se puede seleccionar como

(reg0 AND NOT op1[0] AND NOT op1[1]) OR
(reg1 AND     op1[0] AND NOT op1[1]) OR
(reg2 AND NOT op1[0] AND     op1[1]) OR
(reg3 AND     op1[0] AND     op1[1])

Luego, opcode puede seleccionar la operación a realizar:

((lhs AND rhs) AND NOT opcode[0] AND NOT opcode[1]) OR
((lhs OR rhs)  AND     opcode[0] AND NOT opcode[1]) OR
((lhs + rhs)   AND NOT opcode[0] AND     opcode[1]) OR
((lhs - rhs)   AND     opcode[0] AND     opcode[1])

Donde res = (lhs + rhs) se define como

res[0] = lhs[0] XOR rhs[0];
res[1] = lhs[1] XOR rhs[1] XOR (lhs[0] AND rhs[0]);
...

Al final, puedo reducir todo a puertas fijas, dejando solo las entradas variables. Un FPGA es una de esas variantes, donde las puertas están dispuestas para que realicen una búsqueda en la tabla.

En un sistema del mundo real, yo también optimizo, por ejemplo. combine señales equivalentes e intente minimizar el cambio de puertas cuando esa señal se elimine posteriormente por una puerta AND y no tendrá ningún efecto en el resultado:

is_and_op = NOT opcode[0] AND NOT opcode[1];

Varios elementos del circuito desean saber si actualmente estamos ejecutando una operación "y".

lhs_and = lhs AND is_and_op;
rhs_and = rhs AND is_and_op;

Si no, pasamos ceros a las puertas que realizan la operación.

res_and = lhs_and AND rhs_and;

Esta es la operación real, como antes.

res = res_and AND is_and_op OR ...;

La selección también puede usar nuestra taquigrafía.

    
respondido por el Simon Richter
0

La diferencia entre una CPU y FPGA es el paralelismo. Los FPGA son muy buenos para realizar una serie de tareas (lógicamente) más simples a la vez con un retraso mínimo. La lógica más compleja y las secuencias de operaciones están mejor atendidas por la ALU (unidad aritmética y lógica) de la CPU.

Si está interesado en una emulación de software común de diseño de compuerta, que normalmente se emplea (aunque ingenuamente) para simplificar las funciones lógicas booleanas, eche un vistazo a Quine-McCluskey algorithm . Utilicé esto para diseñar mi propio software de síntesis en Uni cuando no podía reenviar los costosos estudios y por diversión.

    
respondido por el John

Lea otras preguntas en las etiquetas