Signed en unsigned types in VHDL onder de knie krijgen: een praktische gids
In VHDL zijn signed en unsigned gespecialiseerde bitvectoren die je in staat stellen rekenkundige operaties op databussen uit te voeren. In tegenstelling tot std_logic_vector, wat ideaal is voor het routeren van signalen maar niet voor berekeningen, worden deze typen door de compiler als numerieke waarden geïnterpreteerd.
Het proberen om een std_logic_vector op te tellen zal de compilatiefout triggeren: No feasible entries for infix operator "+", omdat het gereedschap niet kan bepalen hoe het ruwe bitpatroon als getal behandeld moet worden.
Deel van de Basic VHDL Tutorials-reeks.
Om rekenkunde mogelijk te maken, declareer een vector als signed of unsigned:
signal <name> : signed(<N-1> downto 0) := <initial_value>; signal <name> : unsigned(<N-1> downto 0) := <initial_value>;
Het bereik kan to of downto gebruiken, maar downto 0 is het meest gangbaar. De initiële waarde is optioneel; als weggelaten, defaulten alle bits naar 'U'.
Waarom signed/unsigned prefereren boven de traditionele integer? Digitale ontwerpers hebben vaak precieze controle over bitbreedte nodig. Deze vectortypes wrappen bij overflow, terwijl integer een runtime-fout genereert als de waarde de grenzen overschrijdt. Bovendien kunnen vectoren meta-waarden zoals 'U' en 'X' bevatten, wat ontwerpfouten vroegtijdig aan het licht brengt.
Videodemonstratie
In de bijbehorende video verkennen we hoe signed en unsigned signalen zich vergelijkbaar gedragen en waar ze uiteenlopen.
Voorbeeldcode
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; -- Wrapping teller UnsCnt <= UnsCnt + 1; SigCnt <= SigCnt + 1; -- Signalen optellen Uns8 <= Uns8 + Uns4; Sig8 <= Sig8 + Sig4; end process; end architecture;
Golfform-analyse
De ModelSim-golfform, ingezoomd op sleutelgebeurtenissen, toont alle waarden in hexadecimaal voor duidelijkheid:

In het teller-voorbeeld beginnen zowel UnsCnt als SigCnt op 0, incrementeren tot FF (decimaal 255), en wrappen terug naar 0 – demonstrerend identiek wrappend gedrag.
De 4-bits signalen Uns4 en Sig4 houden beide de binaire waarde 1000, wat decimaal 8 is voor unsigned en –8 voor signed (two's complement).
Bij het optellen van deze 4-bits getallen bij de 8-bits accumulators treedt tekenuitbreiding in play. Unsigned getallen worden opgevuld met nullen, terwijl signed getallen worden opgevuld met het tekenbit. Het resultaat is dat Uns8 met 8 toeneemt, terwijl Sig8 met 8 afneemt.
Het visualiseren van het tekenuitbreidingsproces verduidelt het verschil:

Belangrijkste opmerkingen
- Zowel
signedalsunsignedzijn vectortypes die rekenkundige operaties ondersteunen. - Overflow is stil; waarden wrappen volgens bitbreedte.
- Tekenuitbreiding kan verschillende resultaten produceren bij het optellen van operandes van ongelijke lengte.
Ga door naar de volgende tutorial voor diepere inzichten.
VHDL
- PIC18-microcontrollers: kenmerken, prestaties en hoe u ze gebruikt
- Referentieaanduidingen begrijpen: hoe PCB-montageverbindingen te labelen
- Signed vs. Unsigned Typen in VHDL: Praktische Inzichten
- In-process procedures benutten voor schonere VHDL FSM-ontwerpen
- Impure functies in VHDL gebruiken: FSM-leesbaarheid en onderhoudbaarheid verbeteren
- VHDL-functies onder de knie krijgen: een praktische gids voor efficiënt ontwerp
- Procedures in VHDL gebruiken: je ontwerp vereenvoudigen met herbruikbare code
- Constants en generic maps in VHDL benutten voor flexibele modulontwerpen
- VHDL port map instantiation onder de knie krijgen: een praktische gids
- De Case-When-statement in VHDL onder de knie krijgen: efficiënte multiplexer-ontwerpen
- Gratis VHDL-simulator & editor setup: Een studentengids