Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> VHDL

Voorwaardelijke instructies gebruiken in VHDL:If-Then-Elsif-Else

In de vorige tutorial gebruikten we een voorwaardelijke expressie met de Wait Until-instructie. De uitdrukking zorgde ervoor dat het proces alleen werd geactiveerd als de twee tegensignalen gelijk waren. Maar wat als we willen dat het programma in een proces verschillende acties onderneemt op basis van verschillende inputs?

De If-Then-Elsif-Else statements kunnen worden gebruikt om branches in ons programma te maken. Afhankelijk van de waarde van een variabele of de uitkomst van een uitdrukking, kan het programma verschillende paden inslaan.

Deze blogpost maakt deel uit van de serie Basic VHDL Tutorials.

De basissyntaxis is:

if <condition> then
elsif <condition> then
else
end if;

De elsif en else zijn optioneel, en elsif kan meerdere keren worden gebruikt. De <condition> kan een booleaanse true zijn of false , of het kan een uitdrukking zijn die resulteert in true of false .

Voorbeelduitdrukking die true . is als MyCounter is kleiner dan 10:

MyCounter < 10

Relationele operatoren:

= gelijk
/= niet gelijk
< minder dan
<= kleiner dan of gelijk aan
> groter dan
>= groter dan of gelijk

Logische operatoren:

niet een waar als a is onwaar
a en b waar als a en b zijn waar
a of b waar als a of b zijn waar
a nand b waar als a of b is onwaar
a noch b waar als a en b zijn vals
a xor b waar als precies één van a of b zijn waar
a xnor b waar als a en b zijn gelijk

Oefening

In deze video-tutorial leren we hoe je If-Then-Elsif-Else-statements in VHDL kunt gebruiken:

De laatste code die we in deze tutorial hebben gemaakt:

entity T08_IfTb is
end 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;

De uitvoer naar de simulatorconsole toen we op de run-knop in ModelSim drukten:

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

Analyse

We gaven CountDown een beginwaarde van 10, en CountUp een waarde van 0. Het eerste proces verandert beide tellerwaarden op exact hetzelfde moment, elke 10 ns. Wanneer dit gebeurt, wordt het tweede proces geactiveerd omdat het programma altijd zal wachten op de wait on CountUp, CountDown; lijn. Het programma zal daar altijd wachten omdat de If-Then-Elsif-Else en de rapportoverzichten nul simulatietijd verbruiken.

De If-Then-Elsif-Else-instructie zorgt ervoor dat het programma een van de drie takken neemt die we hebben gemaakt. De twee eerste takken hebben betrekking op de gevallen waarin de twee tellers verschillende waarden hebben. We hadden de single else kunnen laten vallen , en gebruikte elsif CountUp = CountDown then wat hetzelfde resultaat zou hebben gehad. Maar het is een goede ontwerppraktijk om alle branches te dekken, en de else clausule dekt alle opzettelijke en onvoorziene gevallen.

Zoals we op de afdruk kunnen zien, neemt het tweede proces een van de drie takken in beslag telkens wanneer de tellers veranderen.

Afhaalmaaltijden

  • If-Then kan alleen of in combinatie met Elsif en Else worden gebruikt.
  • Uitdrukkingen kunnen relationele en logische vergelijkingen en wiskundige berekeningen bevatten

Ga naar de volgende tutorial »


VHDL

  1. Hoe gebruiken we molybdeen?
  2. Een lijst met strings maken in VHDL
  3. Simulatie stoppen in een VHDL-testbench
  4. Een PWM-controller maken in VHDL
  5. Hoe willekeurige getallen te genereren in VHDL
  6. Een procedure gebruiken in een proces in VHDL
  7. Een onzuivere functie gebruiken in VHDL
  8. Een functie gebruiken in VHDL
  9. Een eindige-toestandsmachine maken in VHDL
  10. Een procedure gebruiken in VHDL
  11. Hoe een snijmolen te gebruiken