Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> VHDL

Dominando Tipos Signed vs Unsigned em VHDL: Insights Práticos

Designers digitais dependem de aritmética precisa dentro de FPGAs e ASICs. Um conceito central é a distinção entre tipos de dados signed e unsigned em VHDL.

Ambos os tipos são definidos no pacote numeric_std da biblioteca IEEE. Embora muitos designers ainda usem std_logic_arith, este pacote não é padrão IEEE e não é recomendado para designs de produção.

No VHDL, um sinal signed é interpretado como número em complemento de dois, permitindo valores positivos e negativos. Um sinal unsigned representa apenas valores não-negativos. Internamente, o FPGA sempre usa complemento de dois para todos os vetores de bits, independentemente do tipo que você declara.

BitsValor UnsignedValor Signed
01133
01022
00111
00000
1117-1
1106-2
1015-3
1004-4

À primeira vista, esse mapeamento pode parecer contra-intuitivo, mas uma vez que você entende complemento de dois, o comportamento é previsível.

É importante notar que o resultado binário de uma operação aritmética é idêntico seja os operandos declarados signed ou unsigned. O que muda é a interpretação desse resultado.

Por exemplo, somando dois vetores de 5 bits:

 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity signed_unsigned is port ( i_rst_l : in std_logic; i_clk : in std_logic; i_a : in std_logic_vector(4 downto 0); i_b : in std_logic_vector(4 downto 0) ); end signed_unsigned; architecture behave of signed_unsigned is signal rs_SUM_RESULT : signed(4 downto 0) := (others => '0'); signal ru_SUM_RESULT : unsigned(4 downto 0) := (others => '0'); signal rs_SUB_RESULT : signed(4 downto 0) := (others => '0'); signal ru_SUB_RESULT : unsigned(4 downto 0) := (others => '0'); begin p_SUM : process (i_clk, i_rst_l) begin if i_rst_l = '0' then rs_SUM_RESULT <= (others => '0'); ru_SUM_RESULT <= (others => '0'); elsif rising_edge(i_clk) then ru_SUM_RESULT <= unsigned(i_a) + unsigned(i_b); rs_SUM_RESULT <= signed(i_a) + signed(i_b); end if; end process p_SUM; p_SUB : process (i_clk, i_rst_l) begin if i_rst_l = '0' then rs_SUB_RESULT <= (others => '0'); ru_SUB_RESULT <= (others => '0'); elsif rising_edge(i_clk) then ru_SUB_RESULT <= unsigned(i_a) - unsigned(i_b); rs_SUB_RESULT <= signed(i_a) - signed(i_b); end if; end process p_SUB; end behave; 

Testbench

 library ieee; use ieee.std_logic_1164.all; entity example_signed_unsigned_tb is end example_signed_unsigned_tb; architecture behave of example_signed_unsigned_tb is signal r_CLK : std_logic := '0'; signal r_RST_L : std_logic := '0'; signal r_A : natural := 0; signal r_B : natural := 0; signal r_A_SLV : std_logic_vector(4 downto 0) := (others => '0'); signal r_B_SLV : std_logic_vector(4 downto 0) := (others => '0'); constant c_CLK_PERIOD : time := 10 ns; component example_signed_unsigned is port ( i_rst_l : in std_logic; i_clk : in std_logic; i_a : in std_logic_vector(4 downto 0); i_b : in std_logic_vector(4 downto 0) ); end component example_signed_unsigned; begin i_DUT: example_signed_unsigned port map ( i_rst_l => r_RST_L, i_clk => r_CLK, i_a => r_A_SLV, i_b => r_B_SLV ); clk_gen : process is begin r_CLK <= '0' after c_CLK_PERIOD/2, '1' after c_CLK_PERIOD; wait for c_CLK_PERIOD; end process clk_gen; process begin r_RST_L <= '0'; wait for 20 ns; r_RST_L <= '1'; wait for 20 ns; r_A_SLV <= "01001"; r_B_SLV <= "00110"; wait for 20 ns; r_A_SLV <= "10001"; r_B_SLV <= "00110"; wait for 20 ns; r_A_SLV <= "10001"; r_B_SLV <= "00001"; wait for 20 ns; r_A_SLV <= "10001"; r_B_SLV <= "00010"; wait for 20 ns; r_A_SLV <= "11111"; r_B_SLV <= "00001"; wait for 20 ns; r_A_SLV <= "00000"; r_B_SLV <= "00001"; wait for 20 ns; wait; end process; end behave; 
Dominando Tipos Signed vs Unsigned em VHDL: Insights Práticos

Modelsim simulation wave – Valores hexadecimais

Dominando Tipos Signed vs Unsigned em VHDL: Insights Práticos

Modelsim simulation wave – Valores decimais

As duas capturas demonstram que os resultados binários subjacentes são idênticos independentemente do tipo. A diferença surge apenas quando o simulador exibe os valores: em hex o mesmo padrão de bits aparece, enquanto em decimal resultados signed podem aparecer negativos. Manipulação cuidadosa de tipo é essencial ao projetar lógica FPGA.

Se alguma parte deste tópico permanece obscura, por favor envie e-mail via link de contato na barra lateral. Ficamos felizes em ajudar você a dominar aritmética signed e unsigned.

VHDL

  1. Introdução ao VHDL: Construindo sua Primeira Porta AND
  2. Guia Completo de Conversões de Tipos VHDL com Numeric_Std e Std_Logic_Arith
  3. Exemplo de Procedure VHDL: Incrementando um Standard Logic Vector
  4. Aproveitando Records VHDL para Interfaces FIFO Limpas e Reutilizáveis
  5. Variáveis VHDL Explicadas: Exemplos Práticos & Regras para Design Confiável
  6. Sistemas de Sinal de Corrente: O Laço 4–20 mA Explicado
  7. Semáforos: Engenharia, História e Inovações Futuras
  8. Localização LoRa: Por Que a Geolocalização Nativa É Mais Complexa do Que Parece
  9. Criando Listas de Strings em VHDL: Boas Práticas e Exemplo
  10. Garantindo Integridade de Sinal em Design de PCI de Alta Velocidade