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
- Ondertekend versus niet-ondertekend in VHDL
- Variabelen - VHDL-voorbeeld
- Hoe verschilt cloud computing van traditioneel computergebruik?
- Een lijst met strings maken in VHDL
- Simulatie stoppen in een VHDL-testbench
- Een PWM-controller maken in VHDL
- Hoe willekeurige getallen te genereren in VHDL
- Een procedure gebruiken in een proces in VHDL
- Een onzuivere functie gebruiken in VHDL
- Een functie gebruiken in VHDL
- Wat is het BeiDou-navigatiesatellietsysteem? Wat is het verschil met GPS?