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

Modélisation au Niveau des Portes : Relier Schémas Matériels au Code Verilog

La plupart des conceptions numériques sont faites à un niveau d'abstraction plus élevé comme le RTL, bien qu'il devienne parfois intuitif de construire des circuits déterministes plus petits à un niveau inférieur en utilisant des éléments combinatoires comme and et or. La modélisation faite à ce niveau est généralement appelée modélisation au niveau des portes car elle implique des portes et a une relation un à un entre un schéma matériel et le code Verilog.

Verilog prend en charge quelques portes logiques de base connues comme primitives car elles peuvent être instanciées comme des modules puisqu'elles sont déjà prédéfinies.

Portes And/Or/Xor

Ces primitives implémentent une porte ET et une porte OU qui prennent plusieurs entrées scalaires et fournissent une seule sortie scalaire. Le premier terminal dans la liste des arguments de ces primitives est la sortie qui est mise à jour chaque fois qu'une des entrées change.

module gates (
  input a, b,
  output c, d, e
);
  and (c, a, b); // c est la sortie, a et b sont les entrées
  or (d, a, b);  // d est la sortie, a et b sont les entrées
  xor (e, a, b); // e est la sortie, a et b sont les entrées
endmodule
module tb;
  reg a, b;
  wire c, d, e;
  integer i;
  gates u0 (
    .a(a), .b(b), .c(c), .d(d), .e(e)
  );
  initial begin
    {a, b} = 0;
    $monitor ("[T=%0t a=%0b b=%0b c(and)=%0b d(or)=%0b e(xor)=%0b", $time, a, b, c, d, e);
    for (i = 0; i < 10; i = i+1) begin
      #1 a <= $random; b <= $random;
    end
  end
endmodule

Journal de Simulation

