Lär dig Verilog: En kort Tutorial serie på Digital elektronik Design med FPGAs och Verilog HDL (12 / 21 steg)
Steg 12: VM 3.0: modulär Design
Nu bör du kunna genomföra enkla logiska funktioner med hjälp av grundläggande Verilog operatorer (|, &,...) och få det att framgångsrikt driva på brädan FPGA. Om inte du riktigt till det stadiet, börja med VM 2.0.
I "VM 2.0: min första Verilog-projekt" införde jag begreppet "moduler" och "modulära" kod. nu finns det några nyanser av moduler du behöver veta för att vara en kunnig "modulära designer". Men först måste vi diskutera "Vad är modulär Design?"
Om du genomfört "hello_world" utövandet, infördes till nyckelordet Verilog "modul". Varje Verilog källfilen innehåller en modul definition. Så hur kan vi skapa komplexa projekt som involverar många mindre moduler? Låt oss kontrollerad ta exemplet med att bygga en timer LED krets. Vad skulle vi behöva i vår krets gör en LED blinkar varje sekund om vissa switch var en logik en och vi hade bara en 50MHz klocka?
Bryta ner vad vi behöver i tre typer: ingångar, utgångar och interna komponenter.
Ingångar: fysiska signalkällor såsom en oscillator ("klocka"), växlar, knappar, hamnar data, etc...
Utgångar: fysiska utgångar som kommer att drivas av kretsen gillar lysdioder, hamnar data, skärmar osv...
Interna komponenter: komponenter som tar statligt av indata till generera en önskad utgång; inte alla av dessa måste vara ansluten till "top level"-portar, men så småningom allt bör "rutten".
Läs dessa klassificeringar igen; Det är oerhört viktigt du veta skillnaderna! Observera också vokabulär orden: "top level" och "rutten".
Tycker om vad dessa termer kan innebära... Jag ska formellt definiera dem i en minut.
Likna dessa tre typer av komponenter till en algebraisk ekvation, ingångarna är de oberoende variablerna, utgångarna är de beroende variablerna och de inre delarna representerar faktiska ekvationen. Att komma ihåg denna analogi hjälper dig att avgöra om en viss komponent är en ingång, utgång eller inre komponent arbetar på projekt.
När det gäller LED blinkar banan är här vad vi har på en mycket hög nivå:
Ingångar: 50 MHz klocka, switch
Utgångar: LED
Internals: en 50 MHz till 1 Hz klocka avdelare, en AND-gate (eftersom LED endast ska komma på om båda delade klockan och växeln är logik en)
Hur skulle du, på en mycket hög nivå (som betyder mest "svarta lådor" representerar komponenter snarare än gate mönster), block diagram denna krets? Minns att du kan göra en klocka avdelare genom att ansluta ett antal D-Flip Flops (DFFs) tillsammans med några växelriktare.
Se bifogat diagram för svaret.
Utmaning: I själva verket skulle vi ha en fysisk knapp som skulle återställa alla DFFs i klocka delaren. Kan du rita ursprung och destination för en knapp som heter "Första" på detta blockdiagram?
Blockdiagram som detta är det första steget till att hjälpa dig att räkna ut hur man skriver en Verilog program, som varje låda i diagrammet kommer hamna som en instans av en modul i din kod. Märke att vi har ett stort kvarter som innehåller ett antal mindre block; Vi kallar detta modulen "top". Modulen "top" är vad tar hand om ansluter alla interna komponenter i kretsen till fysiska ingångar och utgångar.
Inuti denna särskilda topp modul är två saker: en klocka avdelare och en AND-gate. Men märker klocka divider blocket innehåller också ett antal mindre block (DFFs). Vi inte har att skapa alla dessa DFFs i våra top modul; Vi kan skapa en separat klocka divider modul som innehåller alla DFFs och skapa en instans av den klocka avdelaren i våra top modul.
Som du hade kunnat gissa, måste vi också göra en DFF-modul som vi kan initiera ett antal gånger i klocka delaren. Detta tillåter oss att endast definierar beteendet för en D-Flip Flop en gång, därefter instansierar flera instanser av det DFF. Allt vi behöver göra i våra Verilog koden är ansluta varje instans av DFF till motsvarande portar (dvs ansluta dess in- och utgångar), men mer om modul instansiering senare.
Obs: Försök inte att kod blinkande LED projektet bara ännu; Det finns några saker vi behöver täcka.
Denna modul är att utsätta dig för modulär design; ser du varför jag kallar dessa tutorials "moduler"? Denna idé bör vara ingrodd i ditt sinne som du fortsätter att lära sig och använda Verilog.