Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Verilog

Modelagem em Nível de Porta: Conectando Esquemas de Hardware a Código Verilog

A maioria dos designs digitais é feita em nível de abstração mais alto como RTL, embora às vezes seja intuitivo construir circuitos determinísticos menores em nível inferior usando elementos combinacionais como and e or. Modelagem nesse nível é chamada modelagem em nível de porta (gate-level modeling) pois envolve portas e tem relação um-para-um entre esquema de hardware e código Verilog.

Verilog suporta portas lógicas básicas chamadas primitivas (primitives) pois podem ser instanciadas como módulos já predefinidos.

Portas And/Or/Xor

Estas primitivas implementam portas AND e OR que aceitam múltiplas entradas escalares e fornecem saída escalar única. O primeiro terminal na lista de argumentos é a saída, atualizada quando qualquer entrada muda.

module gates (
  input a, b,
  output c, d, e
);
  and (c, a, b); // c = saída, a e b = entradas
  or (d, a, b);  // d = saída, a e b = entradas
  xor (e, a, b); // e = saída, a e b = 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

Log de Simulação

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.

Portas Nand/Nor/Xnor

As inversas das portas acima estão disponíveis como nand, nor e xnor. Mesmo design reutilizado trocando primitivas por suas versões inversas.

module gates (
  input a, b,
  output c, d, e
);
  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

Log de Simulação

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 portas podem ter mais de duas entradas.

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 z=%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

Log de Simulação

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

Portas Buf/Not

Têm apenas uma entrada escalar e uma ou mais saídas. buf (buffer) transfere valor da entrada para saída sem mudança de polaridade. not (inversor) inverte polaridade: 0 na entrada resulta 1 e vice-versa.

module gates (
  input a,
  output c, d
);
  buf (c, a); // c = saída, a = entrada
  not (d, a); // d = saída, a = 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

Log de Simulação

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.

O último terminal na lista de portas conecta à entrada da porta; todos os outros conectam à saída. Exemplo de buffer com múltiplas saídas (raro):

module gates (
  input a,
  output c, d
);
  not (c, d, a); // c,d = saídas, a = entrada
endmodule

Log de Simulação

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 com sinal de controle adicional para habilitar saída disponíveis via primitivas bufif e notif. Têm saída válida apenas se controle habilitado, senão alta impedância. Duas versões: polaridade normal (1) como bufif1/notif1 e polaridade invertida (0) como bufif0/notif0.

Verilog

  1. Projeto e Verificação de Circuito Básico de Porta NAND com CI 4011
  2. Entendendo Transistores de Efeito de Campo de Junção (JFETs): Direção da Corrente de Gate & Canal N vs P
  3. Circuitos Integrados: Fundamentos de Portas Lógicas Digitais
  4. Entendendo Escopo de Variáveis em C#: Níveis de Classe, Método e Bloco
  5. Camadas de Abstração de Projeto: Guia Claro para Arquitetura de Chips
  6. Design Prático em Nível de Porta Verilog: Portas AND, OR, NOT e Multiplexador 2x1
  7. Entendendo Atrasos de Porta em Verilog: Timing Preciso para Designs Digitais Confiáveis
  8. Modelagem Avançada em Nível de Chave (Switch-Level) em Verilog
  9. Miras de Nivelamento (Level Staffs): Definição, Usos e Tipos
  10. Nivelamento Preciso de Torno: Guia Profissional