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

uzyskaj ekskluzywny dostęp do ćwiczeń i odpowiedzi!

  • 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 ”