Si tengo un unsigned(MAX downto 0)
que contiene el valor 2**MAX - 1
, ¿los estándares VHDL (87 | 93 | 200X) definen qué sucede cuando lo incremento en uno? (O, de manera similar, cuando disminuirlo por uno desde cero?)Se define el desbordamiento para VHDL numeric_std signed/unsigned
Respuesta
Respuesta corta:
no hay manipulación de desbordamiento, el acarreo de desbordamiento simplemente se pierde. Por lo tanto, el resultado es simplemente el resultado entero de su operación módulo 2^MÁX.
Respuesta larga:
numeric_std
El paquete es un paquete estándar, pero no es es el núcleo de los estándares VHDL (87,93,200X). para la referencia: numeric_std.vhd
El operador +
al final llama a la función ADD_UNSIGNED (L, R : unsigned; C : std_logic)
(con C = '0'
). Tenga en cuenta que cualquier entero/operando natural se convierte primero en unsigned
.
definición de la función es:
function ADD_UNSIGNED (L, R : unsigned; C : std_logic) return unsigned is
constant L_left : integer := L'length-1;
alias XL : unsigned(L_left downto 0) is L;
alias XR : unsigned(L_left downto 0) is R;
variable RESULT : unsigned(L_left downto 0);
variable CBIT : std_logic := C;
begin
for i in 0 to L_left loop
RESULT(i) := CBIT xor XL(i) xor XR(i);
CBIT := (CBIT and XL(i)) or (CBIT and XR(i)) or (XL(i) and XR(i));
end loop;
return RESULT;
end ADD_UNSIGNED;
Como se puede ver un "desbordamiento" se produce si CBIT='1'
(bit de acarreo) para i = L_left
. El bit de resultado RESULT(i)
se calcula normalmente y el último valor de bot de transporte se ignora.
que he tenido el problema con el deseo de un unsigned
a desbordarse/flujo inferior como en C o en Verilog y esto es lo que ocurrió con (result
y delta
son unsigned
):
result <= unsigned(std_logic_vector(resize(('1' & result) - delta, result'length))); -- proper underflow
result <= unsigned(std_logic_vector(resize(('0' & result) + delta, result'length))); -- proper overflow
Por desbordamiento '0' & result
hace un unsigned
que es 1 bit más grande para poder acomodar correctamente el valor de la suma. El MSB luego se elimina mediante el comando resize
que produce el valor de desbordamiento correcto. Lo mismo para underflow.
Para un valor de MAX igual a 7, sumando 1 a 2 ** 7 - 1 (127) dará como resultado el valor 2 ** 7 (128).
El valor máximo sin signo se determina por la longitud de un unsigned tipo de matriz:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity foo is
end entity;
architecture faa of foo is
constant MAX: natural := 7;
signal somename: unsigned (MAX downto 0) := (others => '1');
begin
UNLABELED:
process
begin
report "somename'length = " & integer'image(somename'length);
report "somename maximum value = " &integer'image(to_integer(somename));
wait;
end process;
end architecture;
El agregado (others => '1')
representa un '1' en cada elemento de somename
que es un tipo de matriz sin firmar y representa el máximo binario valor posible.
Esto da:
foo.vhdl: 15: 9: @ 0 ms: (nota informe): somename'length = 8
foo.vhdl: 16: 9: @ 0 ms: (informe nota): somename valor máximo = 255
la longitud es de 8 y el representable numérico rango de valores por el tipo de matriz sin signo es de 0 a 2 ** 8 - 1 (255), el valor máximo posible es mayor que 2 ** 7 (128) y no hay desbordamiento.
Esto se notó en una pregunta más reciente VHDL modulo 2^32 addition. En el contexto de su respuesta aceptada, asume que se refiere a la longitud en lugar del valor más a la izquierda.
La disminución de la caja cero da como resultado un valor de 2 ** 8 - 1 (255) (MAX = 7). Un underflow o un overflow dependiendo de su religión matemática.
Sombrero de punta a Jonathan Drolet para señalar esto en la nueva pregunta vinculada.
- 1. Herramienta para encontrar el código VHDL comentado
- 2. ¿Crear un backend VHDL para LLVM?
- 3. Representación de hardware para matrices en VHDL
- 4. Programa para dibujar diagramas de bloques VHDL?
- 5. Permitir el desbordamiento en el eje y mientras se oculta el desbordamiento en el eje x
- 6. ¿Cómo se define ColorStateList para TextView?
- 7. ¿Para qué propiedad interna se define ECMAScript?
- 8. VHDL STD_LOGIC_VECTOR Valores comodín
- 9. Programando VHDL en Linux?
- 10. Professional VHDL IDE?
- 11. ¿Cómo se define el evento Textchanged para editar texto?
- 12. ¿Cómo se define la escalabilidad para el código paralelo?
- 13. ¿Cómo se define threadsafe?
- 14. ¿Cómo se define (?) Internamente?
- 15. donde se define Enum.values ()?
- 16. ¿Cómo se usa #define?
- 17. abstractmethod no se define
- 18. Bits de concatenación en VHDL
- 19. VHDL/Verilog related programming forums?
- 20. ¿Cómo se define correctamente PRINT_NOTIFY_INFO_DATA?
- 21. $ excepción se define en "locales"
- 22. Cuadrado de un número que se define usando #define
- 23. Anticipar el desbordamiento factorial
- 24. Rieles: ¿Dónde se define "params"?
- 25. Ideas para un decodificador flexible/genérico en VHDL
- 26. ¿Puede recomendar un sitio web para los códigos fuente vhdl?
- 27. ¿Cómo se define la igualdad para instancias de categoría?
- 28. ¿Cómo se define un tipo para una función en Scala?
- 29. C# posible para verificar si se define una var?
- 30. #define LOG_MSG (...) para la depuración
Exactamente el tipo de referencia que quería, gracias :) (Por favor, ignore mi comentario anterior sobre el bit de acarreo, ¡leí mal la función!) – detly
@detly: de nada – wap26
Esta respuesta también es errónea asumiendo el rol de un longitud de MAX + 1. Es un problema con el uso del nombre MAX. Para somename declarado como unsigned con una indicación de subtipo (rango de índice) de 31 hasta 0 y una longitud de 32 (somename'length), el valor máximo con un índice de 0 es 2 ** 32 -1. – user1155120