Dominando tipos Signed y Unsigned en VHDL: Guía práctica
En VHDL, signed y unsigned son vectores de bits especializados que le permiten realizar aritmética en buses de datos. A diferencia de std_logic_vector, que es ideal para enrutar señales pero no para cálculos, estos tipos son interpretados como valores numéricos por el compilador.
Intentar sumar un std_logic_vector disparará el error de compilación: No feasible entries for infix operator "+", porque la herramienta no puede determinar cómo tratar el patrón de bits crudo como un número.
Parte de la serie Tutoriales Básicos de VHDL.
Para habilitar aritmética, declare un vector como signed o unsigned:
signal <name> : signed(<N-1> downto 0) := <initial_value>;
signal <name> : unsigned(<N-1> downto 0) := <initial_value>;
El rango puede usar to o downto, pero downto 0 es el más común. El valor inicial es opcional; si se omite, todos los bits default a 'U'.
¿Por qué preferir signed/unsigned sobre el tradicional integer? Los diseñadores digitales a menudo necesitan control preciso sobre ancho de bits. Estos tipos vectoriales hacen wrap en desbordamiento, mientras que integer lanzará un error en tiempo de ejecución si el valor excede sus límites. Además, los vectores pueden contener meta-valores como 'U' y 'X', que ayudan a revelar bugs de diseño temprano.
Demostración en video
En el video adjunto, exploramos cómo las señales signed y unsigned se comportan de manera similar y dónde divergen.
Código de ejemplo
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity T12_SignedUnsignedTb is
end entity;
architecture sim of T12_SignedUnsignedTb is
signal UnsCnt : unsigned(7 downto 0) := (others => '0');
signal SigCnt : signed(7 downto 0) := (others => '0');
signal Uns4 : unsigned(3 downto 0) := "1000";
signal Sig4 : signed(3 downto 0) := "1000";
signal Uns8 : unsigned(7 downto 0) := (others => '0');
signal Sig8 : signed(7 downto 0) := (others => '0');
begin
process is
begin
wait for 10 ns;
-- Contador con wrap
UnsCnt <= UnsCnt + 1;
SigCnt <= SigCnt + 1;
-- Sumando señales
Uns8 <= Uns8 + Uns4;
Sig8 <= Sig8 + Sig4;
end process;
end architecture;
Análisis de forma de onda
La forma de onda de ModelSim, zoom en eventos clave, muestra todos los valores en hexadecimal para claridad:

En el ejemplo del contador, tanto UnsCnt como SigCnt comienzan en 0, incrementan hasta FF (decimal 255), luego hacen wrap de vuelta a 0 —demostrando comportamiento de wrap idéntico.
Las señales de 4 bits Uns4 y Sig4 ambas contienen el valor binario 1000, que es decimal 8 para unsigned y –8 para signed (complemento a dos).
Al sumar estos números de 4 bits a los acumuladores de 8 bits, entra en juego la extensión de signo. Los números unsigned se rellenan con ceros, mientras que los signed se rellenan con el bit de signo. El resultado es que Uns8 aumenta en 8, mientras que Sig8 disminuye en 8.
Visualizando el proceso de extensión de signo se aclara la diferencia:

Conclusiones clave
- Tanto
signedcomounsignedson tipos vectoriales que soportan operaciones aritméticas. - El desbordamiento es silencioso; los valores hacen wrap alrededor según el ancho de bits.
- La extensión de signo puede producir resultados diferentes al sumar operandos de longitudes desiguales.
Proceda al siguiente tutorial para insights más profundos.
VHDL
- Microcontroladores PIC18: Características, Rendimiento y Cómo Usarlos
- Entendiendo Designadores de Referencia: Cómo Etiquetar Conexiones en Ensamblaje PCB
- Dominando tipos Signed vs Unsigned en VHDL: Perspectivas prácticas
- Aprovechando procedimientos en-proceso para diseños FSM más limpios en VHDL
- Uso de funciones impuras en VHDL: Mejorando legibilidad y mantenibilidad de FSM
- Dominando funciones VHDL: Guía práctica para diseño eficiente
- Uso de procedimientos en VHDL: Simplifique su diseño con código reutilizable
- Aprovechando constantes y generic maps en VHDL para diseño de módulos flexibles
- Dominando la instanciación con port map en VHDL: Guía práctica
- Dominando la sentencia Case-When en VHDL: Diseño eficiente de multiplexores
- Configuración gratis de simulador y editor VHDL: Guía para estudiantes