Jak používat podmíněné příkazy v jazyce VHDL: if-then-Elsif-Else
V předchozím návodu jsme použili podmíněný výraz se Dočkat, Až do prohlášení. Výraz zajistil, že proces byl spuštěn pouze tehdy, když dva čítače signalizují, kde jsou stejné. Ale co kdybychom chtěli, aby program v procesu podnikl různé akce založené na různých vstupech?
příkazy If-Then-Elsif-Else lze použít k vytvoření větví v našem programu. V závislosti na hodnotě proměnné nebo výsledku výrazu se program může vydat různými cestami.
tento blogový příspěvek je součástí základní série VHDL Tutorials.
základní syntaxe je:
if <condition> then
elsif <condition> then
else
end if;
elsif
a else
jsou volitelné, a elsif
může být použit vícekrát. <condition>
může být boolean true
nebo false
, nebo to může být výraz, který hodnotí na true
nebo false
.
příklad výrazu, který je true
pokud MyCounter
je menší než 10:
MyCounter < 10
relační operátory:
= | rovné |
/= | není rovno |
< | méně než |
<= | méně než nebo rovno |
> | větší než |
>= | větší než nebo rovno |
Logické operátory:
ne | true, pokud je false |
a a b | true, pokud a a b jsou pravdivé |
a nebo b | true pokud je a nebo b jsou pravdivé |
a nand b | true, pokud a nebo b je false |
a, ani b, | true, pokud a a b jsou nepravdivé |
a xor b | true, pokud právě jeden z a nebo b jsou pravdivé |
a xnor b | true, pokud a a b jsou si rovny |
Cvičení
V tomto video tutoriálu budeme učit, jak používat if-then-Elsif-Else v jazyce VHDL:
poslední kód, který jsme vytvořili v tomto návodu:
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;
výstup na simulátor konzole, když jsme stiskli tlačítko spustit v 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...
Analýza
dal CountDown
počáteční hodnotu 10, a CountUp
hodnotu 0. První proces mění obě hodnoty čítače ve stejnou dobu, každých 10 ns. Když k tomu dojde, spustí se druhý proces, protože program bude vždy čekat na řádku wait on CountUp, CountDown;
. Program tam bude vždy čekat, protože If-Then-Elsif-Else a příkazy sestavy spotřebovávají nulový čas simulace.
příkaz If-Then-Elsif-Else způsobí, že program vezme jednu ze tří větví, které jsme vytvořili. Dvě první větve pokrývají případy, kdy mají obě čítače různé hodnoty. Mohli jsme vynechat singl else
a použít elsif CountUp = CountDown then
, který by měl stejný výsledek. Je však dobrou konstrukční praxí pokrýt všechna odvětví a doložka else
pokrývá všechny úmyslné a nepředvídané případy.
jak vidíme z výtisku, druhý proces trvá jednu ze tří větví pokaždé, když se čítače změní.
s sebou
- If-Then lze použít samostatně nebo v kombinaci s Elsif a dalšími.
- výrazy mohou obsahovat relační a logická srovnání a matematické výpočty
přejděte na další tutoriál “