Implementaciones de Adder diferentes

7

Estoy armando una ALU, que quiero sintetizar en un FPGA. El sumador de acarreo anticipado es el que muchos optan por usar en lugar del sumador de ondulación de acarreo. Sin embargo, un pensamiento cruzó mi mente. Los sumadores de ondulación que he reunido antes simplemente tienen una serie de sumadores completos de un bit conectados entre sí. Mi idea es, ¿y si tuviera que diseñar un sumador completo de 4 bits? No estoy hablando de un sumador compuesto por cuatro sumadores completos de un bit. Estoy hablando de un solo componente con 9 entradas (x3, x2, x1, x0, y3, y2, y1, y0, cin). Soy consciente de que esto tendría 512 estados posibles (2 ^ (9 entradas)).

Lo que me pregunto es:

  1. Obviamente va a haber un gran número de puertas utilizadas, ¿vale la pena?
  2. Si estuviera implementando todos mis componentes usando compuertas NAND con un cierto retraso o todo esto, ¿qué tanto de una mejora en la velocidad se vería en un 32 bits usando a. sumador c.) sumadores completos de 1 bit
  3. ¿Hay alguna otra implementación de un sumador que no conozca?
  4. Aunque un sumador es una parte muy pequeña de una ALU, ¿a qué se dedica la mayoría de los diseñadores digitales? ¿O simplemente usan assign Sum = X+Y+cin;
pregunta sj755

4 respuestas

4

Para responder # 4, al menos en el código destinado a la síntesis, un sumador generalmente se codificará como assign sum = x + y . Esto deja la opción de cómo implementar el sumador hasta la herramienta de síntesis. Hay una compensación de costo / rendimiento. A falta de estrictos requisitos de rendimiento, la herramienta implementará un sumador de ondulación, ya que tiene el costo más bajo. Si hay requisitos de rendimiento más agresivos, la herramienta implementará una estructura más sofisticada, a un costo adicional. Otra posibilidad para la síntesis de FPGA es que el sumador se asignará a un componente DSP de propósito especial, si está disponible en el dispositivo de destino.

Cuando se desea el máximo rendimiento, la lógica se diseñará a mano en lugar de implementarse con una herramienta de síntesis. En este caso, además de un modelo de referencia de alto nivel con la forma sum = x + y , también habría una descripción de nivel inferior que describa las puertas o transistores individuales (esto podría hacerse en un HDL o en una herramienta esquemática) . Este escenario de "máximo rendimiento" seguramente sería una implementación ASIC en lugar de un FPGA.

Para (no realmente) responder # 3, por más de lo que siempre quiso saber sobre arquitecturas de sumadores, encontré esta tesis vinculada a un hilo en edaboard: enlace .

Para responder # 1 y # 2, la mejor manera de resolver cosas como esta es hacer algunos experimentos, cualquier otra cosa es especulación. Lo que obtendrá por el diseño del "sumador completo de 4 bits" depende de cómo lo codifique. Si lo codifica como un sumador, la herramienta probablemente hará lo que habría hecho de todos modos, aunque puede que no logre descubrir que los sumadores de 4 bits se unen para formar un sumador más grande. Si lo codifica como una función lógica, puede obtener algo más rápido que la implementación de ripple-carry, pero puede que no.

    
respondido por el Andy
6

Lo que don't quiere implementar es el sumador usted mismo fuera de las puertas. Use las funciones que VHDL / Verilog le dan para agregar números. Cualquier sumador que cree será más grande y más lento que cualquier cosa que pueda hacer el compilador VHDL / Verilog.

La razón de esto es simple: los FPGA tienen lógica dedicada para hacer sumadores con una cantidad mínima de lógica y lo más rápido posible. Esto incluye la lógica de la cadena de transporte especial y el enrutamiento. Si deja que el compilador los utilice, se beneficiará de las cosas que ya están en el FPGA. En otras palabras, solo haga Sum = X + Y + cin, donde X e Y son números de múltiples bits.

    
respondido por el user3624
3

Escriba un código que sea fácil de leer (para otros o para usted mismo dentro de dos semanas)

 a <= b+c;

Confía en el sintetizador hasta que se compruebe que

  • no está haciendo lo que quieres
  • y no está cumpliendo con su área, tiempo ni objetivos de poder.

Hacer cualquier otra cosa es una optimización prematura.

Entonces, y solo entonces, perder el tiempo tratando de mejorar las cosas. Pero al menos a estas alturas ya tiene un banco de pruebas de cobertura total de la opción "simple" (tiene eso antes de comenzar la optimización, ¿verdad? :)     

respondido por el Martin Thompson
0

Digo que tu herramienta probablemente implementará la adición mejor que tú.

En cuanto a los diversos tipos de sumadores, consulte Hennessy y Patterson, IIRC 3ª edición (¡cada edición es un libro completamente diferente!).

Una forma de acelerar la adición es usar lo que básicamente es un sumador de ondulación, pero NO agregarlo completamente en cada paso: cada adición produce una suma y un resultado de acarreo, y las ondulaciones de acarreo en una etapa en cada adición. Muy útil para implementar la multiplicación.

    
respondido por el Wouter van Ooijen

Lea otras preguntas en las etiquetas