Codificador de prioridad Verilog

En el circuito del sistema digital, un codificador es un circuito combinacional que toma 2 líneas de señal de entrada y las codifica en n líneas de señal de salida. Cuando la habilitación es verdadera, es decir, las líneas de señal de entrada correspondientes muestran la salida de bit binario equivalente. 

Por ejemplo, el codificador 8:3 tiene 8 líneas de entrada y 3 líneas de salida, el codificador 4:2 tiene 4 líneas de entrada y 2 líneas de salida, y así sucesivamente. 

 Un codificador de prioridad 8:3 tiene siete líneas de entrada, es decir, i0 a i7, y tres líneas de salida y2, y1 e y0. En 8:3 Priority Encoder i7 tiene la prioridad más alta e i0 la más baja. 

Mesa de la verdad:

 

Aporte

Producción

es i7 i6 i5 i4 i3 i2 i1 i0 y2 y1 y0
0 X X X X X X X X z z z
1 0 0 0 0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 1 X 0 0 1
1 0 0 0 0 0 1 X X 0 1 0
1 0 0 0 0 1 X X X 0 1 1
1 0 0 0 1 X X X X 1 0 0
1 0 0 1 X X X X X 1 0 1
1 0 1 X X X X X X 1 1 0
1 1 X X X X X X X 1 1 1

Símbolo lógico:

Implemente el codificador de prioridad en el código de Verilog:

La mayor parte de la programación se ocupa del desarrollo y diseño de software, pero Verilog HDL es un lenguaje de descripción de hardware que se utiliza para diseñar el diseño electrónico. Verilog proporciona a los diseñadores el diseño de los dispositivos en función de diferentes niveles de abstracción que incluyen: nivel de puerta, flujo de datos, nivel de interruptor y modelado de comportamiento. 

Modelado de comportamiento:

Modelo de comportamiento, que es el nivel más alto de abstracción. Dado que estamos utilizando Modelado de comportamiento, escribiremos el código usando if-else para garantizar los valores de entrada del Codificador de prioridad. Al usar la condición if, los valores de salida se asignan en función de la prioridad. 

Bloque de diseño: modelado de comportamiento

module priorityencoder_83(en,i,y);
  // declare
  input en;
  input [7:0]i;
  // store and declare output values
  output reg [2:0]y;
  always @(en,i)
  begin
    if(en==1)
      begin
        // priority encoder
        // if condition to chose 
        // output based on priority. 
        if(i[7]==1) y=3'b111;
        else if(i[6]==1) y=3'b110;
        else if(i[5]==1) y=3'b101;
        else if(i[4]==1) y=3'b100;
        else if(i[3]==1) y=3'b011;
        else if(i[2]==1) y=3'b010;
        else if(i[1]==1) y=3'b001;
        else
        y=3'b000;
      end
     // if enable is zero, there is
     // an high impedance value. 
    else y=3'bzzz;
  end
endmodule

Banco de pruebas: Comportamiento

Un Testbench es un bloque de simulación que se utiliza para proporcionar entradas al bloque de diseño. La mejor manera de escribir Testbench es tener una buena percepción de la tabla de verdad. Una vez que tenga lista la tabla de verdad, proporcione los valores de entrada dentro del banco de pruebas. 

module tb;
  reg [7:0]i;
  reg en;
  wire [2:0]y;
  
  // instantiate the model: creating 
  // instance for block diagram 
  priorityenoder_83 dut(en,i,y);
  initial
    begin
      // monitor is used to display the information. 
      $monitor("en=%b i=%b y=%b",en,i,y);
      // since en and i are input values, 
      // provide values to en and i. 
      en=1; i=128;#5
      en=1; i=64;#5
      en=1; i=32;#5
      en=1; i=16;#5
      en=1; i=8;#5
      en=1; i=4;#5
      en=1; i=2;#5
      en=1; i=0;#5
      en=0;i=8'bx;#5
      $finish;
    end
endmodule

Producción:

Modelado de flujo de datos:

En el modelado de flujo de datos, definimos la salida, es decir, net, asignando valores de entrada, es decir, reg, usando palabras clave asignadas. Para escribir el modelado de flujo de datos y el modelado a nivel de puerta, necesitamos un diagrama lógico para formar conexiones. 

Aquí está el diagrama lógico del codificador de prioridad 8:3

Data Flow Modeling

Modelado de flujo de datos

Bloque de diseño: flujo de datos

module priorityenoder83_dataflow(en,i,y);
    // declare port list via input and output
    input en;
    input [7:0]i;
    output [2:0]y;

    // check the logic diagram and assign the outputs
    assign y[2]=i[4] | i[5] | i[6] | i[7] &en;
    assign y[1]=i[2] | i[3] | i[6] | i[7] &en;
    assign y[0]=i[1] | i[3] | i[5] | i[7] &en;

endmodule

Banco de pruebas: Flujo de datos

module tb;
  reg en;
  reg [7:0]i;
  wire [2:0]y;

  // instantiate the model: creating
  // instance for block diagram
  priorityenoder83_dataflow dut(en,i,y);
  initial
    begin
      // monitor is used to display the information.
      $monitor("en=%b i=%b y=%b",en,i,y);
      
      // since en and i are input values,
      // provide values to en and i.
      en=1;i=128;#5
      en=1;i=64;#5
      en=1;i=32;#5
      en=1;i=16;#5
      en=1;i=8;#5
      en=1;i=4;#5
      en=1;i=2;#5
      en=1;i=1;#5
      en=0;i=8'bx;#5
      $finish;
    end
endmodule

Producción:

 

Modelado de nivel de puerta:

En el modelado a nivel de puerta, utilizamos puertas lógicas digitales utilizadas en electrónica digital. 

Sintaxis:

logicgate object(out,in1,in2);

Ejemplo:

and a1(out,a,b);

Bloque de diseño: nivel de puerta

module priorityenoder83_gate(en,i,y);
    // declare port list via input and output
    input en;
    input [7:0]i;
    output [2:0]y;

    wire temp1,temp2,temp3; // temp is used to apply 
                            // enable for the or gates
    // check the logic diagram and use 
    // logic gates to compute outputs
    or o1(temp1,i[4],i[5],i[6],i[7]);
    or o2(temp2,i[2],i[3],i[6],i[7]);
    or o3(temp3,i[1],i[3],i[5],i[7]);

    and a1(y[2],temp1,en);
    and a2(y[1],temp2,en);
    and a3(y[0],temp3,en);

endmodule

Banco de pruebas: nivel de puerta

module tb;
  reg en;
  reg [7:0]i;
  wire [2:0]y;

  // instantiate the model: creating 
  // instance for block diagram
  priorityenoder83_gate dut(en,i,y);
  initial
    begin
      // monitor is used to display
      // the information.
      $monitor("en=%b i=%b y=%b",en,i,y);
      // since en and i are input values,
      // provide values to en and i.
      en=1;i=128;#5
      en=1;i=64;#5
      en=1;i=32;#5
      en=1;i=16;#5
      en=1;i=8;#5
      en=1;i=4;#5
      en=1;i=2;#5
      en=1;i=1;#5
      en=0;i=8'bx;#5
      $finish;
    end
endmodule

Producción:

Aplicación del codificador de prioridad:

  • vehículos robóticos
  • Sistemas de vigilancia de la salud en Hospitales

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 *