Agregar con acarreo en VHDL + operador

Como revisé algunos documentos sobre la biblioteca, ieee.std_logic_arithparece que la longitud resultante A+Bserá de 64 bits cuando ambos Ay Bson de 64 bits.

¿Quiero saber si ieee.std_logic_arithtengo un operador de adición que genera acarreo (para que el operador genere una salida de 65 bits para agregar dos operandos de 64 bits)?

ieee.numeric_std proporcionará un resultado de la longitud del operando izquierdo. Puede concatenar un bit de signo inicial o un bit cero (sin signo) con el operando izquierdo para producir su resultado de 65 bits. Una mirada a través de la fuente de std_logic_arith de Synopsys muestra que su "+" hace lo mismo.
No utilice la biblioteca ieee.std_logic_arith. Está desfasado y da problemas a la hora de combinarlo con otros.
Le sugiero que use la biblioteca std_numeric en lugar de arith... Puede ver algunos detalles aquí: userweb.eng.gla.ac.uk/scott.roy/DCD3/05_Arithmetic.pdf
@Botnic Entonces, ¿sugiere usar std_numberic? Y además, ¿puede nombrar algunos de los problemas de std_logic_arith o proporcionar un enlace al respecto?
@Botnic Como se describe en el enlace, ya que voy a usar Synopsys para sintetizar mi código, aún así std_logic_arith sería una mejor opción. enlace dice:If you are using Synopsys, use std_logic_arith, and if you are not using Synopsys, use numeric_std (if it is supported). This is not completely portable, since the functions are still different (for example, TO_UNSIGNED vs. CONV_UNSIGNED), but it is a lot better than using different types in different environments.
@ user8352 publique su comentario como respuesta para que pueda aceptarlo. Sería preferible que proporcione una muestra para ayudar a otros.

Respuestas (3)

ieee.numeric_std proporcionará un resultado de la longitud del operando izquierdo. Puede concatenar un bit de signo inicial o un bit cero (sin signo) con el operando izquierdo para producir su resultado de 65 bits.

Una mirada a través de la fuente de std_logic_arith de Synopsys muestra que su "+" hace lo mismo.

Library ieee;
use ieee.std_logic_1164.all;
-- use ieee.numeric_std.all;
use ieee.std_logic_arith.all;

entity adder65bit is
    port (
        a,b:    in  unsigned(63 downto 0);
        carry:  out std_logic;
        sum:    out unsigned (63 downto 0)
    );
end entity;

    architecture foo of adder65bit is 
    signal temp:  unsigned(64 downto 0);
    begin
        temp <= '0' & a +  b;
        sum <= temp (63 downto 0);
        carry <= temp(64);
end architecture;

No especificó firmado o sin firmar, esto no está firmado, los operandos y los resultados pueden estar firmados o sin firmar en su lugar.

Este código analiza, elabora y simula. Funciona configurando el operando izquierdo para que tenga una longitud de 65 bits. Mencionó llevar, por lo que se muestra con uno en un método compatible con implementaciones anteriores de la herramienta VHDL.

Tenga en cuenta que los operadores "&" y "+" tienen la misma prioridad, se ejecutarán en el orden en que se encuentran de izquierda a derecha.

sumador65bit_tb.png

La longitud del resultado es la misma que la longitud del operando izquierdo. Entonces, debes considerar cuántos bits tendrá el resultado para declarar los sumandos. No se genera carry.

Le sugiero que deje explícitamente la extensión de bits de signo (firmada) o la extensión de bits cero izquierda (sin firmar) sus entradas en 1 bit. Esto asegurará que conserve el bit de acarreo, pero también dejará en claro al futuro lector de su código que está conservando específicamente el acarreo. Además, sugeriría poner comentarios que describan su intención de hacerlo.

Incluso si pudiera hacerlo implícitamente, aún le sugiero que lo haga explícitamente para que el usuario no tenga que recorrer su(s) archivo(s) para determinar si el tamaño del vector de salida es el mismo o 1 más grande que las entradas.