Decodificador 2 a 4 en Verilog HDL

En este artículo, implementaremos el decodificador 2:4 usando todos los niveles de abstracción en Verilog HDL con un procedimiento paso a paso. Antes de proceder con el código, examinaremos la tabla de verdad y el símbolo lógico del decodificador 2:4 .

Decodificador 2:4

Un decodificador es un circuito lógico combinacional que tiene ‘n’ líneas de señal de entrada y 2 n líneas de salida. En el decodificador 2:4 tenemos 2 líneas de entrada y 4 líneas de salida. Además, proporcionamos ‘ habilitar ‘ a la entrada para garantizar que el decodificador funcione siempre que la habilitación sea 1 y se apague cuando la habilitación sea 0. La tabla de verdad, el diagrama lógico y el símbolo lógico se muestran a continuación:

Mesa de la verdad:

es Aporte

Producción

a b y3 y2 y1 y0
1 X X 1 1 1 1
0 0 0 1 1 1 0
0 0 1 1 1 0 1
0 1 0 1 0 1 1
0 1 1 0 1 1 1

Símbolo lógico:

Diagrama de lógica:

Similar al decodificador 2:4, el decodificador 3 a 8 produce ocho líneas de señal de salida y el decodificador 4 a 16 produce dieciséis líneas de señal de salida.

Ahora implementaremos un decodificador 2:4 en diferentes niveles de abstracción de mayor a menor. 

1. Modelado de comportamiento:

El modelado de comportamiento representa el circuito en un alto nivel de abstracción. La sintaxis del modelado de comportamiento se asemeja a la de la programación en C. Podemos implementar declaraciones de condiciones como si, declaración de caso, bucle y procedimientos de estructura (inicial y siempre) dentro del bloque de diseño de Verilog utilizando el modelado de comportamiento.

Sintaxis:

if(condition)
  true_statement;
else if(condition)
   true_statement;
else
   else_statement

Bloque de diseño: modelado de comportamiento

module decoder24_behaviour(en,a,b,y);
   // input port
   input en,a,b;

   // use reg to store the output value
   output reg [3:0]y;
   // always is used in design block 
   // only in Behavioural modeling.
   
   always @(en,a,b)
     begin
       // using condition if statement 
       // implement the 2:4 truth table
       if(en==0)
         begin
           if(a==1'b0 & b==1'b0) y=4'b1110;
           else if(a==1'b0 & b==1'b1) y=4'b1101;
           else if(a==1'b1 & b==1'b0) y=4'b1011;
           else if(a==1 & b==1) y=4'b0111;
           else y=4'bxxxx;
         end
       else
        y=4'b1111;
     end
endmodule

Banco de pruebas: modelado de comportamiento

Una vez que hemos diseñado el bloque de diseño debemos probarlo. El banco de pruebas es un bloque de simulación que se utiliza para probar el bloque de diseño mediante la aplicación de estímulos y la verificación de resultados sin pasar por los valores de entrada. Piense en el bloque de diseño como la implementación de salida donde solo pensamos en el resultado de salida sin preocuparnos por la entrada. Pero mientras escribe el banco de pruebas, debe proporcionar las entradas adecuadas, aquí la tabla de verdad es muy importante para declarar los valores de entrada.

En Testbench el paso importante es vincular el bloque de diseño, esto se hace por instanciación:

modulename instance(port list);

Para mostrar el resultado utilizaremos la tarea del sistema $monitor.

Sintaxis:

$monitor(display_statement);
module tb;

  // input port are declared in reg(register)
  reg a,b,en;

  // output port are declared in wire(net)
  wire [3:0]y;

  // instantiate design block
  decoder24_behaviour dut(en,a,b,y);

  initial
    begin
      $monitor("en=%b a=%b b=%b y=%b",en,a,b,y);
      // with reference to truth table provide input values
      en=1;a=1'bx;b=1'bx;#5
      en=0;a=0;b=0;#5
      en=0;a=0;b=1;#5
      en=0;a=1;b=0;#5
      en=0;a=1;b=1;#5

      // terminate simulation using $finish system task
      $finish;
    end
endmodule

Salida: Para ejecutar el programa:

iverilog -o behavior tb.v dut.v
vvp behavior

Nota: iverilog es el compilador de Verilog para ejecutar programas de Verilog. vvp es el comando para ejecutar el código Verilog. 

2. Modelado de flujo de datos:

