Lär dig Verilog: En kort Tutorial serie på Digital elektronik Design med FPGAs och Verilog HDL (20 / 21 steg)
Steg 20: VM 4.3: If/Else i Verilog
Denna handledning modul färdigställs bäst efter en gedigen förståelse för modul 4.2 om blockering och icke-blockerande uttalanden.IF/Else är-satser i Verilog mycket användbara när de används korrekt. Först ta en titt på några regler som du måste följa för If/Else-satser i Verilog:
1. alla If/Else uttalanden måste placeras inne i en alltid blockera
2. alla värden anges med en If/Else uttalande måste vara av typen reg
3. om du tilldelar mer än en reg, använda "begin" och "slut" för att definiera tillämpningsområdet för den If/Else. Endast ett uttalande? Så oroa dig inte om det. Men hursomhelst slut varje inre linje i en If/Else med semikolon (semikolon aldrig följer instruktionen "börja" eller "slut").
4. Använd komparator operatörer med 2 symboler i förhållanden (dvs "& &" och "==" och "! =")
Det är i princip allt som finns till den. Om din kod är någonsin ger dig frågor, hänvisa till dessa fyra regler och fråga dig själv, "Följer min kod reglerna?".
I Verilog får vi använda tre grundläggande villkorliga satser: om annat, och annat om. Innan vi kommer att använda dessa dock, måste vi gå över hur du tilldelar värden till en reg.
Vi vet att en reg är en tråd som kan ha en egen källa, det vill säga en tråd som kan skapa sitt eget värde. Vi vet också att vi kan ha buss regs och enda regs.
Du kan använda en reg som du skulle en variabel i C/C++; Det kommer att lagra sitt värde förrän uttryckligen ändras:
REG myReg;
myReg = 1' b1; blockera
myReg < = 1' b0; icke-blockerande
Det här alternativet anger reg logic hög spänning sedan till logik låg spänning. Värden som tilldelats regs bör dock endast ske inne i en alltid blockera såvida inte du kommer aldrig ändra dess värde. Om du bara behöver, till exempel en konstant logik high wire, du kan ge en reg värdet utanför en alltid blockera.
Tilldela (inte likställa detta att tilldela nyckelord) ett värde till en reg kräver följande format för den vänstra sidan av uttrycket:
< namn på reg >< lika med operatören (= eller < =) >
Och till höger (värde):
< buss bredd > ' < värde typ >< värde >
Detta är viktigt eftersom bredden på reg måste exakt matcha bredden på värdet. Det finns många olika typer av värden vi kan tilldela reg, som binärt, hexadecimalt och decimal (kallade i Verilog b, h och d respektive) men jag rekommenderar att de som bara lärande Verilog använder endast binära värden. De är lätt att arbeta med och också lätt att felsöka.
När du använder binära värden måste du skriva ut varje värde (1 eller 0) i varje bit i reg om inte du gör reg antingen alla höga eller allt låg.
Exempel:
my_reg < = 4' b0; juridiska
my_reg2 < = 3' b010; juridiska
my_reg3 < = 4' b01; olagligt (bredd mismatch, väntar 4 bitar)
Dessa uttalanden skulle läsas i klartext engelska som till exempel, "fyra bit binära noll" eller "tre bit binära två".
Nu när vi vet hur du tilldelar ett värde till en reg, låt oss titta på hur du använder If/Else uttalanden i Verilog, börjar med ett exempel:
modul testMod)
ingång a,
input b,
utgång c
);
REG Q; alltid @ (a, b) //if statligt av en eller b förändringar, åter kör den här koden tilldela c = Q; endmodule
börja
om (en == 1' b1 || b == 1' b0)
Q < = 1' b0;
annat
Q < = 1' b1;
slutet
Du kan spåra genom denna koden och härleda hur en If/Else uttalande fungerar i Verilog?
Om vi vill hantera fler än ett värde om "om" utlöser (Obs: om din om uttalande förändrar två värden, din else-sats måste också ändra två värden för att förhindra flyttalsvärden)?
modul testMod) REG Q; alltid @ (a, b) //if statligt av en eller b förändringar, åter kör den här koden tilldela c [0] = Q; endmodule
ingång a,
input b,
utgång [1:0] c
);
REG T;
börja
om (en == 1' b0)
börja
Q < = 1' b0;
T < = 1' b0;
slutet
annars om (en == 1' b1 & & b == 1' b1)
börja
Q < = 1' b1;
T < = 1' b0;
slutet
annat
börja
Q < = 1' b1;
T < = 1' b1;
slutet
slutet
tilldela c [1] = T;
Jag tror att detta exempel band en massa idéer omfattas i denna tutorial serie tillsammans. Jag slängde också i ett Else If-uttryck. Inga överraskningar men det fungerar som ett C/C++. Se bara till att varje villkor åtgärder hanterar samma utgångarna (i detta fall både Q och T behandlades i varje fall). Observera de start- och sökord på platser du intuitivt tror ska vara klammerparenteser.
Det är ungefär allt som finns att If/Else If/Else uttalanden i Verilog. Kom ihåg att hänvisa till designregler på toppen av denna Tutorial modul för felsökning.