Problema con mi codificador de prioridad de línea de 8 a 3 usando la descripción de nivel de compuerta verilog

0

Estoy intentando construir un codificador de línea de 8 a 3 que funcione utilizando la descripción de nivel de puerta en verilog. Aunque tengo modelos de trabajo, en términos de compilación y simulación exitosas, el problema recurrente parece ser que mis circuitos simplemente no parecen implementar la codificación y, por lo tanto, la prioridad como deberían hacerlo.

Por ejemplo, cuando D2 debe codificarse como, 100, 101, 110 y 111, solo se codifica como 100 y 101 y en su lugar D3 comienza a codificar en 110 y 111, en lugar de 1000. Consulte la forma de onda a continuación. :

Esto está empezando a ser un problema en la parte de atrás, ya que independientemente de la implementación que use, los resultados son siempre los mismos.

Consulte también un ejemplo de una de estas descripciones a continuación:

module prior_otb_enco(Y, D, V);
  output   [2:0] Y;
  input    [7:0] D;
  input    V;

  wire    D7_not, D6_not, D5_not, D4_not, D2_not;
  wire    wa0, wa1, wa2, wa3, wa4;;

  //instanitate gates
  not    g0 (D7_not, D[7]),
         g1 (D6_not, D[6]),
         g2 (D5_not, D[5]),
         g3 (D4_not, D[4]),
         g4 (D2_not, D[2]);
  and    g5 (wa0, D6_not, D4_not, D[3]),
         g6 (wa1, D5_not, D4_not, D[3]),
         g7 (wa2, D5_not, D4_not, D[2]),
         g8 (wa3, D6_not, D[5]),
         g9 (wa4, D6_not, D4_not, D2_not, D[1]);
  or     g11(Y[2], D[7], D[6], D[5], D[4]),
         g12(Y[1], D[7], D[6], wa1, wa2),
         g13(Y[0], D[7], wa0, wa3, wa4),
         g14(V, D[0], D[1], D[2], D[3], D[4], D[5], D[6], D[7]);
endmodule

Por lo tanto, cualquier información que cualquiera pueda proporcionar será muy apreciada.

    
pregunta aLoHa

1 respuesta

0

Solo para resumir lo que escribí en los comentarios, ya que puede ayudar a otros también.

Aquí está el verilog que consideraría:

module prior_otb_enco( Y, D, V );
  output [2:0] Y;
  input [7:0] D;
  output V;
  wire s0, s1, s2, s3, s4, s5, s6, s7;
  wire Y2_temp;
  assign s0 = ~ D[7];
  assign s1 = ~ D[6];
  assign s3 = (D[6] | D[5] | D[4]);
  assign s2 = ~ (s1 & D[5]);
  assign s4 = (s3 | D[2] | ~ D[1]);
  assign s5 = ~ s3;
  assign Y2_temp = ~ (s0 & s1 & s2 & ~ D[4]);
  assign s6 = ~ (s5 & D[2]);
  assign s7 = ~ (s5 & D[3]);
  assign Y[1] = ~ (s0 & s1 & s6 & s7);
  assign Y[0] = ~ (s0 & s2 & s4 & s7);
  assign V = ~ (s6 & s4 & s7 & ~ (Y2_temp | D[0]));
  assign Y[2] = Y2_temp;
endmodule

El esquema equivalente es:

Aquí hay tres modelos de comportamiento diferentes, todos en verilog, que lograrían casi lo mismo después de la síntesis:

ejemplo 1

module prior_otb_enco_1( Y, D, V );
  output [2:0] Y;
  input [7:0] D;
  output V;
  reg V;
  reg [2:0] Y;
  always @(D)
    V = 1;
    if ( D[7] )        Y = 7;
    else if ( D[6] )   Y = 6;
    else if ( D[5] )   Y = 5;
    else if ( D[4] )   Y = 4;
    else if ( D[3] )   Y = 3;
    else if ( D[2] )   Y = 2;
    else if ( D[1] )   Y = 2;
    else if ( D[0] )   Y = 0;
    else
      begin
        V = 0;
        Y = 3'b X;
      end
  end
endmodule

ejemplo 2

module prior_otb_enco_2( Y, D, V );
  output [2:0] Y;
  input [7:0] D;
  output V;
  reg V;
  reg [2:0] Y;
  always @(D)
    begin
      V = 1;
      casex( D )
        8'b 1XXXXXXX:  Y = 7;
        8'b 01XXXXXX:  Y = 6;
        8'b 001XXXXX:  Y = 5;
        8'b 0001XXXX:  Y = 4;
        8'b 00001XXX:  Y = 3;
        8'b 000001XX:  Y = 2;
        8'b 0000001X:  Y = 1;
        8'b 00000001:  Y = 0;
        default:
          begin
            V = 0;
            Y = 3'b X;
          end
      endcase
    end
endmodule

ejemplo 3

module prior_otb_enco_2( Y, D, V );
  output [2:0] Y;
  input [7:0] D;
  output V;
  reg V;
  reg [2:0] Y;
  integer N;
  always @(D)
    begin
      V = 0;
      Y = 3'b X;
      for( N = 0; N < 8; N = N + 1 )
        if ( D[N] )
          begin
            V = 1;
            Y = N;
          end
    end
endmodule
    
respondido por el jonk

Lea otras preguntas en las etiquetas