Al definir el modelado de flujo de datos, un diseñador debe tener en cuenta cómo fluyen los datos en la descripción del diseño. El modelado de flujo de datos se ha convertido en un enfoque de diseño muy apreciado, a medida que se perfeccionaron las herramientas de síntesis lógica. En Data Flow usamos la asignación de palabras clave para almacenar los valores netos.

Sintaxis:

assign out = expression;

Bloque de diseño: flujo de datos

module decoder24_assign(en,a,b,y);
    // declare input and output ports
    input en,a,b;
    output [3:0]y;

    // supportive connection required
    wire enb,na,nb;
    assign enb = ~en;
    assign na = ~a;
    assign nb = ~b;
    
    // assign output value by referring to logic diagram
    assign y[0] = ~(enb&na&nb);
    assign y[1] = ~(enb&na&b);
    assign y[2] = ~(enb&a&nb);
    assign y[3] = ~(enb&a&b);

endmodule

TestBench: flujo de datos

module tb;
  // input port are declared in reg(register)
  reg a,b,en;

  // output port are declared in wire(net)
  wire [3:0]y;

  // instantiate design block
  decoder24_assign dut(en,a,b,y);

  initial
    begin
      $monitor("en=%b a=%b b=%b y=%b",en,a,b,y);
      // with reference to truth
      // table provide input values
      en=1;a=1'bx;b=1'bx;#5
      en=0;a=0;b=0;#5
      en=0;a=0;b=1;#5
      en=0;a=1;b=0;#5
      en=0;a=1;b=1;#5
      // terminate simulation using $finish system task
      $finish;
    end
endmodule

Salida: Para ejecutar el programa:

iverilog -o assign tb.v dut.v
vvp assign

3. Modelado de nivel de puerta:

Las puertas lógicas son bloques de construcción de circuitos lógicos. Verilog admite puertas básicas como primitivas predefinidas. Estas primitivas se instancian (creando instancia/objeto) y se pueden implementar dentro de la definición del módulo.

Sintaxis:

logicgate object(output_port,input_port)

Ejemplo:

nand n1(y,x1,x2)

Nota: Las puertas lógicas están en minúsculas y el objeto puede tener cualquier nombre que no sean palabras clave. En el ejemplo anterior, y es la salida y x1 y x2 son señales de entrada.

El código de Verilog comienza con la definición del módulo con los puertos de entrada y salida pasados ​​como argumento. Con la ayuda del diagrama lógico, instanciaremos 4 compuertas NAND y 3 compuertas NO para conectar señales de entrada y salida para implementar el decodificador 2:4. 

Bloque de diseño: Nivel de puerta

module decoder24_gate(en,a,b,y);
    // declare input and output ports
    input en,a,b;
    output [3:0]y;

    // supportive connections required
    // to connect nand gates
    wire enb,na,nb;

    // instantiate 4 nand gates and 3 not gates
    // make connections by referring the above logic diagram
    not n0(enb,en);
    not n1(na,a);
    not n2(nb,b);

    nand n3(y[0],enb,na,nb);
    nand n4(y[1],enb,na,b);
    nand n5(y[2],enb,a,nb);
    nand n6(y[3],enb,a,b);

endmodule

Banco de pruebas: nivel de puerta

module tb;
  // input port are declared in reg(register)
  reg a,b,en;
  // output port are declared in wire(net)
  wire [3:0]y;
  // instantiate design block
  decoder24_gate dut(en,a,b,y);

  initial
    begin
      $monitor("en=%b a=%b b=%b y=%b",en,a,b,y);
      // with reference to truth table provide input values
      en=1;a=1'bx;b=1'bx;#5
      en=0;a=0;b=0;#5
      en=0;a=0;b=1;#5
      en=0;a=1;b=0;#5
      en=0;a=1;b=1;#5
      // terminate simulation using $finish system task
      $finish;
    end
endmodule

Salida: Para ejecutar el programa:

iverilog -o gate tb.v dut.v
vvp gate

Aplicación de decodificador:

Aquí hay algunos campos donde se implementa el decodificador en el mundo real:

  1. Conversores de código
  2. Vehículo robótico con detector de metales
  3. Sistema de automatización del hogar basado en RF
  4. Utilizado en ALU de CPU
  5. Sincronización de velocidad de múltiples motores en industrias

Publicación traducida automáticamente

Artículo escrito por jaintarun y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *