Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Verilog

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:

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

  1. C#-switch-Anweisung
  2. C# break-Anweisung
  3. C#-Continue-Anweisung
  4. Verilog-Verkettung
  5. Verilog-Aufgaben
  6. Verilog-Blockierung und Nicht-Blockierung
  7. Verilog-Funktionen
  8. Verilog-Aufgabe
  9. Verilog-Taktgenerator
  10. Verilog Math-Funktionen