Verilog-Zuweisungsanweisung
Signale vom Typ wire
oder ein ähnlicher wire-artiger Datentyp erfordert die kontinuierliche Zuweisung eines Wertes. Stellen Sie sich zum Beispiel einen elektrischen Draht vor, der zum Verbinden von Teilen auf einem Steckbrett verwendet wird. Solange die +5V-Batterie an einem Ende des Kabels anliegt, erhält die am anderen Ende des Kabels angeschlossene Komponente die erforderliche Spannung.
In Verilog wird dieses Konzept durch die assign
realisiert Anweisung wo jeder wire
oder andere ähnliche drahtähnliche Datentypen können kontinuierlich mit einem Wert angesteuert werden. Der Wert kann entweder eine Konstante oder ein Ausdruck sein, der aus einer Gruppe von Signalen besteht.
Syntax zuweisen
Die Zuweisungssyntax beginnt mit dem Schlüsselwort assign
gefolgt vom Signalnamen, der entweder ein einzelnes Signal oder eine Verkettung verschiedener Signalnetze sein kann. Die Antriebsstärke und Verzögerung sind optional und werden hauptsächlich für die Datenflussmodellierung verwendet, anstatt sie in echte Hardware zu synthetisieren. Der Ausdruck oder das Signal auf der rechten Seite wird ausgewertet und dem Netz oder dem Ausdruck von Netzen auf der linken Seite zugeordnet.
assign <net_expression> = [drive_strength] [delay] <expression of different signals or constant value>
Verzögerungswerte sind nützlich, um Verzögerungen für Gates anzugeben, und werden verwendet, um das Timing-Verhalten in echter Hardware zu modellieren, da der Wert vorschreibt, wann dem Netz der ausgewertete Wert zugewiesen werden soll.
Regeln
Bei der Verwendung eines assign
sind einige Regeln zu beachten Anweisung:
- LHS sollte immer ein Skalar- oder Vektornetz oder eine Verkettung von Skalar- oder Vektornetzen sein und niemals ein Skalar- oder Vektorregister.
- RHS kann Skalar- oder Vektorregister und Funktionsaufrufe enthalten.
- Wann immer ein Operand auf der rechten Seite seinen Wert ändert, wird die linke Seite mit dem neuen Wert aktualisiert.
assign
Anweisungen werden auch fortlaufende Zuweisungen genannt und sind immer aktiv
Beispiel #1
Im folgenden Beispiel wird ein aufgerufenes Netz kontinuierlich durch einen Ausdruck von Signalen angesteuert. i1 und i2 mit dem logischen UND &
den Ausdruck bilden.
Wenn die Drähte stattdessen in Ports umgewandelt und synthetisiert werden, erhalten wir nach der Synthese ein RTL-Schema wie das unten gezeigte.
Kontinuierliche Zuweisungsanweisung kann verwendet werden, um kombinatorische Gatter in Verilog darzustellen.
Beispiel Nr. 2
Das unten gezeigte Modul nimmt zwei Eingaben und verwendet einen assign
-Anweisung zum Ansteuern der Ausgabe z mit Teilauswahl und Mehrfachbitverkettungen. Behandle jeden Fall als einzigen Code im Modul, sonst viele assign
Anweisungen auf demselben Signal machen die Ausgabe definitiv zu X.
module xyz (input [3:0] x, // x is a 4-bit vector net
input y, // y is a scalar net (1-bit)
output [4:0] z ); // z is a 5-bit vector net
wire [1:0] a;
wire b;
// Assume one of the following assignments are chosen in real design
// If x='hC and y='h1 let us see the value of z
// Case #1: 4-bits of x and 1 bit of y is concatenated to get a 5-bit net
// and is assigned to the 5-bit nets of z. So value of z='b11001 or z='h19
assign z = {x, y};
// Case #2: 4-bits of x and 1 bit of y is concatenated to get a 5-bit net
// and is assigned to selected 3-bits of net z. Remaining 2 bits of z remains
// undriven and will be high-imp. So value of z='bZ001Z
assign z[3:1] = {x, y};
// Case #3: The same statement is used but now bit4 of z is driven with a constant
// value of 1. Now z = 'b1001Z because only bit0 remains undriven
assign z[3:1] = {x, y};
assign z[4] = 1;
// Case #4: Assume bit3 is driven instead, but now there are two drivers for bit3,
// and both are driving the same value of 0. So there should be no contention and
// value of z = 'bZ001Z
assign z[3:1] = {x, y};
assign z[3] = 0;
// Case #5: Assume bit3 is instead driven with value 1, so now there are two drivers
// with different values, where the first line is driven with the value of X which
// at the time is 0 and the second assignment where it is driven with value 1, so
// now it becomes unknown which will win. So z='bZX01Z
assign z[3:1] = {x, y};
assign z[3] = 1;
// Case #6: Partial selection of operands on RHS is also possible and say only 2-bits
// are chosen from x, then z = 'b00001 because z[4:3] will be driven with 0
assign z = {x[1:0], y};
// Case #7: Say we explicitly assign only 3-bits of z and leave remaining unconnected
// then z = 'bZZ001
assign z[2:0] = {x[1:0], y};
// Case #8: Same variable can be used multiple times as well and z = 'b00111
// 3{y} is the same as {y, y, y}
assign z = {3{y}};
// Case #9: LHS can also be concatenated: a is 2-bit vector and b is scalar
// RHS is evaluated to 11001 and LHS is 3-bit wide so first 3 bits from LSB of RHS
// will be assigned to LHS. So a = 'b00 and b ='b1
assign {a, b} = {x, y};
// Case #10: If we reverse order on LHS keeping RHS same, we get a = 'b01 and b='b0
assign {a, b} = {x, y};
endmodule
Reg-Variablen zuweisen
Es ist illegal, reg
zu fahren oder zuzuweisen Geben Sie Variablen mit einem assign
ein Aussage. Das liegt daran, dass ein reg
Variable kann Daten speichern und muss nicht kontinuierlich angesteuert werden. reg
Signale können nur in Verfahrensblöcken wie initial
angesteuert werden und always
.
Implizite kontinuierliche Zuweisung
Wenn ein assign
-Anweisung wird verwendet, um dem gegebenen Netz einen Wert zuzuweisen, sie wird explizit genannt Abtretung. Verilog erlaubt auch eine Zuweisung, wenn das Netz deklariert wird, und wird implizit genannt Aufgabe.
wire [1:0] a;
assign a = x & y; // Explicit assignment
wire [1:0] a = x & y; // Implicit assignment
Kombinatorisches Logikdesign
Betrachten Sie die folgende digitale Schaltung aus kombinatorischen Gattern und dem entsprechenden Verilog-Code.
Die kombinatorische Logik erfordert, dass die Eingänge kontinuierlich angesteuert werden, um den Ausgang aufrechtzuerhalten, im Gegensatz zu sequentiellen Elementen wie Flip-Flops, bei denen der Wert am Rand einer Uhr erfasst und gespeichert wird. Also eine assign
Die Anweisung erfüllt den Zweck gut, da die Ausgabe o immer dann aktualisiert wird, wenn sich eine der Eingaben auf der rechten Seite ändert.
// This module takes four inputs and performs a boolean
// operation and assigns output to o. The combinational
// logic is realized using assign statement.
module combo ( input a, b, c, d,
output o);
assign o = ~((a & b) | c ^ d);
endmodule
Hardware-Schema
Nach der Ausarbeitung und Synthese des Designs sehen wir eine kombinatorische Schaltung, die sich genauso verhalten würde, wie sie von assign
modelliert wird Erklärung.
Sehen Sie, dass das Signal o immer dann 1 wird, wenn der kombinatorische Ausdruck auf der RHS wahr wird. In ähnlicher Weise wird o zu 0, wenn RHS falsch ist. Ausgang o ist X von 0 ns bis 10 ns, weil Eingänge während der gleichen Zeit X sind.
Klicken Sie hier für eine Diashow mit Simulationsbeispiel !
Verilog