VHDL/Operacje na zmiennych

W tym rozdziale zostaną omówione zagadnienia związane z operacjami stosowanymi w VHDL.

Operacje przypisywania

edytuj

Jak wspomniano w rozdziale Typy danych, w VHDL istnieje rozróżnienie między sygnałem, a zmienną. Ma to odzwierciedlenie w sposobie przypisywania wartości do nich.

Przypisywanie do sygnałów

edytuj

W celu przypisania wartości do sygnału stosuje się operator <=, oraz zapis:

sygnał <= wartość;

Przykłady:

 sygnał1 <= '0';
 sygnał2 <= "001";

Przypisywanie do zmiennych

edytuj

W celu przypisania wartości do zmiennej stosuje się operator :=, oraz zapis:

zmienna := wartość;

Przykłady:

 zmienna1 := '0';
 zmienna2 := "001";

Sygnały, a zmienne

edytuj

Choć zmienne i sygnały różnią się miedzy sobą, można dokonywać miedzy nimi kopiowania wartości, jeśli mają zgodne typy. Ważne jest jednak, by zastosować odpowiedni operator. Jego wybór uzależniony jest od tego do czego przypisywana jest wartość. Przykładowo:

 sygnał1 <= zmienna1;
 zmienna2 := sygnał2;

Kopiowanie części wektora

edytuj

Przy stosowaniu operatora przypisania do wektora należy zachować odpowiednią wielkość wektorów po obu stronach operatora. Istnieje jednak czasem potrzeba "wykrojenia" z wektora jego części, by móc ją przypisać do innego wektora. Czyni się to po przez stosowanie słów kluczowych to i downto (stosowanych już w rozdziale Typy danych). Przykładowo, jeśli sygnał1 ma wartość "011", to zapis:

 sygnał2 <= sygnał1 (2 downto 1);

spowoduje przypisanie do sygnał2 wartości "01".

Konkatenacja

edytuj

Jak wspomniano w rozdziale Typy danych, w VHDL można deklarować zarówno wektory jak i skalary. Istnieje jednak możliwość przypisania wartości z wektora do skalaru, jak i na odwrót.

Zapis:

skalar <= wektor(indeks);

spowoduje przypisanie do sygnału skalar wartości z sygnału wektor o indeksie indeks. Przykładowo, jeśli sygnał2 ma wartość 101, to zapis:

 sygnał1 <= sygnał2(1);

spowoduje przypisanie do sygnał1 wartości 0 (jak więc widać jest to szczególny przypadek kopiowania części wektora).

Można też z kilku skalarów utworzyć nową wartość wektora, po przez zapis:

 wektor <= skalar1 & skalar2 & skalar3;

Przykładowo, jeśli skalar1 ma wartość 1, a skalar2 i skalar3 mają wartości 0, to powyższy zapis spowoduje przypisanie wartości 100 do zmiennej wektor.

Ta druga operacja (tworzenie wektora ze skalarów) ma nazwę konkatenacji, zaś znak & nazywany jest operatorem konkatenacji. Istnieje możliwość konkatenacji nie tylko skalarów, ale i wektorów, oraz wektorów i skalarów. Przykładowo (pozostając przy wartościach z poprzednich przykładów), zapis:

 sygnał4 <= skalar2 & sygnał2(2 downto 1) & skalar1;

spowoduje przypisanie do sygnał4 wartości 0101.

Operacje logiczne

edytuj

Podstawowe informacje

edytuj

W VHDLu można dokonać podstawowych operacji logicznych przy użyciu następujących słów kluczowych:

  • and
  • or
  • not
  • xor

Przykład operacji logicznych

 c <= a and b;

Zagnieżdżanie operacji logicznych

edytuj

Do zagnieżdżania operacji logicznych służą nawiasy. Przykładowo:

 c <= not (a and b);

da w efekcie operację nand.

Operacje arytmetyczne

edytuj

Język VHDL sam w sobie nie posiada obsługi operacji arytmetycznych. Jednak można to "obejść" po przez stosowanie biblioteki standardowej napisanej przez IEEE. Potrzebny pakiet nazywa się IEEE.numeric_std, a spis jego dokumentacja jest dostępna w Internecie[1].

Operacje warunkowe

edytuj
IF warunek THEN
   instrukcje;
END IF;
IF warunek1 THEN
   instrukcje;
ELSIF warunek2 THEN
   instrukcje;
END IF;
CASE wyrazenie IS
   WHEN wartosc1 =>
      instrukcje;
   WHEN wartosc2 =>
      instrukcje;
END CASE;
CASE wyrazenie IS
   WHEN wartosc1 =>
      instrukcje;
   WHEN wartosc2 =>
      instrukcje;
   WHEN OTHERS =>
      instrukcje;
END CASE;