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

Verilog-Skalar und -Vektor

Verilog muss sowohl einzelne Bits als auch Gruppen von Bits darstellen. Beispielsweise ist ein sequentielles Einzelbitelement ein Flip-Flop. Ein sequentielles 16-Bit-Element ist jedoch ein Register, das 16 Bits aufnehmen kann. Zu diesem Zweck hat Verilog Skalar und Vektor Netze und Variablen.

Skalar und Vektor

Ein Netz oder reg Deklaration ohne Bereichsangabe wird als 1 Bit breit angesehen und ist ein Skalar . Wenn ein Bereich angegeben ist, dann das Netz oder reg wird zu einer Multibit-Entität, die als Vektor bekannt ist .


  
  
	wire 	    o_nor;           // single bit scalar net
	wire [7:0]  o_flop;          // 8-bit vector net
	reg         parity;          // single bit scalar variable
	reg  [31:0] addr;            // 32 bit vector variable to store address

  

Der Bereich gibt die Möglichkeit, einzelne Bits in einem Vektor zu adressieren. Das höchstwertige Bit des Vektors sollte als linker Wert im Bereich angegeben werden, während das niedrigstwertige Bit des Vektors rechts angegeben werden sollte.

  
  
	wire  [msb:lsb]   name;
	integer           my_msb;
	
	wire [15:0]        priority;      // msb = 15, lsb = 0
	wire [my_msb: 2]   prior;         // illegal

  

Im obigen Beispiel wird ein 16 Bit breites Netz namens Priorität erstellt. Beachten Sie, dass die msb und lsb sollte ein konstanter Ausdruck sein und kann nicht durch eine Variable ersetzt werden. Aber sie können jeden ganzzahligen Wert haben - positiv, negativ oder null; und das lsb Der Wert kann größer, gleich oder kleiner als der msb-Wert sein.

Bit-Auswahl

Jedes Bit in einer vektorisierten Variablen kann einzeln ausgewählt und wie unten gezeigt einem neuen Wert zugewiesen werden. Dies wird als Bitauswahl bezeichnet . Wenn die Bitauswahl außerhalb der Grenzen liegt oder die Bitauswahl x ist oder z , dann ist der zurückgegebene Wert x .

  
  
	reg [7:0]      addr;         // 8-bit reg variable [7, 6, 5, 4, 3, 2, 1, 0]
	
	addr [0] = 1;                // assign 1 to bit 0 of addr
	addr [3] = 0;                // assign 0 to bit 3 of addr
	addr [8] = 1;                // illegal : bit8  does not exist in addr

  

Teilauswahl

Eine Reihe zusammenhängender Bits kann ausgewählt werden und wird als Teilauswahl bezeichnet . Es gibt zwei Arten von Teilauswahlen, eine mit einer konstanten Teilauswahl und eine andere mit einer indizierten Teilauswahl.

  
  
	reg [31:0]    addr;
	
	addr [23:16] = 8'h23;         // bits 23 to 16 will be replaced by the new value 'h23 -> constant part-select

  

Eine variable Teilauswahl ermöglicht eine effektive Verwendung in Schleifen, um Teile des Vektors auszuwählen. Obwohl das Startbit variiert werden kann, muss die Breite konstant sein.

[<start_bit> +: <width>]     // part-select increments from start-bit
[<start_bit> -: <width>]     // part-select decrements from start-bit
  
  
module des;
  reg [31:0]  data;
  int         i;
  
  initial begin
    data = 32'hFACE_CAFE;
    for (i = 0; i < 4; i++) begin
      $display ("data[8*%0d +: 8] = 0x%0h", i, data[8*i +: 8]);
    end
    
    $display ("data[7:0]   = 0x%0h", data[7:0]);
    $display ("data[15:8]  = 0x%0h", data[15:8]);
    $display ("data[23:16] = 0x%0h", data[23:16]);
    $display ("data[31:24] = 0x%0h", data[31:24]);
  end
  
endmodule

  
Simulationsprotokoll
ncsim> run
data[8*0 +: 8] = 0xfe              // ~ data [8*0+8 : 8*0]
data[8*1 +: 8] = 0xca              // ~ data [8*1+8 : 8*1]
data[8*2 +: 8] = 0xce              // ~ data [8*2+8 : 8*2]
data[8*3 +: 8] = 0xfa              // ~ data [8*3+8 : 8*3]

data[7:0]   = 0xfe
data[15:8]  = 0xca
data[23:16] = 0xce
data[31:24] = 0xfa
ncsim: *W,RNQUIE: Simulation is complete.

Häufige Fehler

  
  
module tb;
   reg [15:0]    data;
   
   initial begin
      $display ("data[0:9] = 0x%0h", data[0:9]);   // Error : Reversed part-select index expression ordering
   end
endmodule

  

Verilog

  1. Verilog-Tutorial
  2. Verilog-Verkettung
  3. Verilog-Aufgaben
  4. Verilog-Blockierung und Nicht-Blockierung
  5. Verilog-Funktionen
  6. Verilog-Aufgabe
  7. Verilog Inter- und Intra-Auftragsverzögerung
  8. Verilog-Taktgenerator
  9. Verilog Math-Funktionen
  10. Verilog-Zeitformat