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

Een Case-When-statement gebruiken in VHDL

De Case-When-instructie zorgt ervoor dat het programma één van meerdere verschillende paden neemt, afhankelijk van de waarde van een signaal, variabele of uitdrukking. Het is een eleganter alternatief voor een If-Then-Elsif-Else-statement met meerdere Elsif's.

Andere programmeertalen hebben vergelijkbare constructies, waarbij trefwoorden worden gebruikt zoals een switch , case , of selecteer . Case-When-statements worden onder andere vaak gebruikt voor het implementeren van multiplexers in VHDL. Lees verder of bekijk de video om erachter te komen hoe!

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

De basissyntaxis voor de Case-When-instructie is:
case <expression> is
    when <choice> =>
        code for this branch
    when <choice> =>
        code for this branch
    ...
end case;

De <expression> is meestal een variabele of een signaal. De Case-instructie kan meerdere when . bevatten keuzes, maar er wordt slechts één keuze geselecteerd.

De <choice> kan een unieke waarde zijn zoals "11" :
when "11" =>

Of het kan een bereik zijn zoals 5 to 10 :
when 5 to 10 =>

Het kan verschillende waarden bevatten, zoals 1|3|5 :
when 1|3|5 =>

En het belangrijkste, de others keuze. Het wordt geselecteerd wanneer er geen andere keuze werd gevonden:
when others =>

De others keuze is gelijk aan de Else vertakking in de If-Then-Elsif-Else-instructie.

Oefening

In deze video-tutorial leren we hoe we een multiplexer kunnen maken met behulp van het Case-When-statement in VHDL:

De laatste code die we in deze tutorial hebben gemaakt:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity T14_CaseWhenTb is
end entity;

architecture sim of T14_CaseWhenTb is

    signal Sig1 : unsigned(7 downto 0) := x"AA";
    signal Sig2 : unsigned(7 downto 0) := x"BB";
    signal Sig3 : unsigned(7 downto 0) := x"CC";
    signal Sig4 : unsigned(7 downto 0) := x"DD";

    signal Sel : unsigned(1 downto 0) := (others => '0');

    signal Output1 : unsigned(7 downto 0);
    signal Output2 : unsigned(7 downto 0);

begin

    -- Stimuli for the selector signal
    process is
    begin
        wait for 10 ns;
        Sel <= Sel + 1;
        wait for 10 ns;
        Sel <= Sel + 1;
        wait for 10 ns;
        Sel <= Sel + 1;
        wait for 10 ns;
        Sel <= Sel + 1;
        wait for 10 ns;
        Sel <= "UU";
        wait;
    end process;

    -- MUX using if-then-else
    process(Sel, Sig1, Sig2, Sig3, Sig4) is
    begin

        if Sel = "00" then
            Output1 <= Sig1;
        elsif Sel = "01" then
            Output1 <= Sig2;
        elsif Sel = "10" then
            Output1 <= Sig3;
        elsif Sel = "11" then
            Output1 <= Sig4;
        else -- 'U', 'X', '-' etc.
            Output1 <= (others => 'X');
        end if;

    end process;

    -- Equivalent MUX using a case statement
    process(Sel, Sig1, Sig2, Sig3, Sig4) is
    begin

        case Sel is
            when "00" =>
                Output2 <= Sig1;
            when "01" =>
                Output2 <= Sig2;
            when "10" =>
                Output2 <= Sig3;
            when "11" =>
                Output2 <= Sig4;
            when others => -- 'U', 'X', '-', etc.
                Output2 <= (others => 'X');
        end case;

    end process;

end architecture;

Het golfvormvenster in ModelSim nadat we op run hebben gedrukt en ingezoomd op de tijdlijn:

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

VSIM 2> run
# ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE
#    Time: 50 ns  Iteration: 1  Instance: /t14_casewhentb
# ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE
#    Time: 50 ns  Iteration: 1  Instance: /t14_casewhentb
# ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE
#    Time: 50 ns  Iteration: 1  Instance: /t14_casewhentb
# ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE
#    Time: 50 ns  Iteration: 1  Instance: /t14_casewhentb

Analyse

Eerst hebben we een proces gemaakt met behulp van If-Then-Elsif-Else dat een van de signalen Sig1 zou doorsturen , Sig2 , Sig3 , of Sig4 , gebaseerd op de waarde van het selectorsignaal Sel .

Vervolgens hebben we een proces gemaakt dat precies hetzelfde deed, met behulp van de Case-When-instructie. We kunnen aan de golfvorm zien dat de uitgangssignalen van de twee processen, Output1 en Output2 , gedragen zich precies hetzelfde.

In ons voorbeeld is de Sel signaal heeft slechts vier wettelijke waarden. Maar als er een groter aantal mogelijkheden was geweest, kunnen we gemakkelijk zien dat de Case-When-instructie kan helpen om code leesbaarder te maken. Dit is de voorkeursmanier om zo'n component te maken door de meeste VHDL-ontwerpers.

Begrip van de multiplexer was het bonuspunt van deze oefening. Multiplexers, of kortweg MUX's, zijn centrale componenten in digitaal ontwerp. Het is gewoon een schakelaar die een van de verschillende ingangen selecteert en doorstuurt naar de uitgang.

Dit is een illustratie van hoe onze MUX het geselecteerde ingangssignaal doorstuurt:

We gebruikten de others clausule om alle waarden van Sel . op te vangen die geen enen of nullen waren. Zoals we hebben geleerd in de std_logic tutorial, kunnen deze signalen een aantal waarden hebben die niet '0' zijn. of '1' . Het is een goede ontwerppraktijk om met deze waarden om te gaan door 'X' . uit te voeren . Dit geeft een onbekende waarde aan op dit signaal, en het zal ook zichtbaar zijn in de stroomafwaartse logica.

We kunnen aan de golfvorm zien dat wanneer de Sel signaal werd rood, Output1 en Output2 ook gewijzigd in "XX" . Dit is when others => in actie.

Bovendien toont de console-uitvoer in ModelSim een ​​waarschuwing vanwege de Sel signaal wordt ingesteld op "UU" . De berichten "** Waarschuwing:NUMERIC_STD."=":metawaarde gedetecteerd, terugkerende FALSE" verschijnen na een simulatietijd van 50 ns, precies wanneer de signalen rood worden.

Afhaalmaaltijden

  • Case-When kan worden gebruikt in plaats van meerdere If-Then-Elsif-instructies
  • De when others => kan worden gebruikt om een ​​standaardkeuze te implementeren
  • Multiplexers worden bij voorkeur gemaakt met Case-When-statements

Ga naar de volgende tutorial »


VHDL

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