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";
[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! 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! 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! 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;