Dominando Tipos Signed e Unsigned em VHDL: Guia Prático
Em VHDL, signed e unsigned são vetores de bits especializados que permitem realizar aritmética em barramentos de dados. Diferente de std_logic_vector, que é ideal para rotear sinais mas não para cálculos, esses tipos são interpretados como valores numéricos pelo compilador.
Tentar somar um std_logic_vector disparará o erro de compilação: No feasible entries for infix operator "+", porque a ferramenta não pode determinar como tratar o padrão de bits bruto como um número.
Parte da série Tutoriais Básicos de VHDL.
Para habilitar aritmética, declare um vetor como signed ou unsigned:
signal <name> : signed(<N-1> downto 0) := <initial_value>; signal <name> : unsigned(<N-1> downto 0) := <initial_value>; O intervalo pode usar to ou downto, mas downto 0 é o mais comum. O valor inicial é opcional; se omitido, todos os bits padrão para 'U'.
Por que preferir signed/unsigned sobre o tradicional integer? Designers digitais frequentemente precisam de controle preciso sobre largura de bits. Esses tipos de vetor fazem wrap em overflow, enquanto integer levantará erro de tempo de execução se o valor exceder seus limites. Além disso, vetores podem conter meta-valores como 'U' e 'X', que ajudam a revelar bugs de design cedo.
Demonstração em Vídeo
No vídeo acompanhante, exploramos como sinais signed e unsigned se comportam de forma similar e onde divergem.
Código de Exemplo
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 com wrap UnsCnt <= UnsCnt + 1; SigCnt <= SigCnt + 1; -- Somando sinais Uns8 <= Uns8 + Uns4; Sig8 <= Sig8 + Sig4; end process; end architecture; Análise da Forma de Onda
A forma de onda do ModelSim, com zoom nos eventos-chave, exibe todos os valores em hexadecimal para clareza:

No exemplo do contador, tanto UnsCnt quanto SigCnt começam em 0, incrementam até FF (decimal 255), então fazem wrap de volta para 0 — demonstrando comportamento de wrap idêntico.
Os sinais de 4 bits Uns4 e Sig4 ambos mantêm o valor binário 1000, que é decimal 8 para unsigned e -8 para signed (complemento de dois).
Ao somar esses números de 4 bits aos acumuladores de 8 bits, a extensão de sinal entra em jogo. Números unsigned são preenchidos com zeros, enquanto números signed são preenchidos com o bit de sinal. O resultado é que Uns8 aumenta em 8, enquanto Sig8 diminui em 8.
Visualizar o processo de extensão de sinal esclarece a diferença:

Principais Conclusões
- Tanto
signedquantounsignedsão tipos de vetor que suportam operações aritméticas. - Overflow é silencioso; valores fazem wrap around de acordo com a largura de bits.
- Extensão de sinal pode produzir resultados diferentes ao somar operandos de comprimentos desiguais.
Prossiga para o próximo tutorial para insights mais profundos.
VHDL
- Dominando Tipos Signed vs Unsigned em VHDL: Insights Práticos
- Aproveitando Procedimentos In-Process para Design de FSM em VHDL Mais Limpo
- Usando Funções Impuras em VHDL: Melhorando Legibilidade e Manutenibilidade de FSM
- Dominando Funções VHDL: Guia Prático para Design Eficiente
- Usando Procedimentos em VHDL: Simplifique seu Design com Código Reutilizável
- Aproveitando Constantes e Generic Maps em VHDL para Design de Módulo Flexível
- Dominando Instanciação com Port Map em VHDL: Guia Prático
- Configuração Gratuita de Simulador e Editor VHDL: Guia para Estudantes
- Microcontroladores PIC18: Características, Desempenho e Como Usá-los
- Entendendo Designadores de Referência: Como Rotular Conexões de Montagem de PCB