Verschil tussen signalen en variabelen in VHDL begrijpen
In onze vorige tutorial keken we hoe een variabele binnen een proces gedeclareerd wordt. Variabelen zijn ideaal voor lokaal algoritmisch werk, maar kunnen niet buiten dat proces gezien worden. Wanneer je een waarde moet delen met andere delen van het ontwerp, gebruik je een signaal.
Signalen worden gedeclareerd in het declaratieve deel van een architectuur – dat is tussen de regel architecture <architectuur_naam> of <entiteit_naam> is en het sleutelwoord begin.
Dit bericht is onderdeel van de serie Basistutorials VHDL.
De syntaxis voor het declareren van een signaal is:signal <naam> : <type>;
Een signaal mag optioneel een initiële waarde krijgen:signal <naam> : <type> := <initiele_waarde>;
Oefening
In deze videotutorial leren we een signaal declareren en ontdekken we het kernverschil tussen een variabele en een signaal.
De uiteindelijke code die we in deze tutorial maakten:
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 "*** Proces start ***";
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 output naar de simulator-console toen we op run drukten in ModelSim:
VSIM 2> run # ** Note: *** Proces start *** # 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: *** Proces start *** # 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 creëerden een signaal en een variabele met dezelfde initiële waarde 0. Hoewel we ze identiek behandelden in het proces, onthult de console-output duidelijk gedragsverschillen. De belangrijkste verschillen zijn:
- Variabelen gebruiken de
:=-operator en worden direct binnen het proces bijgewerkt. - Signalen gebruiken de
<=-operator; de nieuwe waarde wordt gepland en treedt pas in werking wanneer het proces schort (bijv. bij eenwait-statement). - Wanneer een signaal meerdere keren toegewezen wordt voordat het proces hervat, "wint" alleen de laatste toewijzing, omdat eerdere geplande waarden overschreven worden.
In ons voorbeeld gingen de eerste twee incrementen van MySignal verloren omdat ze overschreven werden voordat het wait for 10 ns;-statement het proces deed schorten en het signaal bijwerkte. De daaropvolgende increment verschijnt na de schorting, wat het verwachte gedrag is.
Kernpunten
- Gebruik variabelen voor tijdelijke waarden die directe, lokale updates nodig hebben.
- Gebruik signalen wanneer je wijzigingen moet communiceren naar andere processen of componenten.
- Onthoud dat signaaltoewijzingen gepland zijn en alleen gecommit worden wanneer het proces pauzeert; meerdere toewijzingen zonder pauze laten alleen de laatste waarde overleven.
Ga naar de volgende tutorial »
VHDL
- BeiDou Navigatiesatellietstelsel Uitgelegd: Hoe Het Zich Verzet Tegenover GPS
- Cloud Computing vs. Traditionele Computing: Een Praktische Vergelijking
- Signed vs. Unsigned Typen in VHDL: Praktische Inzichten
- VHDL Variabelen Uitgelegd: Praktische Voorbeelden & Regels voor Betrouwbaar Ontwerp
- Dynamische string-lijsten in VHDL: Best Practices & Voorbeeld
- Een VHDL-testbench netjes beëindigen: methoden en best practices
- Een PWM-controller implementeren in VHDL: Ontwerp, Simulatie en FPGA-demo
- Willekeurige getallen genereren in VHDL: Van Uniform naar OSVVM
- In-process procedures benutten voor schonere VHDL FSM-ontwerpen
- Impure functies in VHDL gebruiken: FSM-leesbaarheid en onderhoudbaarheid verbeteren
- VHDL-functies onder de knie krijgen: een praktische gids voor efficiënt ontwerp