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

Hoe een signaal verschilt van een variabele in VHDL

In de vorige tutorial hebben we geleerd hoe je een variabele in een proces declareert. Variabelen zijn goed voor het maken van algoritmen binnen een proces, maar zijn niet toegankelijk voor de buitenwereld. Als een bereik van een variabele zich slechts binnen één proces bevindt, hoe kan het dan interageren met andere logica? De oplossing hiervoor is een signaal .

Signalen worden gedeclareerd tussen de architecture <architecture_name> of <entity_name> is regel en de begin verklaringen in het VHDL-bestand. Dit wordt het declaratieve deel van de architectuur genoemd.

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

De syntaxis voor het declareren van een signaal is:
signal <name> : <type>;

Een signaal kan optioneel worden gedeclareerd met een beginwaarde:
signal <name> : <type> := <initial_value>;

Oefening

In deze video-tutorial leren we hoe je een signaal declareert. We zullen ook het belangrijkste verschil tussen een variabele en een signaal leren:

De laatste code die we in deze tutorial hebben gemaakt:

entity T06_SignalTb is
end entity;

architecture sim of T06_SignalTb is

    signal MySignal : integer := 0;

begin

    process is
        variable MyVariable : integer := 0;
    begin

        report "*** Process begin ***";

        MyVariable := MyVariable + 1;
        MySignal   <= MySignal + 1;

        report "MyVariable=" & integer'image(MyVariable) &
            ", MySignal=" & integer'image(MySignal);

        MyVariable := MyVariable + 1;
        MySignal   <= MySignal + 1;

        report "MyVariable=" & integer'image(MyVariable) &
            ", MySignal=" & integer'image(MySignal);

        wait for 10 ns;

        report "MyVariable=" & integer'image(MyVariable) &
            ", MySignal=" & integer'image(MySignal);

    end process;

end architecture;

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

VSIM 2> run
# ** Note: *** Process begin ***
#    Time: 0 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=1, MySignal=0
#    Time: 0 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=2, MySignal=0
#    Time: 0 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=2, MySignal=1
#    Time: 10 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: *** Process begin ***
#    Time: 10 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=3, MySignal=1
#    Time: 10 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=4, MySignal=1
#    Time: 10 ns  Iteration: 0  Instance: /t06_signaltb
# ** Note: MyVariable=4, MySignal=2
#    Time: 20 ns  Iteration: 0  Instance: /t06_signaltb
...

Analyse

We hebben een signaal en een variabele gemaakt met dezelfde beginwaarde 0. In ons proces hebben we ze op exact dezelfde manier behandeld, maar de afdrukken laten zien dat ze zich anders gedroegen. Eerst zagen we dat de toewijzing aan een variabele en een signaal een andere notatie heeft in VHDL. Variabele toewijzing gebruikt de := operator terwijl signaaltoewijzing de <= . gebruikt telefoniste.

MyVariable gedraagt ​​zich zoals men zou verwachten dat een variabele zich zou gedragen. In de eerste iteratie van de lus wordt deze verhoogd naar 1, en vervolgens naar 2. De laatste afdruk van de eerste iteratie laat zien dat de waarde nog steeds 2 is, zoals we zouden verwachten.

MySignal gedraagt ​​zich iets anders. De eerste verhoging van +1 lijkt geen effect te hebben. De afdruk laat zien dat de waarde nog steeds 0 is, de beginwaarde. Hetzelfde geldt na de tweede verhoging van +1. Nu de waarde van MyVariable is 2, maar de waarde van MySignal is nog steeds 0. Na wait for 10 ns; de derde afdruk laat zien dat de waarde van MySignal is nu 1. De volgende afdrukken volgen dit patroon ook.

Wat voor tovenarij is dit? Ik zal je een idee geven, de wait for 10 ns; heeft er iets mee te maken. Signalen worden alleen bijgewerkt wanneer een proces is gepauzeerd. Ons proces pauzeert slechts één plaats, op wait for 10 ns; . Daarom verandert de signaalwaarde alleen elke keer dat deze lijn wordt geraakt. De 10 nanoseconden is een willekeurige waarde, het kan van alles zijn, zelfs 0 nanoseconden. Probeer het!

Een andere belangrijke observatie is dat de gebeurtenis hoewel het signaal twee keer werd verhoogd vóór de wait , de waarde ervan wordt slechts één keer verhoogd. Dit komt omdat bij het toewijzen aan een signaal in een proces de laatste toewijzing "wint". De <= operator plant alleen een nieuwe waarde op het signaal, het verandert niet tot de wait . Daarom, bij de tweede stap van MySignal , 1 is toegevoegd aan zijn oude waarde. Wanneer het opnieuw wordt verhoogd, gaat de eerste toename volledig verloren.

Afhaalmaaltijden

  • Een variabele kan binnen één proces worden gebruikt, terwijl signalen een breder bereik hebben
  • Toewijzing van variabelen is onmiddellijk van kracht, terwijl signalen alleen worden bijgewerkt wanneer een proces wordt onderbroken
  • Als een signaal meerdere keren is toegewezen zonder een wait , de laatste opdracht “wint”

Ga naar de volgende tutorial »


VHDL

  1. Ondertekend versus niet-ondertekend in VHDL
  2. Variabelen - VHDL-voorbeeld
  3. Hoe verschilt cloud computing van traditioneel computergebruik?
  4. Een lijst met strings maken in VHDL
  5. Simulatie stoppen in een VHDL-testbench
  6. Een PWM-controller maken in VHDL
  7. Hoe willekeurige getallen te genereren in VHDL
  8. Een procedure gebruiken in een proces in VHDL
  9. Een onzuivere functie gebruiken in VHDL
  10. Een functie gebruiken in VHDL
  11. Wat is het BeiDou-navigatiesatellietsysteem? Wat is het verschil met GPS?