Gate-Level Modeling: van hardware-schema's naar Verilog-code
Meeste digitale ontwerpen worden op een hoger abstractieniveau gedaan zoals RTL, hoewel het soms intuïtiever is om kleinere deterministische circuits op een lager niveau te bouwen met combinatorische elementen zoals and en or. Modelleren op dit niveau heet meestal gate-level modeling omdat het gates betreft en een een-op-een relatie heeft tussen een hardware-schema en de Verilog-code.
Verilog ondersteunt een paar basis logic gates bekend als primitives omdat ze geïnstantieerd kunnen worden als modules aangezien ze al vooraf gedefinieerd zijn.
And/Or/Xor Gates
Deze primitives implementeren een AND en een OR gate die veel scalaire inputs nemen en een enkele scalaire output leveren. De eerste terminal in de lijst van argumenten aan deze primitives is de output die geüpdatet wordt telkens wanneer een van de inputs verandert.
module gates (
input a, b,
output c, d, e
);
and (c, a, b); // c is output, a en b zijn inputs
or (d, a, b); // d is output, a en b zijn inputs
xor (e, a, b); // e is output, a en b zijn inputs
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
Simulatie-log
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.
Nand/Nor/Xnor Gates
De inverse van alle bovenstaande gates zijn ook beschikbaar in de vorm van nand, nor en xnor. Hetzelfde ontwerp wordt hergebruikt met de uitzondering dat de primitives omgewisseld zijn met hun inverse versies.
module gates (
input a, b,
output c, d, e
);
// Gebruik nand, nor, xnor in plaats van and, or, xor
nand (c, a, b);
nor (d, a, b);
xnor (e, a, b);
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
Simulatie-log
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.
Deze gates kunnen meer dan twee inputs hebben.
module gates (
input a, b, c, d,
output x, y, z
);
and (x, a, b, c, d);
or (y, a, b, c, d);
nor (z, a, b, c, d);
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
Simulatie-log
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.
Buf/Not Gates
Deze gates hebben slechts één scalaire input en een of meer outputs. buf staat voor een buffer en overdraagt de waarde van input naar output zonder polariteitswijziging. not staat voor een inverter die de polariteit van het signaal op de input omkeert. Een 0 op de input levert een 1 op en vice versa.
module gates (
input a,
output c, d
);
buf (c, a); // c is output, a is input
not (d, a); // d is output, a is input
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
Simulatie-log
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.
De laatste terminal in de poortlijst verbindt met de input van de gate en alle andere terminals verbinden met de output-poort van de gate. Hier is een voorbeeld van een multiple-output buffer, hoewel dit zelden gebruikt wordt.
module gates (
input a,
output c, d
);
not (c, d, a); // c,d is output, a is input
endmodule
Simulatie-log
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 en Inverters met een additioneel controlsignaal om de output in te schakelen zijn beschikbaar via bufif en notif primitives. Deze gates hebben een geldige output alleen als het controlsignaal ingeschakeld is, anders is de output in high impedance. Er zijn twee versies: één met normale polariteit van control aangegeven door een 1 zoals bufif1 en notif1 en een met geïnverteerde polariteit van control aangegeven door een 0 zoals bufif0 en notif0.
Verilog
- Ontwerpen en Verifiëren van een Basis NAND Poort Circuit met de 4011 IC
- Junction Field-Effect Transistors (JFETs): Gate Stroomrichting & N-kanaal vs P-kanaal
- Geïntegreerde Schakelingen: Fundamenten van Digitale Logische Poorten
- De NOT-Poort (Inverter) in TTL-Schakelingen Begrijpen
- Waterpaslatten Begrepen: Definitie, Gebruik en Typen
- Precieze Draaibank Niveleren: Een Professionele Gids
- Variabele Scope in C#: Klasse-, Methode- en Blokniveau
- Ontwerpabstractielagen: Duidelijke gids voor chip-architectuur
- Praktisch Verilog Gate-Level Ontwerp: AND, OR, NOT Gates & 2x1 Multiplexer
- Gate Delays in Verilog begrijpen: Accurate timing voor betrouwbare digitale ontwerpen
- Geavanceerde Switch-Level Modeling in Verilog