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))