jak używać instrukcji warunkowych w VHDL: If-Then-Elsif-Else
w poprzednim samouczku użyliśmy wyrażenia warunkowego z instrukcją Wait Until. Wyrażenie zapewniało, że proces jest uruchamiany tylko wtedy, gdy dwa sygnały licznikowe są równe. Ale co, jeśli chcemy, aby program w procesie podejmował różne działania w oparciu o różne dane wejściowe?
polecenia If-Then-Elsif-Else mogą być użyte do tworzenia gałęzi w naszym programie. W zależności od wartości zmiennej lub wyniku wyrażenia, program może przyjmować różne ścieżki.
ten post na blogu jest częścią podstawowej serii samouczków VHDL.
podstawowa składnia to:
if <condition> then
elsif <condition> then
else
end if;
elsif i else są opcjonalne, a elsif może być używany wiele razy. <condition> może być logicznym true lub false, lub może być wyrażeniem, które zwraca wartość truelub false.
przykładowe wyrażenie, które jest true jeśli MyCounter jest mniejsze niż 10:
MyCounter < 10
operatory relacyjne:
| = | równe |
| /= | nie równe |
| < | mniej niż |
| <= | mniejsza lub równa |
| > | większe niż |
| >= | większe lub równe |
operatory logiczne:
| not a | true if a is false |
| a i b | true Jeśli a i b są prawdziwe |
| a lub B | true Jeśli a lub b są prawdziwe |
| a nand B | true Jeśli a lub b jest fałszywe |
| a ani b | true Jeśli a i b są fałszywe |
| a xor B | true jeśli dokładnie jedno z a lub b jest prawdziwe |
| a xnor B | true Jeśli a i b są równe |
ćwiczenie
w tym samouczku wideo nauczymy się, jak używać instrukcji If-Then-Elsif-Else w VHDL:
końcowy kod, który stworzyliśmy w tym samouczku:
entity T08_IfTb isend entity;architecture sim of T08_IfTb is signal CountUp : integer := 0; signal CountDown : integer := 10;begin process is begin CountUp <= CountUp + 1; CountDown <= CountDown - 1; wait for 10 ns; end process; process is begin if CountUp > CountDown then report "CountUp is larger"; elsif CountUp < CountDown then report "CountDown is larger"; else report "They are equal"; end if; wait on CountUp, CountDown; end process;end architecture;
wyjście do konsoli symulatora po naciśnięciu przycisku Uruchom w ModelSim:
VSIM 2> run# ** Note: CountDown is larger# Time: 0 ns Iteration: 0 Instance: /t08_iftb# ** Note: CountDown is larger# Time: 0 ns Iteration: 1 Instance: /t08_iftb# ** Note: CountDown is larger# Time: 10 ns Iteration: 1 Instance: /t08_iftb# ** Note: CountDown is larger# Time: 20 ns Iteration: 1 Instance: /t08_iftb# ** Note: CountDown is larger# Time: 30 ns Iteration: 1 Instance: /t08_iftb# ** Note: They are equal# Time: 40 ns Iteration: 1 Instance: /t08_iftb# ** Note: Countup is larger# Time: 50 ns Iteration: 1 Instance: /t08_iftb# ** Note: Countup is larger# Time: 60 ns Iteration: 1 Instance: /t08_iftb...
Analiza
daliśmy CountDown wartość początkową 10, a CountUp wartość 0. Pierwszy proces zmienia obie wartości licznika w tym samym czasie, co 10 ns. Gdy tak się stanie, uruchamiany jest drugi proces, ponieważ program zawsze będzie czekał w linii wait on CountUp, CountDown;. Program zawsze tam będzie czekał, ponieważ instrukcje If-Then-Elsif-Else I report zużywają zerowy czas symulacji.
polecenie If-Then-Elsif-Else spowoduje, że program pobierze jedną z trzech utworzonych przez nas gałęzi. Dwie pierwsze gałęzie obejmują przypadki, w których dwa liczniki mają różne wartości. Mogliśmy zrzucić pojedynczy else i użyć elsif CountUp = CountDown then, co przyniosłoby ten sam rezultat. Ale dobrą praktyką projektową jest objęcie wszystkich gałęzi, a klauzula else obejmuje wszystkie umyślne i nieprzewidziane przypadki.
jak widać na wydruku, drugi proces zajmuje jedną z trzech gałęzi za każdym razem, gdy liczniki się zmieniają.

- If-Then może być stosowany samodzielnie lub w połączeniu z Elsif i innymi.
- wyrażenia mogą zawierać porównania relacyjne i logiczne oraz obliczenia matematyczne
przejdź do następnego poradnika ”