Stap 20: VM 4.3: If/Else in Verilog
Deze Tutorial Module is beste na een stevige begrip van Module 4.2 blokkeren en niet-blokkerende verklaringen voltooid.If/Else zijn statements in Verilog uiterst nuttig wanneer correct gebruikt. Eerst neem een kijkje op een paar regels die u voor If/Else statements in Verilog volgen moet:
1. alle If/Else statements moeten worden gevestigd binnen van een altijd blokkeren
2. alle waarden ingesteld door middel van een If/Else statement moet type reg
3. Als u meer dan één reg toewijst, gebruik "begin" en "end" aan de draagwijdte van de If/Else. Slechts één instructie? Dan maak je geen zorgen over het. Maar één van beide manier eindigen elke interne regel van een If/Else met een puntkomma (een puntkomma nooit volgt nog een "begin" of "end"-instructie).
4. gebruik Comparateur exploitanten met 2 symbolen in omstandigheden (dat wil zeggen "& &" en "==" en "! =")
Dat is in principe alles wat er is. Als uw code u ooit problemen geven is, terug te verwijzen naar deze vier regels en vraag jezelf, "Doet mijn code volgen deze regels?".
Verilog krijgen we drie fundamentele voorwaardelijke instructies gebruiken: als, anders, en anders als. Voordat we naar deze wel gebruiken, moeten we gaan over waarden toewijzen aan een reg.
We weten dat een reg is als een draad die zijn eigen bron, dat wil zeggen een draad die zijn eigen waarde genereren kan kan hebben. We weten ook dat wij bus regs en één regs kunnen hebben.
U kunt een reg zoals je zou een variabele in C/C++; het slaat de waarde totdat het expliciet veranderd:
reg myReg;
myReg = 1' b1; blokkeren
myReg < = 1' b0; niet-blokkerende
Hiermee worden de reg op hoogspanning logica dan aan logica laagspanning. Echter waarden toegewezen aan regs moeten alleen optreden binnen een altijd blokkeren, tenzij u nooit zijn waarde veranderen zal. Als u precies nodig hebt, bijvoorbeeld een constante logica hoge draad, kan je een reg waarde buiten een altijd blokkeren.
Toewijzen van (niet gelijk dit aan het zoekwoord toewijzen) een waarde aan een reg vereist de volgende notatie voor de linker kant van de instructie:
< naam van reg >< evenaart exploitant (= of < =) >
En voor de rechterkant (de waarde):
< bus breedte > ' < waarde type >< waarde >
Dit is belangrijk omdat de breedte van de reg moet exact overeenkomen met de breedte van de waarde. Er zijn veel verschillende soorten waarden die wij aan de reg, zoals binair, hexadecimaal en decimaal toewijzen kunt (genoemd in Verilog b, h en d respectievelijk) maar ik aanbevelen dat degenen die gewoon Verilog leren zijn alleen binaire waarden gebruiken. Ze zijn makkelijk om mee te werken en ook makkelijk om op te lossen.
Bij het gebruik van de binaire waarden moet u uit elke waarde (1 of 0) van elke bit van de reg typen, tenzij u bent het maken van de reg allemaal hoog of alle laag.
Voorbeelden:
my_reg < = 4' b0; juridische
my_reg2 < = 3' b010; juridische
my_reg3 < = 4' b01; illegale (breedte mismatch; verwacht van 4 bits)
Deze verklaringen zou worden gelezen in plain Engels als, bijvoorbeeld, "4 bit binary nul" of "drie bits binaire twee".
Nu dat we hoe u een waarde toewijst aan een reg weten, laten we eens kijken naar het gebruik van If/Else verklaringen in Verilog, beginnend met een voorbeeld:
module testMod)
ingang a,
Input b,
uitvoer c
);
reg Q; altijd @ (a, b) //if de staat van een of b veranderingen, opnieuw het uitvoeren van deze code toewijzen van c = Q; endmodule
beginnen
Als (een 1' b1 == || b == 1' b0)
Q < = 1' b0;
anders
Q < = 1' b1;
einde
Kunt u traceren door middel van deze code en afleiden hoe een If/Else statement werkt in Verilog?
Wat als we willen manipuleren van meer dan één waarde als de "als" veroorzaakt (Opmerking: als uw als instructie twee waarden wijzigt, uw instructie else moet ook twee waarden om te voorkomen dat zwevende waarden wijzigen)?
module testMod) reg Q; altijd @ (a, b) //if de staat van een of b veranderingen, opnieuw het uitvoeren van deze code toewijzen van c [0] = Q; endmodule
ingang a,
Input b,
uitgang [1:0] c
);
reg T;
beginnen
Als (een == 1' b0)
beginnen
Q < = 1' b0;
T < = 1' b0;
einde
anders als (een 1' b1 == & & b == 1' b1)
beginnen
Q < = 1' b1;
T < = 1' b0;
einde
anders
beginnen
Q < = 1' b1;
T < = 1' b1;
einde
einde
toewijzen van c [1] = T;
Ik denk dat dit voorbeeld banden veel van de ideeën in deze tutorial serie samen behandeld. Ik gooide ook in de instructie Else If. Geen verrassingen echter het werkt als een C/C++. Zorg er wel voor dat het elke voorwaarde acties behandelt de dezelfde uitgangen (in dit geval zowel Q als T werden behandeld in elk geval). Opmerking de begin- en eindtijden sleutelwoorden in de plaatsen u intuïtief dat moet accolades.
Dat is ongeveer alles wat er is If/Else If/Else verklaringen in Verilog. Vergeet niet te verwijzen naar de regels voor het ontwerp aan de bovenkant van deze Tutorial Module voor de foutopsporing.