Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> VHDL

Dominando tipos Signed vs Unsigned en VHDL: Perspectivas prácticas

Los diseñadores digitales confían en aritmética precisa dentro de FPGAs y ASICs. Un concepto central es la distinción entre tipos de datos signed y unsigned en VHDL.

Ambos tipos están definidos en el paquete numeric_std de la librería IEEE. Aunque muchos diseñadores aún usan std_logic_arith, este paquete no es estándar IEEE y no se recomienda para diseños de producción.

En VHDL, una señal signed se interpreta como un número en complemento a dos, permitiendo valores positivos y negativos. Una señal unsigned representa solo valores no negativos. Internamente, la FPGA siempre usa complemento a dos para todos los vectores de bits, independientemente del tipo que declare.

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

A primera vista este mapeo puede parecer contraintuitivo, pero una vez que entiende el complemento a dos, el comportamiento es predecible.

Es importante notar que el resultado binario de una operación aritmética es idéntico ya sea que los operandos se declaren signed o unsigned. Lo que cambia es la interpretación de ese resultado.

Por ejemplo, sumando dos vectores 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 en VHDL: Perspectivas prácticas

Modelsim simulation wave – Valores hexadecimales

Dominando tipos Signed vs Unsigned en VHDL: Perspectivas prácticas

Modelsim simulation wave – Valores decimales

Las dos capturas demuestran que los resultados binarios subyacentes son idénticos independientemente del tipo. La diferencia surge solo cuando el simulador muestra los valores: en hex el mismo patrón de bits aparece, mientras que en decimal los resultados signed pueden aparecer negativos. El manejo cuidadoso de tipos es esencial al diseñar lógica FPGA.

Si alguna parte de este tema permanece poco clara, por favor envíenos un correo vía el enlace de contacto en la barra lateral. Estamos felices de ayudarle a dominar la aritmética signed y unsigned.

Páginas más populares de Nandland

VHDL

  1. Semáforos: Ingeniería, Historia e Innovaciones Futuras
  2. Sistemas de Señal de Corriente: El Lazo 4–20 mA Explicado
  3. Garantizando la Integridad de Señal en Diseño PCB de Alta Velocidad
  4. Localización LoRa: Por qué la geolocalización nativa es más compleja de lo que parece
  5. Introducción a VHDL: Construyendo tu primera compuerta AND
  6. Guía completa de conversiones de tipos VHDL con Numeric_Std y Std_Logic_Arith
  7. Ejemplo de procedimiento VHDL: Incrementando un vector Standard Logic
  8. Aprovechando records VHDL para interfaces FIFO limpias y reutilizables
  9. Variables VHDL explicadas: Ejemplos prácticos y reglas para diseño fiable
  10. Dominando la verificación formal de módulos VHDL con PSL
  11. Creación de listas de cadenas en VHDL: Buenas prácticas y ejemplo