Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Verilog

Modelado a nivel de puertas: Puentes entre esquemas de hardware y código Verilog

La mayoría de los diseños digitales se realizan a un nivel de abstracción más alto como RTL, aunque a veces se vuelve intuitivo construir circuitos deterministas más pequeños a un nivel inferior usando elementos combinacionales como and y or. El modelado hecho en este nivel se suele llamar modelado a nivel de puertas (gate-level modeling) ya que involucra puertas y tiene una relación uno a uno entre un esquema de hardware y el código Verilog.

Verilog soporta algunas puertas lógicas básicas conocidas como primitivas ya que pueden instanciarse como módulos ya que están predefinidas.

Puertas And/Or/Xor

Estas primitivas implementan una puerta AND y una puerta OR que toman muchas entradas escalares y proporcionan una única salida escalar. El primer terminal en la lista de argumentos a estas primitivas es la salida que se actualiza cada vez que cualquiera de las entradas cambia.

module gates (
  input a, b,
  output c, d, e
);
  and (c, a, b); // c es la salida, a y b son entradas
  or (d, a, b);  // d es la salida, a y b son entradas
  xor (e, a, b); // e es la salida, a y b son entradas
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
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.

Puertas Nand/Nor/Xnor

El inverso de todas las puertas anteriores también están disponibles en formas de nand, nor y xnor. El mismo diseño de arriba se reusa con la excepción de que las primitivas se cambian por sus versiones inversas.

module gates (
  input a, b,
  output c, d, e
);
  // Usar nand, nor, xnor en lugar de and, or y xor
  // en este ejemplo
  nand (c, a, b); // c es la salida, a y b son entradas
  nor (d, a, b);  // d es la salida, a y b son entradas
  xnor (e, a, b); // e es la salida, a y b son entradas
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
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.

Estas puertas pueden tener más de dos entradas.

module gates (
  input a, b, c, d,
  output x, y, z
);
  and (x, a, b, c, d); // x es la salida, a, b, c, d son entradas
  or (y, a, b, c, d);  // y es la salida, a, b, c, d son entradas
  nor (z, a, b, c, d); // z es la salida, a, b, c, d son entradas
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
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.

Puertas Buf/Not

Estas puertas tienen solo una entrada escalar y una o más salidas. buf significa buffer y simplemente transfiere el valor de la entrada a la salida sin ningún cambio en la polaridad. not significa un inversor que invierte la polaridad de la señal en su entrada. Así, un 0 en su entrada producirá un 1 y viceversa.

module gates (
  input a,
  output c, d
);
  buf (c, a); // c es la salida, a es entrada
  not (d, a); // d es la salida, a es entrada
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
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.

El último terminal en la lista de puertos se conecta a la entrada de la puerta y todos los demás terminales se conectan al puerto de salida de la puerta. Aquí hay un ejemplo de un buffer de múltiples salidas, aunque rara vez se usa.

module gates (
  input a,
  output c, d
);
  not (c, d, a); // c,d es la salida, a es entrada
endmodule
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

Buffers e inversores con una señal de control adicional para habilitar la salida están disponibles a través de las primitivas bufif y notif. Estas puertas tienen una salida válida solo si la señal de control está habilitada, de lo contrario la salida estará en alta impedancia. Hay dos versiones de estas, una con polaridad normal de control indicada por un 1 como bufif1 y notif1 y segunda con polaridad invertida de control indicada por un 0 como bufif0 y notif0.

Verilog

  1. Diseño y Verificación de un Circuito Básico Puerta NAND con IC 4011
  2. Entendiendo los transistores de efecto de campo de unión (JFET): Dirección de corriente de gate y N-canal vs P-canal
  3. Circuitos integrados: Fundamentos de puertas lógicas digitales
  4. Comprender la compuerta NOT (inversor) en circuitos TTL
  5. Miras de Nivel (Level Staffs): Definición, Usos y Tipos en Topografía
  6. Nivelación Precisa de Torno: Guía Profesional
  7. Entendiendo el ámbito de variables en C#: Nivel de clase, método y bloque
  8. Capas de abstracción en diseño: Guía clara para arquitectura de chips
  9. Diseño práctico a nivel de puertas en Verilog: Puertas AND, OR, NOT y Multiplexor 2x1
  10. Comprender los retrasos de puertas en Verilog: Temporización precisa para diseños digitales confiables
  11. Modelado avanzado a nivel de interruptores en Verilog