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ść true
lub 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 ”