ncsim> run
[T=0 a=0 b=0 c(and)=0 d(or)=0 e(xor)=0
[T=1 a=0 b=1 c(and)=0 d(or)=1 e(xor)=1
[T=2 a=1 b=1 c(and)=1 d(or)=1 e(xor)=0
[T=4 a=1 b=0 c(and)=0 d(or)=1 e(xor)=1
[T=5 a=1 b=1 c(and)=1 d(or)=1 e(xor)=0
[T=6 a=0 b=1 c(and)=0 d(or)=1 e(xor)=1
[T=7 a=1 b=0 c(and)=0 d(or)=1 e(xor)=1
[T=10 a=1 b=1 c(and)=1 d(or)=1 e(xor)=0
ncsim: *W,RNQUIE: Simulation is complete.

Portes Nand/Nor/Xnor

L'inverse de toutes les portes ci-dessus sont aussi disponibles sous les formes de nand, nor et xnor. La même conception que ci-dessus est réutilisée avec l'exception que les primitives sont remplacées par leurs versions inverses.

module gates (
  input a, b,
  output c, d, e
);
  // Utilise nand, nor, xnor au lieu de and, or et xor
  // dans cet exemple
  nand (c, a, b); // c est la sortie, a et b sont les entrées
  nor (d, a, b);  // d est la sortie, a et b sont les entrées
  xnor (e, a, b); // e est la sortie, a et b sont les entrées
endmodule
module tb;
  reg a, b;
  wire c, d, e;
  integer i;
  gates u0 (.a(a), .b(b), .c(c), .d(d), .e(e));
  initial begin
    {a, b} = 0;
    $monitor ("[T=%0t a=%0b b=%0b c(nand)=%0b d(nor)=%0b e(xnor)=%0b", $time, a, b, c, d, e);
    for (i = 0; i < 10; i = i+1) begin
      #1 a <= $random; b <= $random;
    end
  end
endmodule

Journal de Simulation

ncsim> run
[T=0 a=0 b=0 c(nand)=1 d(nor)=1 e(xnor)=1
[T=1 a=0 b=1 c(nand)=1 d(nor)=0 e(xnor)=0
[T=2 a=1 b=1 c(nand)=0 d(nor)=0 e(xnor)=1
[T=4 a=1 b=0 c(nand)=1 d(nor)=0 e(xnor)=0
[T=5 a=1 b=1 c(nand)=0 d(nor)=0 e(xnor)=1
[T=6 a=0 b=1 c(nand)=1 d(nor)=0 e(xnor)=0
[T=7 a=1 b=0 c(nand)=1 d(nor)=0 e(xnor)=0
[T=10 a=1 b=1 c(nand)=0 d(nor)=0 e(xnor)=1
ncsim: *W,RNQUIE: Simulation is complete.

Ces portes peuvent avoir plus de deux entrées.

module gates (
  input a, b, c, d,
  output x, y, z
);
  and (x, a, b, c, d); // x est la sortie, a, b, c, d sont les entrées
  or (y, a, b, c, d);  // y est la sortie, a, b, c, d sont les entrées
  nor (z, a, b, c, d); // z est la sortie, a, b, c, d sont les entrées
endmodule
module tb;
  reg a, b, c, d;
  wire x, y, z;
  integer i;
  gates u0 (.a(a), .b(b), .c(c), .d(d), .x(x), .y(y), .z(z));
  initial begin
    {a, b, c, d} = 0;
    $monitor ("[T=%0t a=%0b b=%0b c=%0b d=%0b x=%0b y=%0b x=%0b", $time, a, b, c, d, x, y, z);
    for (i = 0; i < 10; i = i+1) begin
      #1 a <= $random; b <= $random; c <= $random; d <= $random;
    end
  end
endmodule

Journal de Simulation

ncsim> run
[T=0 a=0 b=0 c=0 d=0 x=0 y=0 x=1
[T=1 a=0 b=1 c=1 d=1 x=0 y=1 x=0
[T=2 a=1 b=1 c=1 d=0 x=0 y=1 x=0
[T=3 a=1 b=1 c=0 d=1 x=0 y=1 x=0
[T=4 a=1 b=0 c=1 d=0 x=0 y=1 x=0
[T=5 a=1 b=0 c=1 d=1 x=0 y=1 x=0
[T=6 a=0 b=1 c=0 d=0 x=0 y=1 x=0
[T=7 a=0 b=1 c=0 d=1 x=0 y=1 x=0
[T=8 a=1 b=1 c=1 d=0 x=0 y=1 x=0
[T=9 a=0 b=0 c=0 d=1 x=0 y=1 x=0
[T=10 a=0 b=1 c=1 d=1 x=0 y=1 x=0
ncsim: *W,RNQUIE: Simulation is complete.

Portes Buf/Not

Ces portes n'ont qu'une entrée scalaire et une ou plusieurs sorties. buf signifie tampon et transfère simplement la valeur de l'entrée vers la sortie sans changement de polarité. not signifie un inverseur qui inverse la polarité du signal à son entrée. Donc un 0 à son entrée donnera un 1 et vice versa.

module gates (
  input a,
  output c, d
);
  buf (c, a); // c est la sortie, a est l'entrée
  not (d, a); // d est la sortie, a est l'entrée
endmodule
module tb;
  reg a;
  wire c, d;
  integer i;
  gates u0 (.a(a), .c(c), .d(d));
  initial begin
    a = 0;
    $monitor ("[T=%0t a=%0b c(buf)=%0b d(not)=%0b", $time, a, c, d);
    for (i = 0; i < 10; i = i+1) begin
      #1 a <= $random;
    end
  end
endmodule

Journal de Simulation

xcelium> run
[T=0 a=0 c(buf)=0 d(not)=1
[T=2 a=1 c(buf)=1 d(not)=0
[T=8 a=0 c(buf)=0 d(not)=1
[T=9 a=1 c(buf)=1 d(not)=0
xmsim: *W,RNQUIE: Simulation is complete.

Le dernier terminal dans la liste des ports se connecte à l'entrée de la porte et tous les autres terminaux se connectent au port de sortie de la porte. Voici un exemple de tampon à sorties multiples, bien qu'il soit rarement utilisé.

module gates (
  input a,
  output c, d
);
  not (c, d, a); // c,d est la sortie, a est l'entrée
endmodule

Journal de Simulation

xcelium> run
[T=0 a=0 c=1 d=1
[T=2 a=1 c=0 d=0
[T=8 a=0 c=1 d=1
[T=9 a=1 c=0 d=0
xmsim: *W,RNQUIE: Simulation is complete.

Bufif/Notif

Les tampons et inverseurs avec un signal de contrôle additionnel pour activer la sortie sont disponibles via les primitives bufif et notif. Ces portes ont une sortie valide seulement si le signal de contrôle est activé sinon la sortie sera en haute impédance. Il y a deux versions de celles-ci, une avec polarité normale de contrôle indiquée par un 1 comme bufif1 et notif1 et une seconde avec polarité inversée de contrôle indiquée par un 0 comme bufif0 et notif0.

Verilog

  1. Conception et vérification d'un circuit porte NAND de base avec le CI 4011
  2. Transistors JFET : direction courant grille et canaux N/P
  3. Comprendre la portée des variables en C# : Niveaux classe, méthode et bloc
  4. Couches d'abstraction de conception : Guide clair de l'architecture de puce
  5. Conception Pratique Verilog Niveau Portes : Portes ET, OU, NON & Multiplexeur 2x1
  6. Comprendre les Délais de Portes en Verilog : Timing Précis pour Conceptions Numériques Fiables
  7. Modélisation Avancée au Niveau des Commutateurs en Verilog
  8. Mires de nivellement (level staffs) : définition, usages et types
  9. Nivellement Précis du Tour : Guide Professionnel