Verilog - In einer Nussschale
Der gesamte Verhaltenscode ist in module geschrieben und endmodule . Welches digitale Design Sie auch immer erstellen möchten, es passt in module Block. Es können Ports definiert sein oder nicht - erlauben Sie Signalen, in den Block als input einzutreten oder entkomme dem Block als output .
Modul
Das leere Modul im Beispiel unten heißt testbench . Sie können es beliebig benennen, außer dass es alphanumerisch sein sollte und '_' enthalten darf.
module testbench;
endmodule
Schauen wir uns ein anderes Modul an. Es hat ein paar Signale (d, clk, rstb ) als Eingaben deklariert und q als Ausgabe deklariert.
module dff (input d,
clk,
rstb,
output q);
endmodule
Datentypen
Nachdem wir nun gesehen haben, wie ein Modul aussieht, sehen wir uns an, was in ein Modul gesteckt werden kann, indem wir uns das Testbench-Modul noch einmal ansehen. Es gibt hauptsächlich zwei Arten von Datentypen in Verilog:
- reg
- Draht
reg Der Datentyp wird verwendet, um Werte wie eine Variable festzuhalten, während ein wire ist nur analog zu einem elektrischen Draht, der kontinuierlich angetrieben werden muss. Also typischerweise wire wird verwendet, um zwischen mehreren Modulen und anderen Signalen zu verbinden.
module testbench;
reg d;
reg rst_b;
reg clk;
wire q;
endmodule
Aufgaben
Verilog hat drei grundlegende Blöcke:
always @ (Bedingung ) | wird immer ausgeführt, wenn die Bedingung erfüllt ist |
initial | wird nur einmal ausgeführt, wenn die Simulation beginnt |
assign [LHS] =[RHS] | Der LHS-Wert wird aktualisiert, wenn sich die RHS ändert |
Beim Schreiben von Verilog sind einige Regeln zu beachten:
regkann nur ininitialzugewiesen werden undalwaysBlöckewirekann nur überassignmit einem Wert belegt werden Erklärung- Wenn es mehrere Anweisungen in einem initial/always gibt Block, sollten sie in
begin .. endeingeschlossen werden
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
Hinweis Folgendes aus dem oben gezeigten Beispiel:
- Da es mehrere Zeilen für
initialgibt Blockieren, beginnen und Ende verwendet werden - Die Signale d, rst_b und clk werden innerhalb eines Anfangsblocks zugewiesen, da sie vom Typ
regsind - Code innerhalb des Anfangsblocks wird bei 0ns ausgeführt, d. h. Beginn der Simulation
- Da es keine Bedingung für
alwaysgibt Block, läuft es wie eine Endlosschleife in C - # wird verwendet, um die Zeitverzögerung darzustellen. #10 weist den Simulator an, die Simulationszeit um 10 Einheiten vorzuziehen.
clk = ~clk;wird den Wert der Uhr umschalten, und weil #10 vor die Anweisung gesetzt wird, wird die Uhr alle 10 Zeiteinheiten umgeschaltet.$finishist der Weg, um eine Simulation zu beenden. In diesem Fall wird es für 100 Zeiteinheiten ausgeführt und beendet.
Verilog