Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Verilog

Verilog Essentials: Een beknopt overzicht

Alle behaviorale code wordt geschreven binnen module en endmodule. Wat je ook wilt ontwerpen, het gaat in een module blok. Het mag of mag geen poorten hebben - om signalen binnen te laten komen als input of te laten ontsnappen als output.

Module

De lege module in het voorbeeld heet testbench. Je kunt het noemen zoals je wilt, mits alfanumeriek en kan '_' bevatten.

module testbench; endmodule

Bekijk een andere module. Het heeft een paar signalen (d, clk, rstb) als inputs en q als output.

module dff (input d, clk, rstb, output q); endmodule

Datatypes

Nu we gezien hebben hoe een module eruitziet, kijken we wat er in een module kan, via de testbench-module. Er zijn primair twee datatypes in Verilog:

  • reg
  • wire
Een reg datatype houdt waarden vast als een variabele, terwijl een wire analoog is aan een elektrische draad die continu gedreven moet worden. Meestal wordt wire gebruikt om tussen modules en andere signalen te verbinden.

module testbench;
reg d; reg rst_b; reg clk; wire q;
endmodule

Toewijzingen

Verilog heeft drie basale blokken:

always @ (voorwaarde)altijd uitgevoerd wanneer voorwaarde voldaan is
initialwordt één keer uitgevoerd bij simulatiestart
assign [LHS] = [RHS]Waarde van LHS wordt bijgewerd wanneer RHS verandert

Enkele regels om te onthouden:

  • reg kan alleen in initial en always blokken toegewezen worden
  • wire kan alleen via assign statement een waarde krijgen
  • Als er meerdere statements in een initial/always blok zijn, moeten ze in begin .. end gewrapt worden

module testbench;
reg d; reg rst_b; reg clk; wire q;
initial begin
    d = 0; rst_b = 0; clk = 0; #100 $finish;
end
always begin
    #10 clk = ~clk;
end
endmodule

Let op uit het bovenstaande voorbeeld:

  • Omdat er meerdere regels voor initial blok zijn, worden begin en end gebruikt
  • Signalen d, rst_b, clk worden in initial-blok toegewezen, omdat ze type reg zijn
  • Code in initial-blok wordt uitgevoerd op 0ns, simulatiestart
  • Omdat er geen voorwaarde is voor always blok, loopt het als oneindige lus in C
  • # stelt tijdsvertraging voor. #10 vertelt simulator tijd met 10 eenheden voort te schrijden.
  • clk = ~clk; toggelt de klokwaarde, en door #10 ervoor, toggelt klok elke 10 tijdseenheden.
  • $finish is de manier om een simulatie te beëindigen. Hier loopt het 100 tijdseenheden en stopt.

Verilog

  1. Verilog beheersen: Complete tutorial voor digitale schakelingontwerp
  2. Verilog concatenatie beheersen: Een praktische gids
  3. Verilog-toewijzingen begrijpen: types, syntax en best practices
  4. Verilog Blocking vs. Non-Blocking: belangrijkste verschillen uitgelegd
  5. Verilog-functies beheersen voor efficiënt RTL-ontwerp
  6. Verilog Tasks begrijpen: Functions vs Tasks, Syntax en Gebruik
  7. Verilog Hiërarchische Referentie Scope: Naamconflicten in Modules en Blokken vermijden
  8. Verilog Clock Generator: Ontwerp & Implementatie Gids
  9. Verilog Math Functions beheersen voor efficiënt Hardware-ontwerp
  10. Verilog $timeformat beheersen: Precisie en Weergave-controle
  11. Verilog Timescales begrijpen en printen in elke Scope