Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Verilog

Scalaire et vecteur Verilog

Verilog doit représenter des bits individuels ainsi que des groupes de bits. Par exemple, un élément séquentiel à un seul bit est une bascule. Or un élément séquentiel 16 bits est un registre pouvant contenir 16 bits. A cet effet, Verilog a scalaire et vecteur filets et variables.

Scalaire et Vecteur

Un filet ou reg la déclaration sans spécification de plage est considérée comme ayant une largeur de 1 bit et est un scalaire . Si une plage est spécifiée, alors le net ou reg devient une entité multibit connue sous le nom de vecteur .


  
  
	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

  

La plage donne la possibilité d'adresser des bits individuels dans un vecteur. Le bit le plus significatif du vecteur doit être spécifié comme valeur de gauche dans la plage tandis que le bit le moins significatif du vecteur doit être spécifié sur la droite.

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

  

Un réseau de 16 bits appelé priorité sera créé dans l'exemple ci-dessus. Notez que le msb et lsb doit être une expression constante et ne peut pas être remplacée par une variable. Mais il peut s'agir de n'importe quelle valeur entière - positive, négative ou nulle ; et le lsb la valeur peut être supérieure, égale ou inférieure à la valeur msb.

Sélections de bits

Tout bit d'une variable vectorisée peut être sélectionné individuellement et se voir attribuer une nouvelle valeur, comme indiqué ci-dessous. C'est ce qu'on appelle un bit-select . Si le bit-select est hors limites ou si le bit-select est x ou z , alors la valeur renvoyée sera 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

  

Part-sélectionne

Une plage de bits contigus peut être sélectionnée et est connue sous le nom de part-select . Il existe deux types de sélections de partie, une avec une sélection de partie constante et une autre avec une sélection de partie indexée.

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

  

Le fait d'avoir une sélection de partie variable permet de l'utiliser efficacement dans des boucles pour sélectionner des parties du vecteur. Bien que le bit de départ puisse varier, la largeur doit être constante.

[<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

  
Journal de simulation
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.

Erreurs courantes

  
  
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. Tutoriel Verilog
  2. Concaténation Verilog
  3. Affectations Verilog
  4. Verilog bloquant et non bloquant
  5. Fonctions Verilog
  6. Tâche Verilog
  7. Délai Verilog Inter et Intra Affectation
  8. Générateur d'horloge Verilog
  9. Fonctions mathématiques Verilog