Upload
vokhanh
View
218
Download
0
Embed Size (px)
Citation preview
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
Fachgebiet Rechnerarchitektur, Fachbereich Informatik, TU Darmstadt
Versionen 4/2004, 4/2005 M. Halbach, R. Hoffmann,4/2006 M. Halbach 4/2007, 10/2007, 4/2008, 3/2009 R. Hoffmann
Einführung in Verilog HDL
Technische Grundlagen der Informatik IISommersemester 2009
Version 3/2009
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-2
Inhalt: Verilog HDL
Hardware-Beschreibungssprachen
Syntax-Schreibweise
Beschreibungsarten
Konstanten und Variablen
Operatoren
Modul: Definition, Zuweisungen, Statements
Delay Control, Event Control
Verilog-Programmbeispiele
ANHANG 1: Vertiefungen
ANHANG 2: Simulation
ANHANG 3: Weitere Programmbeispiele
graue Farbe: Zusatzinformation für Fortgeschrittene
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-3
Hardware-Beschreibungssprachen
Zweck Spezifikation im Entwurfsprozeß
für den manuellen Entwurf automatische Hardware-Synthese
Simulation Dokumentation
des entworfenen Systems Kommunikation zwischen Software- und Hardware-Spezialisten Veranschaulichung von Hardware-Strukturen und Algorithmen in der
Lehre
Sprachen Frühe Sprachen
CDL: Computer Description Language) CHU ca. 1965 CASSANDRE: Mermet ca. 1970 HDL (Hardware-Description-Language), 1975-80 R. Hoffmann
VHDL (1980-85,IBM, TI, Intermetrics), VERILOG HDL(1984, Gateway Design Automation) SystemC, System Verilog
entnommen aus Werbebroschüren fürXilinx Spartan™-3E FPGAs, 2005 bzw.Altera Cyclone Series, August 2004
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-4
Eigenschaften von Hardware-Beschreibungssprachen
Beschreibungsarten strukturell (Komponenten mit ihren Verbindungen) algorithmisch (ablauforientiert)
Abstraktionsniveaus Schalter, Transistor, Wire Gatter, Komponenten Automaten Algorithmen (Funktionelle Ebene)
Low
High
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-5
Eigenschaften von Hardware-Beschreibungssprachen (2)
Parallelverarbeitung Grundprinzip: Alle Komponenten arbeiten gleichzeitig parallel parallele Prozesse synchrone/asynchrone Parallelität Parallele Übertragung von Signalwerten über Verbindungsleitungen im Zeitraster, mit Zeitverzögerungen
Hardware-Datentypen Signale, Wires Taktsignale synchrone Register, asynchrone Speicher und Latches Ereignisse (Flanken)
Datenformate, Signalwerte Bitvektoren, Bitmatrizen Mehrwertige Logik (0, 1, Hochohmig, Kurzschluss, Pullup, ...)
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-6
Verwendete Syntax-Ausdrücke
[…] optional (0 oder 1 mal)
{…} wiederhole beliebig oft (0 bis n mal)
(…) wiederhole mindestens einmal (1 bis n)
( ) normale Klammer-Zeichen
id Bezeichner
| mehrere Auswahlmöglichkeiten
::= Hilfsbezeichnerdefinition
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
Beschreibungsarten
Strukturbeschreibung und
Algorithmische Beschreibung,
am Beispiel eines Halbaddierers
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-8
Halbaddierer: Funktionsweise
Inputs: a, b
Outputs
Summe s
Übertrag c (carry)
a b c s
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0
a b
sc
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-9
Strukturbeschreibung mit Gatter-Bausteinen
module hadd3(a, b, c, s);input a, b;output c, s;
xor xor1(s, a, b);and and1(c, a, b);// Baustein aktueller Name (Verbindung)
endmodule
a b
sc
Kennzeichen: Verbindung expliziter Modul-Instanzen.
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-10
… mit logischen Operatoren
module hadd2(a, b, c, s);input a, b;output c, s;
assign s = a ^ b; // ^ exklusiv-oderassign c = a & b; // & und
endmodulea b
c s
Kennzeichen: Verbindung impliziter Modul-Instanzen.
Die Operatoren werden durch den Übersetzer durch primitive Moduln ersetzt.
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-11
… mit hochsprachlichen Operatoren
module hadd1(a, b, c, s);input a, b
output c, s; // sind hier implizit wire
assign {c,s} = a + b; // { , } Konkatenation
endmodule
HA
a b
sc
Kennzeichen: Verbindung impliziter Modul-Instanzen.
Die Operatoren durch den Übersetzer aufprimitive Moduln abgebildet. Dabei kann der hochsprachliche Operator auf einfachere Operatoren/Moduln übersetzt werden.
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-12
Algorithmische Beschreibung
auch bezeichnet als prozedurale / funktionale / Verhaltens – Beschreibung
module hadd1(a, b, c, s);input a, b
output c, s; // sind hier implizit wire
always @(a or b) // immer bei Änderung
{c,s} = a + b;
endmodule
Kennzeichen: Das Verhalten wird prozedural beschrieben.Vorstellung: Das Verhalten wird simuliert.
Bemerkung: wird auch als kombinatorischer always-Blockbezeichnet.
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-14
Konstanten
Zahlen
Zeichenketten , siehe Anhang
Parameter
Compilerdirektive
graue Farbe: Zusatzinformation für Fortgeschrittene
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-15
Zahlen, binär codiert
Ohne Festlegung der Bitbreite
Syntax: Basis Zahl Basis
'b (binär, 2)
'o (oktal, 8)
'd (dezimal, 10),
'h (hexadezimal, 16)
Mit Festlegung der Bitbreite
Syntax: Bitbreite Basis Zahl
'b0010
4'b10
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-16
Zahlen-Beispiele
'b00010 // binär
147 // dezimal
'h7FF // hexadezimal
'o422 // oktal
5'b10 // 5-bit binär → 00010
5'd3 // 5-bit dezimal
-5'b11 // negative 5-bit Binärzahl(2er Komplement) → 11101
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-17
Variablentypen
wire
wand, wor
reg (hat verschiedene Bedeutungen)
Hardwareunabhängige Datentypen
integer (z. B. für Zählschleifen)
real
time (für Zeitmarken)
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-18
Mögliche Wertefür wire, wand, wor, reg
0 logische Null (false)
1 logische Eins (true)
x undefiniert, unbekannt
z hochohmig (Tristate)
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-19
wire zur Datenweiterleitung
Nur zum Transport, keine Speicherung!
Zur Verbindung von Primitiven und Modulinstanzen
Eine Verbindungsleitung
wire a;
Leitungsbündel
wire [4:2] b;
Zusatzinfomation: wire mit Verzögerung
wire [1:0] #(2) wires_with_2_clocks_delay;
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-20
and, or
and ergibt
0 if mindestens eine 0
1 if beide Inputs 1
x sonst
or ergibt
1 if mindestens eine 1
0 if beide Inputs 0
x sonst
Tabellen dazu siehe Anhang
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-21
reg (mehrdeutig)
Vier mögliche Bedeutungen
1. (temp) Hilfsvariable, dient nur zur Berechung, hat keine physikalische Entsprechung, wird bei der Synthese wegoptimiert
2. (tempwire) zur prozeduralen Beschreibung von Schaltnetzen, verwendet anstelle von wire/assign
3. (memory) zur asynchronen Speicherung (entspricht Latch/RS-FF)
4. (sync) Synchrones Register
Wenn die Bedeutung nicht eindeutig klar ist, dann zusätzliche Kommentare verwenden!!
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-22
Bitvektoren und Bitmatrizen
Speicher oder Registersätze werden als Vektoren aus Registern deklariert
Deklaration
reg a; // 1 Bit breites Register
reg [7:0] b; // 8 Bit breites Reg. (Bit 7 = MSB)
reg [0:7] b; // 8 Bit breites Reg. (Bit 0 = MSB)
reg [7:0] d [0:10]; // 11 8-Bit-Register
reg c [0:15]; // 16 1-Bit-Register
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-24
Dyadische arithmetische Operatoren
+ Addition- Subtraktion* Multiplikation/ Division% Modulo
reg und wire: Operatoren werden vorzeichenlos interpretiert
im neuen Standard auch mit Vorzeichen definierbar
real und integer: mit Vorzeichen
Falls irgendein Bit eines Operanden undefiniert („x“) ist, ist der Wert des Gesamtergebnisses ebenfalls undefiniert!
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-25
Monadische arithmetische Operatoren
– Minus (Vorzeichenwechsel)
+Plus (Vorzeichen bleibt erhalten)
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-26
Vergleichsoperatoren
Ergebnis 0, 1 oder x
> größer>= größer oder gleich< kleiner <= kleiner oder gleich == gleich!= ungleich
Ergebnis 0 oder 1
=== bitweise identisch (auch x, z)!== mindestens ein Bit nicht identisch
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-27
Logische Operatoren für Abfragen
Für Operanden mit 1 Bit Breite (true/false)
! cond nichtcond1 && cond2 undcond1 || cond2 oder
Bedingte Wertberechnung
result = cond ? truevalue : falsevalue
// if cond=true then result = truevalue
// else result = falsevalue
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-28
Bitweise Verknüpfung
~ Negation (not)& und (and)| oder (or)^ exklusiv-oder (xor)~& nicht-und (nand)~| nicht-oder (nor)~^ oder ^~ gleich, Äquivalenz (xnor)
in Klammern stehen die Namen der entsprechenden Primitiven (Grund-Gatter-Bausteine)
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-29
Monadische Reduktion
Reduktion: alle Bits des Vektors X werden miteinander durch die Operation verknüpft, Ergebnis ist ein Bit
& A und (and)| A oder (or)^ A exklusiv-oder (xor)~& A nicht-und (nand)~| A nicht-oder (nor)~^ A gleich (xnor)
z. B. | 'b10001 1'b1
&b[2:0] b[2] & b[1] & b[0]
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-30
Shifts
x << n shift x nach links um n Bitsx >> n shift x nach rechts um n Bits
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-31
Konkatenation
{ , }
Aneinanderreihung von Bits oder Bitvektoren
{ a, b[2:1], c[9:3] }
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-32
Replikation
{ Rep-Anzahl { expr }}
statt {b, b, b} einfacher {3{b}}
z. B. sign-extension
B[15:0] = {{8{A[7]}} , A[7:0]}
Ergebnis: A7 A7 A7 A7 A7 A7 A7 A7 A7A6A5A4A3A2A1A0
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
Modul
Modul-DefinitionModul-InstanziierungParallele AusführungZuweisungen
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-34
Modul-Definition
Beispiel
module hadd2(a, b, c, s);input a, b;output c, s;
xor xor1(s, a, b); // assign s = a ^ b;
assign c = a & b;
endmodule
Syntaxmodule modulID ( [ portID {, portID} ] );{ input | output | inout [ [ range ] ]portID {, portID } ; }{ declaration } // Instanziierung von Moduln{ parallel_statement } // initial, always, assignendmodule
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-35
Modul-Instanziierung (Declaration)
Beispiele xor xor1(s, a, b), xor2(t, c, d);
hadd add1(.a(a), .s(sum));
// .formalerParam(aktuellerParam)
SyntaxmoduleID [ #( parameter { , parameter } ) ]
{ instance_name ( port_connections ) , }instance_name ( port_connections ) ;
port_connections ::= [ value ] { , [ value ] } |.port ( value ) {, .port ( value ) }
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-36
Parallele Ausführung allerParallel_Statements eines Moduls
initial sequential_statement
einmalig ausgeführtzur Initialisierung, für seq. Abläufe
always sequential_statement
(Endlos-)Schleife, meist Event-getriggert
assign wireID = expression ;
permanente Zuweisung (Verdrahtung)„continuous assignment“
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
Zuweisungen
continuous assignments (assign)
procedural assignments
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-38
continuous assignments: assign
Verwendung
Unmittelbare Weiterleitung von Signalwerten
Eingänge werden kontinuierlich ausgewertet und der Ausgang wird automatisch aktualisiert
dient der Beschreibung von Schaltnetzen (reine Kombinatorik)
z. B. assign out = in1 | in2;
assign [#delay] wireID = expression ;
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-39
Nur innerhalb „initial“- oder „always“-Blöcken für reg-Variablen zulässig
Zwei Formen
Blockierend, asynchron
regID = expression
Nicht-blockierend, synchron
regID <= expression
procedural assignments
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-40
procedural assignmentsBlockierend, asynchron
regID = expression
Blockierende Zuweisungen erfolgen nacheinander(in der durch den Ablauf vorgegebenen Reihenfolge)
a=3; b=7; a=b; b=a; (Ergebnis: a=b=7)
Anwendung
Zwischenspeichern von temporären Werten, die in der Hardware oftmals Signalen entsprechen.
Beachte: Die Kommentierung solcher reg-Variablen als Hilfsvariablen ist hilfreich für das Verständnis und die Dokumentation der Beschreibung. Dadurch wird die Konfusion mit synchronen Registern vermieden.
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-41
procedural assignmentsNicht-Blockierend, synchron
regID <= expression
Auswertung
(Masterphase) Alle rechten Seiten der Anweisungsgruppe werden quasi-parallel berechnet und zwischen gespeichert.
(Slavephase) Alle zwischen gepeicherten Werte werden quasi-parallel den Registern zugewiesen.
Implizit werden Hilfsvariablen reserviert. Die synchrone Arbeitsweise wird emuliert.
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-42
Beispiel: Vertauschen von Werten
always @(posedge clk) begina <= b;b <= a;
end
Beispiel:
Werte vor dem Takt: a=3, b=7
Werte nach dem Takt: a=7, b=3
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-43
Beispiel: JK-Flipflop
module jkff(clk, j, k, q, _q);
input clk, j, k;
output q, _q;
reg q; // syncreg
initial q = 1'b0;
always @(posedge clk)q <= (j & !q) | (!k & q);
assign _q = !q;
endmodule
_ _Q+ = J.Q + K.Q
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-45
Block
Beispielbegin: Schleife
integer i;for (i=0; i<5; i = i + 1)
…
end
Syntaxbegin [ : blkID { declaration } ]{ sequential_statement }end
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-46
Bedingte Ausführung: if, case
if ( expr )sequential_statement[ else sequential_statement ]
case | casex | casez ( expr )( expr { , expr } : sequential_statement )[ default: sequential_statement ]endcase
Es wird kein „break“ benötigt!
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-47
Beispiel case, 4-Kanal Multiplexer
module mux4_case(a, b, c, d, select, y, ena);input a, b, c, d, ena; input [1:0] select;output reg y; // tempwire// y ist Hilfsvariable, kein Hardware-Registeralways @(a, b, c, d, select) // bei Änderung von ...
if (ena)case (select)
0: y = a; 1: y = b;2: y = c; 3: y = d;
default: y = 1'bx; // undefinedendcase
else y = 1'bz; // hochohmigendmodule
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-48
Schleifen
forever sequential_statement
for ( assignment; condition_expression;assignment )sequential_statement
while ( condition_expression )sequential_statement
repeat ( amount_expression )sequential_statement
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-49
Timing Control
Delay Verzögerungszeit
Event Ereignis
Wait Warten auf Bedingung, s. Anhang
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-50
Delay Control
Beispiele
b = #8 a; a wird sofort ausgewertet, zwischengespeichert und nach 8 Zeiteinheiten zugewiesen
#8 b = a; erst wird 8 Zeiteinheiten gewartet, dann ausgewertet und zugewiesen
Syntax#delay sequential_statementregID = #delay expr;mit delay ::= number | ( expr )
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-51
Event Control
Ausführung erst nach dem Eintreffen eines Ereignisses
Ereignis:
Wertänderung von (input, inout, wire oder reg)
oder benannter Event
Am Modulbeginn Deklaration event eventID ;
Auslösen durch -> eventID
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-52
Event Control (2)
Warten auf Event, danach ausführen
expr auswerten, nach event zuweisen
Definition event
@ ( event { or event } ) sequential_statement
regID = @ ( event { or event } ) expr ;
event ::= Identifier |[ posedge | negedge ] expr
,
Beispiel: always@(posedge Clock) begin … end
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-54
Beispiele
Parity
Full Adder
Counter, synchron
Zustandsmaschine Ampel
weitere Beispiele s. Anhang 3
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-55
Modul Parity
module parity (x, odd, even);
input [8:0] x;
output odd, even;
assign odd = ^x; // Exor Reduktion
assign even = ~^x;
endmodule
9
x
odd
even
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-56
Testumgebung Parity
module testbed( );
reg [8:0] I; // Datenspeicher in Umgebung
parity test(I, odd, even); // Instanz
initial beginI=5; #25 I=2; #25; // Testablauf
end
initial #50 $finish; // nach 50 Zeiteinheiten Ende
endmodule
neu
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-57
Halbaddierer HA (Wdh.)
module hadd1(a, b, c, s);input a, b
output c, s; // Signale
assign {c,s} = a + b; // { , } Konkatenation
endmodule
HA
a b
sc
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-58
Volladdierer FA soll aus HAs zusammengesetzt werden
Eingabe drei Bits
Daten (a, b)
Carry-In-Bit (cin)
Ausgabe zwei Bits
Summenbit (s)
Carry-Out-Bit (cout)
FA
a b
scout
cin
HA, HA ?
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-59
Wiederverwendung von Modulen
module VolladdiererFA(a, b, cin, cout, s);
input a, b, cin;output cout, s;
wire s1; wire [1:0] c;
hadd2 a1(a, b, c[1], s1),a2(s1, cin, c[0], s);
assign cout = c[0] | c[1];
endmodule
HA
a b
HA
cin
scout
s1
c[1]
c[0]
FA
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-60
Synchroner Zähler
Eingabe
Clock
Reset
Ausgabe
Zählerzustand (Q), z. B. 2 Bit breit
neu
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-61
Modul Synchroner Zähler
module Counter(Reset, Clock, Q);
input Reset, Clock;
output [1:0] Q;
reg [1:0] Q;
initial Q = 1;
always @(posedge Clock)if (Reset) Q <= 0; else Q <= Q + 1;
endmodule
// output reg [1:0] Q
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-62
TestumgebungSynchroner Zähler
module testbed();reg Reset, Clock; // mem, asynwire [1:0] Q;Counter test (Reset, Clock, Q);initial
repeat (7) beginClock=0; #5 Clock=1; #5; // Taktgeneratorend
initial begin #2 Reset = 1; #10 Reset = 0; endinitial #80 $finish;
endmodule
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-63
Zustandsmaschine/-automat Ampel
module ampel(clk, schalte, rot, gelb, gruen);input clk, schalte; output rot, gelb, gruen;reg [2:0] state; initial state = 3'd0;always @(posedge clk) if (schalte)
case (state)3'b000: state <= 3'b010;3'b010: state <= 3'b101; 3'b101: state <= 3'b011; 3'b011: state <= 3'b000;default state <= 3'b000;endcase
assign {gruen, gelb} = state[2:1];assign rot = !state[0];
endmodule
000
010
101
011
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-64
Verilog 2001
Zusammenfassen von
input x; wire x; input wire x
output y; reg y; output reg y
Deklarationen der Parameter direkt in den Portlisten
module mm(input wire x, output reg y);
task tt(input wire x, ouput wire y);
function ff(input wire x);
Generate: Erzeugung regelmäßiger Strukturen
Sensitivitätsliste
always @(x1 or x2) always @(x1, x2)
Vorzeichenbehaftete Arithmetik: signed
Multidimensionale Felder
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-65
Weitere Informationen
IEEE Standard Verilog® Hardware Description
Language, IEEE Std 1364
Übersichtsblatt (teilweise BNF-Notation)
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-66
Kostenlose Programme
Simulation
Icarus Veriloghttp://sourceforge.net/projects/iverilog/http://icarus.com/eda/verilog/
GTKWavehttp://sourceforge.net/projects/gtkwave/
Synthese
Altera Quartus Web Editionhttp://www.altera.com/
Xilinx ISEhttp://www.xilinx.com/
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-67
Ausgabe mit Icarus und GTKWave
initial begin$dumpfile("ausgabe.vcd");$dumpvars(0);
end
Aufruf:
iverilog meine_datei.v
vvp a.out
winwave ausgabe.vcd (Windows)
gtkwave ausgabe.vcd (X)
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-68
ANHANG 1: Vertiefungen
Konstanten: Zeichenketten
Parameter Statement
Compilerdirektive
Wired And/Or
Vergleichsoperatoren "a == b" und "a === b"
case, casex, casez
Block- oder Taskabbruch
wait, fork, expliziter event
wire-Verzögerungen
Unterprogramme: Task, Function
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-69
Zeichenketten
Durch doppelte Anführungszeichen eingeschlossen
z. B. "Text"
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-70
Parameter Statement
Zuordnung von Konstanten zu symbolischen Namen
parameter identifier = constant_expression ;
Veränderung im aufrufenden Modul mit
moduleID #( alle parameter ) instanz;
defparam instance.identifier =constant_expression ;
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-71
Parametrisierung
module addierer(a, b, s);parameter n = 8;input [n – 1 : 0] a, b;output [n – 1 : 0] s;assign s = a + b;
endmodule
module multiadd(a, b, c, s);input [3 : 0] a, b, c;output [3 : 0] s;wire [3 : 0] s1;addierer #(4) x(a, b, s1), y(c, s1, s);
endmodule
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-72
Compilerdirektive
Deklaration mit `define name wert
Verwendung mit `name(wird ersetzt durch wert)
z. B.
`define schwelle 8
if (zaehler == `schwelle) …
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-73
and, or
and ergibt
0 if mindestens eine 0
1 if beide 1
x sonst
or ergibt
1 if mindestens eine 1
0 if beide 0
x sonst
and 0 1 x z
0 0 0 0 0
1 0 1 x x
x 0 x x x
z 0 x x x
or 1 0 x z
1 1 1 1 1
0 1 0 x x
x 1 x x x
z 1 x x x
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-74
wand, wor
„wired and“ und „wired or“
für Netze mit mehreren Quellen
wand 0 1 x z
0 0 0 0 0
1 0 1 x 1
x 0 x x x
z 0 1 x z
wor 0 1 x z
0 0 1 x 0
1 1 1 1 1
x x 1 x x
z 0 1 x z
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-75
VergleichsoperatorenErgebnisse von "a == b" und "a === b"
a b == ===
0 0 1 1
0 1 0 0
0 'bx 'bx 0
0 'bz 'bx 0
1 0 0 0
1 1 1 1
1 'bx 'bx 0
1 'bz 'bx 0
a b == ===
'bx 0 'bx 0
'bx 1 'bx 0
'bx 'bx 'bx 1
'bx 'bz 'bx 0
'bz 0 'bx 0
'bz 1 'bx 0
'bz 'bx 'bx 0
'bz 'bz 'bx 1
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-76
case, casex, casez
case
exakter bitweiser Vergleich inkl. 'x' und 'z'-Werten
casez
'z'-Werte in der case- und den Vergleichs-Expressions werden als „don't care“ behandelt
casex
'z' und 'x'-Werte werden als „don't care“ behandelt
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-77
Mögliche Werte bei case/casex/casez
die aufgeführten Werte werden als Übereinstimmung gewertet
angegeben ist nur der niedrigste Standard,z. B. bei Icarus ist bei case auch x und z möglich
wenn keine Bedingung zutrifft, wird der default-Teil verwendet
bei expr case casez casex
0 0 0, z 0, x, z
1 1 1, z 1, x, z
x 0, 1, x, z
z 0, 1, x, z 0, 1, x, z
? 0, 1, x, z
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-78
Block- oder Taskabbruch
disable taskID | blockID ;
z. B.
initial begin: clock_loopclock = 0; forever begin
#5 clock=1; #5 clock=0;end end
initial #350 disable clock_loop
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-79
Wait Statement
Erst wenn Auswertung der Bedingung den Wert 'true' ergibt, erfolgt Ausführung
wait ( expr ) sequential_statement
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-80
fork
Sequentielle Blöcke parallel durchführen
Syntax: fork [ : blkID { declaration } ]{ sequential_statement }
join
z. B.
fork // Aufspaltung in 2 threads
begin … end // thread 1
begin … end // thread 2
join // Zusammenführung
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
Unterprogramme
Tasks und Funktionen
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-84
Unterprogramme
Task
Ersatz für prozedurale Anweisungen
Function
Ersatz für einen Ausdruck (expression)
task taskID ;{ input | output | inout [ [ range ] ]
portID { , portID } } ;{ declaration }{ sequential_statement }
endtask
Aufruf: taskID [ ( expr { , expr } ) ] ;
function [ [ range ] | type ] // default: 1 BitfunctionID ;
( input [ [ range ] ] paramID ; ){ declarations }begin
{ sequential_statement |functionID = expr ; }
endendfunction
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-85
Task
Aufruf
innerhalb von always-, initial-Block
nicht innerhalb von assign
Ein-/Ausgabe-Parameter
gleiche Reihenfolge beim Aufruf wie in der Definition
Rekursiver Aufruf ist möglich, jedoch keine automatische Speicherverwaltung (d. h. nur statische Variablen)
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-86
Beispiel Task
Definition: Addition
task add_values;
output c_out;output [3:0] sum;input [3:0] data_a, data_b;input c_in;
begin #5{ c_out, sum } <= data_a + (data_b + c_in);
end
endtask
Aufruf
add_values(cout, s, da, db, cin);
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-87
Function
überall verwendbar
auch im assign-Statement
Deklaration: f(inputs)
inputs, Parameterübergabe: by value
Rückgabe über Zuweisung an Funktionsnamen f
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-88
Einschränkungen für Functions
Function soll in reine Logikfunktion umsetzbar sein
Ausgabe muss „sofort“ verfügbar sein
deshalb nicht erlaubt:
delay control (#)
event control (@)
wait
Rekursion
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-89
Beispiel Function
function [3:0] max;
input [3:0] op_a, op_b;
beginmax = (op_a >= op_b)? op_a : op_b;
end
endfunction
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
ANHANG 2: Simulation
Einstellungen
Ausgabemöglichkeiten
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-91
Testumgebung
wird für die Simulation benötigt, nicht für die Synthese
enthält den zu testenden Modul
enthält Taktgenerator, z.B.
reg clk; initial clk = 1'b1; always #1 clk = !clk;
enthält
Hilfsregister
Initialisierungen
Simulationsablauf (Testablauf) mit Beendigung ($finish)
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-92
Zeiteinheit, Simulation beenden
`timescale simul_zeiteinheit / anzeigetakt
z. B.
`timescale 1ns / 1ns
Verzögerung #2 bedeutet dann 2 ns
$finish
z. B.
initial #500 $finish;
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-93
Ausgabe auf die Konsole
$write ( formatstring { , varID } )
$display ( formatstring { , varID } )
wie $write, mit zusätzlichem Zeilenende
$monitor ( formatstring { , varID } )
bei Änderung einer Variablen erfolgt eine Ausgabe
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-94
Beispiele
Beispiel:$write(" AC hat den Wert %h", ac);
Beobachtung des Signals data
always @(data)$display("Wertaenderung von data: %0b (@%0t) ",
data, $time);
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-95
formatstring
ähnlich wie in C mit %
%b display in binary format
%c display in ASCII character format
%d display in decimal format
%h display in hex format
%o display in octal format
%s display in string format
%t display in time format
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-96
Längenangabe bei formatstring
Ohne Längenangabe
z. B. %b, entsprechend Bitbreite (rechtsbündig)
00101 00101
mit Längenangabe 0
z. B. %0b, linksbündig ohne führende Nullen
00101 101
mit Längenangabe größer Bitbreite: zusätzliche Leerzeichen
z. B. %12b
00101 _______00101
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-97
Externe Daten einlesen
$readmemb("Dateiname_binär",memory [, startadresse [, endadresse]])
$readmemh("Dateiname_hexadezimal",memory [, startadresse [, endadresse]])
Dateiinhalt:
je Adresse ein Zahlenwert der angegebenen Basis
mit Leerzeichen oder Zeilenumbruch voneinander getrennt
Anzahl Einträge muss stimmen!
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-98
Beispiel: Externe Daten einlesen
Verilog-Fragment
reg [7:0] mem [1:5];initial $readmemh("init.txt", mem, 1, 3);
Dateiinhalt init.txt
9 8 4
Ergebnis
mem[1] = 9, mem[2] = 8, mem[3] = 4
mem[4] und mem[5] sind nicht initialisiert
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-99
Datenänderung aufzeichnen
$dumpfile("dateiname.vcd");$dumpvars(level);$dumpon; $dumpoff;mit level ::= 0 | 1
level = 1
nur Variablen des aktuellen Moduls protokollieren
level = 0
alle Variablen (eigene und auch untergeordnete Module) protokollieren
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
ANHANG 3: Weitere Beispiele
Vorwärts/Rückwärts-Zähler
Arithmetic and Logical Unit (ALU) mit Test-Umgebung (FSM)
8-Bit-Tri-State-Bus
Beschreibung einer Volladdierer-Kette
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-101
Vorwärts/Rückwärts-Zähler
Eingabe
Clock (Takt)
Reset (auf Null setzen)
Incr (erhöhe um eins)
Decr (verringere um eins)
Ausgabe
2-Bit-Wert (Z)
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-102
ModulVorwärts/Rückwärts-Zähler
module Counter(Clock, Reset, Incr, Decr, Z);
input Clock, Reset, Incr, Decr;output reg [1:0] Z; // syncreg mit output
always @(posedge Clock) beginif (Reset) Z <= 0;if (Incr) Z <= Z + 1;if (Decr) Z <= Z – 1;
end
endmodule
neu
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-103
Testumgebung Vorwärts/Rückwärts-Zähler
module testbed();
reg Clock, Reset, Incr, Decr;wire [1:0] Z;Counter test(Clock, Reset, Incr, Decr, Z);
initial Clock=0;
always #1 Clock=~Clock;
initial #16 $finish;
initial … // Reset, Incr, Decr: nächste Folie
endmodule
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-104
ZeitdiagrammVorwärts/Rückwärts-Zähler
hier wird Decr interpretiert
initial begin#0 Reset=1; Incr=0; Decr=0;#2 Reset=0; Incr=1; // zählen#4 Decr=1; // Achtung auf die Konfliktmöglichkeit!#2 Incr=0; Decr=1; // … unterschiedliche Interpretationen!end
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-105
Vorwärts/Rückwärts-Zählermit Konfliktauflösung
module Counter(Clock, Reset, Incr, Decr, Z);
input Clock, Reset, Incr, Decr;output [1:0] Z;reg [1:0] Z;
initial Z = 0;
always @(posedge Clock) beginif (Reset) Z <= 0; elseif (Incr) Z <= Z+1; elseif (Decr) Z <= Z-1;
end
endmodule
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-106
Arithmetic and Logical Unit (ALU)
Dateneingänge a, b
Ergebnis y
Operation op
1: y = a
2: y = nand (a, b)
sonst: y = 0
op
a b
y
8 8
2
8
ALU
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-107
Definition der ALU
module alutype(op, a, b, y);
input [1:0] op; //alu functioninput [7:0] a,b;output [7:0] y;
assign y = (op == 1) ? a :(op == 2) ? ~(a & b) : 0;
endmodule
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-108
Test-Umgebung
Aufgabe: alle möglichen ALU-Operationen testen
Input-Operanden
ALUop
a b
y
alu
ra rb
ry
alutype
y:wire
rop
clock
Steuerwerk
state
SteuersignaleMikrooperationen
stop
Test-Umgebung stwrw
sync. Register
Ergebnis
FSM
Operation
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-109
Test-Umgebung: Bausteine und Taktgenerator
module stwrw(); reg [1:0] state;
reg [7:0] ra, rb, ry;wire [7:0] y;reg [1:0] rop;reg stop;
reg clock; // boole
alutype alu(rop, ra, rb, y);
initial begin clock = 0; stop = 0; end
initial #5 repeat (40) #5 clock = !clock;
initial wait (stop) @(posedge clock) $finish;
ALUop
a b
y
alu
ra rb
ry
alutype
y:wire
rop
clock
Steuerwerk
state
SteuersignaleMikrooperationen
stop
Test-Umgebung stwrw
sync. Register
Ergebnis
FSM
Operation
ALUop
a b
y
alu
ra rb
ry
alutype
y:wire
rop
clock
Steuerwerk
state
SteuersignaleMikrooperationen
stop
Test-Umgebung stwrw
sync. Register
Ergebnis
FSM
Operation
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-110
Test-Umgebung: Zustandsautomat (FSM)
initial state = 0; always @(posedge clock) case (state)
0: beginrop<=0; ry<=0; state <= 1;ra <= 2; rb <= ~0; end
1: beginrop<=1; ry<=y; state<= 2; end
2: beginrop<=2; ry<=y; state<= 3; end
3: beginrop<=0; ry<=y; state<= 0; stop<= 1; end
endcase
endmodule
0
1
2
3
rop<=0; ry<=0; ra <= 2; rb <= ~0
rop<=1; ry<=y
rop<=2; ry<=y
rop<=0; ry<=y; stop<= 1
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-111
Die Zustände (Post- und Preconditions)
0
1
2
3
rop<=0; ry<=0; ra <= 2; rb <= ~0
rop<=1; ry<=y
rop<=2; ry<=y
rop<=0; ry<=y; stop<= 1
rop=0: y=0ry=0ra=2rb=11..1rop=1: y=ra=2
ry=0ra=2rb=11..1
rop=2: y=nand(ra,rb)=11..101ry=2ra=2rb=11..1
rop=0: y=0ry=11..101ra=2rb=11..1stop=1
rop=x: y=xry=xra=xrb=xstop=0
x = undefined
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-112
Simulation (Test)
0ns 10ns 20ns 30ns 40ns 50ns
stwrw.state
stwrw.ra
stwrw.rb
stwrw.ry
stwrw.y
stwrw.rop
stwrw.clock
stwrw.stop
0 1 2 3 0
2
FF
0 2 FD
0 2 FD 0
0 1 2 0
stop=0 rop=0: y=0ry=0ra=2rb=11..1
rop=1: y=ra=2ry=0ra=2rb=11..1
rop=2: y=11..101
ry=2ra=2rb=11..1
rop=0: y=0ry=11..101ra=2rb=11..1stop=1
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-113
Beispiel 8-Bit-Tri-State-Bus
module bustreiber(bus, send, dout, out);
inout [7:0] bus;
input send;
input [7:0] dout;
output [7:0] din;
assign bus = send? dout : 8'bzzzzzzzz;
assign din = bus;
endmodule
send
dout
din bus
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-114
Beschreibung einer Volladierer-Kette
Volladdierer aus Primitiven
Vier-Bit-Addierer, aus 4 FA
Generierung von Hardware-Strukturen
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-115
Modul Volladdierer aus Primitiven
module fulladder(sum, c_out, x, y, c_in);
output sum, c_out;input x, y, c_in;wire a, b, c;
xor (a, x, y); // bei den vor-xor (sum, a, c_in); // definierten Gatter-and (b, x, y); // primitiven sindand (c, a, c_in); // keine Bezeichneror (c_out, c, b); // notwendig
endmodule
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-116
Vier-Bit-Addierer, aus 4 FA
module FourBitAdder (sum, c_out, x, y, c_in);
output [3:0] sum;output c_out;input [3:0] x, y;input c_in;wire c1, c2, c3;
fulladder fa0(sum[0], c1, x[0], y[0], c_in);fulladder fa1(sum[1], c2, x[1], y[1], c1);fulladder fa2(sum[2], c3, x[2], y[2], c2);fulladder fa3(sum[3], c_out, x[3], y[3], c3);
endmodule
Tech
n.
Gru
ndla
gen d
er
Info
rmatik 2
, SS 0
9,
R. H
offm
ann, TU
D
V-117
Generierung von Hardware-Strukturen
module NBitAdder #(parameter n = 4)(input [n : 1] a, input [n : 1] b, output c, output [n : 1] s);
wire [n : 0] carry;
assign carry[0] = 0;
generate genvar i;for (i = 1; i <= n; i = i + 1) begin: fulladder_chain
fulladder fa(a[i], b[i], carry[i – 1], carry[i], s[i]);
end
endgenerate
assign c = carry[n];
endmodule