Die Typen integer und std_logic_vector
Wenn aber mehrere Signale zusammengehören - wie bei einem Schieberegister oder einem Zähler - werden die Signale besser Gruppenweise behandelt.
std_logic_vector eignet sich dabei besonders um Register und integer besser für Zähler und arithmetische Funktionen. In beiden Fällen werden allerdings prinzipiell für jedes benötigte Bit ein Register synthetisiert.
In diesem Projekt haben wir einen Takt von 125 MHz zur Verfügung und wollen eine LED mit 1 Hz blinken lassen. Dazu brauchen wir ein Signal welches alle 500 ms für einen Takt aktiv ist. Wir müssen also bis 62.500.000 zählen (dann ist eine halbe Sekunde um) und können dann die LED umschalten.
Ein ladbares Shiftregister wird in VHDL folgendermaßen codiert:
signal Value: std_logic_vector(7 downto 0); signal ShiftR: std_logic_vector(7 downto 0); signal LoadC: std_logic; signal ShiftC: std_logic; ... p_shift : process (Clk) begin if rising_edge(Clk) then if (LoadC = '1') then ShiftR <= Value; elsif (ShiftC = '1') then ShiftR <= '0' & ShiftR(7 downto 1); end if; end if; end process; Out <= ShiftR(0);
Ein einfacher Aufwärtszähler mit Clock Enable und synchronem Reset wird in VHDL folgendermaßen codiert:
signal CntR: integer range 0 to 500; signal IncCntC: std_logic; signal ResCntC: std_logic; ... p_cnt : process (Clk) begin if rising_edge(Clk) then if (ResCntC = '1') then CntR <= 0; elsif (IncCntC = '1') then CntR <= CntR + 1; end if; end if; end process;
Wie man sehen kann, werden Vektoren und Integer prinzipiell genauso behandelt wie Signale.
Bei der Deklaration muss die Dimension des Vektors angegeben werden. Dies geschieht im Normalfall in absteigender Reihenfolge.
Bei der Deklaration eines Integers sollte man den Zahlenbereich angeben den dieser Integer annehmen kann, sonst wird normalerweise ein 32 Bit-Integer erzeugt.
Wichtige Operationen mit integer
Arithmetisch | + - * div mod rem | |
Konvertierung | --> std_logic_vector | std_logic_vector(to_unsigned(val)) std_logic_vector(to_signed(val)) |
Konvertierung | std_logic_vector --> | to_integer(unsigned(vec)) to_integer(signed(vec)) |