Lär dig Verilog: En kort Tutorial serie på Digital elektronik Design med FPGAs och Verilog HDL (11 / 21 steg)
Steg 11: VM 2.0: Verilog Port och tråd typer
() modul hello_world
ingående switch [0],
ingående switch [1],
produktionen ledde
);
Vad menar ingång och utgång i detta sammanhang? Dessa är identifierare som tala kompilatorn vilken typ av "port" du skapar. Vi kommer att behandla följande identifierare i modul deklarationen i Verilog:
indata : en indataport, typ "wire" antas. En indataport kan inte tilldelas något värde i modulen.
output : en utdataport, typ "wire" antas. En utgång tråd kan tilldelas ett värde med tilldela-uttryck, eller har dess värde bestämmas indirekt av en instans av en annan modul. En utgång tråd kan inte uttryckligen tilldelas ett värde i någon villkorad logik (e.g. "om" uttalanden).
produktionen reg : en utdataport av typen "reg", kort för "register". Denna typ av port kan ges ett värde oberoende av andra delar av banan (t.ex. tilldela den en logik "1") och hålla värdet förrän ändras. Om du kommer att ändra värdet på en port från inom en "alltid" block (en bit kod som utför vid varje förändring av dess parametrar) måste du använda en reg.
Kort sagt, fungerar en tråd som ett kontakt formulär en punkt till en annan, som ett riktigt ord källa till en AND-gate och en reg kan skapa sin egen källa som går till en destination.
Inuti en modul kan vi skapa inre trådarna och regs för använda inuti modulen. Detta är användbart när du behöver att göra inmatning av en instans av en modul är lika till produktionen av vissa andra instansierad modul. Eftersom en tråd inte har sin egen drivrutin kan du göra dess källa produktionen av en modul, och dess destination indata av en annan. Med detta i åtanke, hur tror du att du vill deklarera en tråd eller reg för användning inuti en modul?
Wire my_wire;
reg my_reg;
Observera att vi inte behöver ange om wire/reg är en in- eller utdata för interna kablar och regs eftersom att dirigera ordentligt i vår design så småningom ger vi det en källa och destination.
I Verilog kan vi tilldela en utgång tråd lika med en inre reg eller tråd. Detta låter oss ändra värdet för en utgång villkorligt eftersom om vi ändrar reg vi också ändrar utdata (kom ihåg att direkt ändra värdet på en utgång är förbjudet).
Gäller för alla ovan nämnda portar, ledningar och regs är vad vi kallar bussar, eller vektorer (matriser). Vi kan gruppera liknande signaler genom att använda en buss. I det sista exemplet ställde jag frågan "Är det ett sätt att bara definiera 2 portar för tre totala in- och utgångar?" Använda en buss kan vi. I stället för att "mata in switch0, in VÄXEL1" vi kan helt enkelt förklara "input [1:0] switch". Detta skapar en två lite buss kallas "strömbrytare". Vi kan referera till specifika delar av "switch" genom att använda [] som i "switch [0]". Bussar är mycket användbara i Verilog eftersom det minskar mängden kod vi måste producera.
Deklarera en buss med följande syntax ("typ" hänvisar till input, output, tråd eller reg):
< typ > [< max index >: < min index >] < buss namn >
Om du deklarerar en buss inne i en modul, måste du lägga till ett semikolon i slutet. Om du deklarerar en buss i modul deklarationen vara säker att kommatecken avgränsa alla dina definitioner.
Vilka konsekvenser har en buss på din UCF fil? Alla komponenter i bussen får ett namn som börjar med det gemensamma namnet och följs av dess index i bussen. Så "[1:0] switch" kommer att gå in på UCF som två poster, "växla < 0 >" och "växla < 1 >". Kom ihåg att använda de <> aktörerna för UCF!
På bilden är bakbord hoppare ledningar; du behöver inte oroa de på de flesta FPGA design styrelser som de kommer att ha byggt i stimuli som växlar.