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