Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> VHDL

Signed vs. Unsigned in VHDL meistern: Praktische Einblicke

Digitaldesigner verlassen sich auf präzise Arithmetik in FPGAs und ASICs. Ein Kernkonzept ist die Unterscheidung zwischen signed und unsigned Datentypen in VHDL.

Beide Typen sind im numeric_std Paket der IEEE Library definiert. Obwohl viele Designer noch std_logic_arith nutzen, ist dieses Paket nicht IEEE-Standard und für Produktionsdesigns nicht empfohlen.

In VHDL wird ein signed Signal als Zweierkomplement-Zahl interpretiert, was sowohl positive als auch negative Werte erlaubt. Ein unsigned Signal repräsentiert nur nicht-negative Werte. Intern nutzt der FPGA immer Zweierkomplement für alle Bitvektoren, unabhängig vom deklarierten Typ.

BitsUnsigned WertSigned Wert
01133
01022
00111
00000
1117-1
1106-2
1015-3
1004-4

Auf den ersten Blick mag dieses Mapping kontraintuitiv wirken, aber sobald man Zweierkomplement versteht, ist das Verhalten vorhersehbar.

Wichtig: Das binäre Ergebnis einer arithmetischen Operation ist identisch,无论 Operanden als signed oder unsigned deklariert sind. Was sich ändert, ist die Interpretation des Ergebnisses.

Beispiel: Addition zweier 5-Bit-Vektoren:

 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; 
Signed vs. Unsigned in VHDL meistern: Praktische Einblicke

Modelsim Simulation Wave – Hex Werte

Signed vs. Unsigned in VHDL meistern: Praktische Einblicke

Modelsim Simulation Wave – Dezimalwerte

Die zwei Screenshots zeigen, dass die zugrundeliegenden binären Ergebnisse unabhängig vom Typ identisch sind. Der Unterschied entsteht erst bei der Anzeige: In Hex erscheint das gleiche Bitmuster, in Dezimal können signed Ergebnisse negativ wirken. Sorgfältiges Type-Handling ist essenziell beim FPGA-Design.

Falls Unklarheiten bleiben, emailen Sie uns über den Sidebar-Kontaktlink. Wir helfen gerne beim Meistern von signed/unsigned Arithmetik.

Beliebteste Nandland Seiten

VHDL

  1. Einführung in VHDL: Ihr erstes AND-Gate bauen
  2. Umfassender Guide zu VHDL Typkonvertierungen mit Numeric_Std & Std_Logic_Arith
  3. VHDL Procedure Beispiel: Inkrementieren eines Standard Logic Vectors
  4. VHDL Records für saubere, wiederverwendbare FIFO-Interfaces nutzen
  5. VHDL Variables erklärt: Praxisbeispiele & Regeln für zuverlässiges Design
  6. Stromsignalsysteme: Der 4–20-mA-Stromkreis erklärt
  7. Verkehrsampeln: Technik, Geschichte und zukünftige Innovationen
  8. LoRa-Lokalisierung: Warum natives Geolocation komplexer ist, als es scheint
  9. String-Listen in VHDL erstellen: Best Practices & Beispiel
  10. Signalintegrität im High-Speed-PCB-Design sicherstellen