Como revisé algunos documentos sobre la biblioteca, ieee.std_logic_arith
parece que la longitud resultante A+B
será de 64 bits cuando ambos A
y B
son de 64 bits.
¿Quiero saber si ieee.std_logic_arith
tengo 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.
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.
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.
usuario8352
botánico
ferdepe
VSB
botánico
VSB
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.
VSB