VHDL/Operacje na zmiennych

Z Wikibooks, biblioteki wolnych podręczników.

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

Spis treści

[edytuj] Operacje przypisywania

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.

[edytuj] Przypisywanie do sygnałów

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

sygnał <= wartość;

Przykłady:

sygnał1 <= '0';
sygnał2 <= "001";
Uwaga! Uwaga!
Podczas przypisywania wartości istnieje rozróżnienie między skalarem, a wektorem. Do przypisania pojedynczej wartości (skalaru) stosuje się znak apostrofu ('). Do przypisania całego wektora stosuje się znak cudzysłowu (").

[edytuj] Przypisywanie do zmiennych

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

zmienna := wartość;

Przykłady:

zmienna1 := '0';
zmienna2 := "001";
Uwaga! Uwaga!
Tutaj też ma zastosowanie uwaga odnośnie apostrofu i cudzysłowu (patrz poprzedni punkt).

[edytuj] Sygnały, a zmienne

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;

[edytuj] Kopiowanie części wektora

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".

[edytuj] Koniunkcja

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ę koniunkcji, zaś znak & nazywany jest operatorem koniunkcji. Istnieje możliwość koniunkcji 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.

[edytuj] Operacje logiczne

[edytuj] Podstawowe informacje

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;
Uwaga! Uwaga!
Tak jak przy przypisywaniu, tak i przy operacjach logicznych, musi być zachowana taka sama długość obu argumentów.

[edytuj] Zagnieżdżanie operacji logicznych

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

c <= not (a and b);

da w efekcie operację nand.

[edytuj] Operacje arytmetyczne


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].

[edytuj] Operacje warunkowe

Uwaga! Uwaga!
Jak zaznaczono w rozdziale Jednostki projektowe, poniższe operacje, mają sens tylko w obrębie procesu

[edytuj] IF

IF warunek THEN
   instrukcje;
END IF;
IF warunek1 THEN
   instrukcje;
ELSEIF warunek2 THEN
   instrukcje;
END IF;

[edytuj] CASE

CASE wyrazenie IS
   WHEN wartosc1 =>
      instrukcje;
   WHEN wartosc2 =>
      instrukcje;
END IF;
CASE wyrazenie IS
   WHEN wartosc1 =>
      instrukcje;
   WHEN wartosc2 =>
      instrukcje;
   WHEN OTHERS =>
      instrukcje;
END IF;

[edytuj] LOOP