Verilog, codificador de prioridad FPGA y codificador normal

0

Me gustaría hacer algunas preguntas sobre cómo inferir la prioridad y el codificador normal usando Verilog en el FPGA.

He utilizado los códigos de ejemplo del libro "ejemplos prácticos de diseño avanzado de chips en Verilog"

Código para pri_encoder

module pri_encoder
(D0, D1, D2, D3, D4, D5, D6, D7,
Q2Q1Q0);

input D0, D1, D2, D3, D4, D5, D6, D7;
output [2:0] Q2Q1Q0;
reg    [2:0] Q2Q1Q0;

always @*
  begin
    Q2Q1Q0 = 3'b000;
      if(D0) Q2Q1Q0 = 3'b000;
      else if(D1) Q2Q1Q0 = 3'b001;
      else if(D2) Q2Q1Q0 = 3'b010;
      else if(D3) Q2Q1Q0 = 3'b011;
      else if(D4) Q2Q1Q0 = 3'b100;
      else if(D5) Q2Q1Q0 = 3'b101;
      else if(D6) Q2Q1Q0 = 3'b110;
      else if(D7) Q2Q1Q0 = 3'b111;
  end
endmodule

Código para el codificador normal

module encoder
(D0, D1, D2, D3, D4, D5, D6, D7,
Q2Q1Q0);

input D0, D1, D2, D3, D4, D5, D6, D7;
output [2:0] Q2Q1Q0;
reg    [2:0] Q2Q1Q0;

always @*
  begin
    Q2Q1Q0 = 3'b000;
    case (1'b1)
      D0: Q2Q1Q0 = 3'b000;
      D1: Q2Q1Q0 = 3'b001;
      D2: Q2Q1Q0 = 3'b010;
      D3: Q2Q1Q0 = 3'b011;
      D4: Q2Q1Q0 = 3'b100;
      D5: Q2Q1Q0 = 3'b101;
      D6: Q2Q1Q0 = 3'b110;
      D7: Q2Q1Q0 = 3'b111;
    endcase
  end
endmodule 

La primera pregunta es sobre la expresión constante en el caso de cambio. Parece que la expresión constante se puede ubicar dentro del interruptor (exp) y el elemento que tiene 1'b1 se puede seleccionar. ¿Infiere el codificador de prioridad o simplemente el codificador normal?

A primera vista, parece que el caso con expresión constante funcionará como un codificador de prioridad, pero cuando sintetizo el código anterior en la plataforma Vivado, el esquema sintetizado parece a continuación.

Lasegundapreguntaes¿cómopodemossabersieldiseñosintetizadoesuncodificadordeprioridadouncodificadornormalsiseconstruyenutilizandolasLUT?CuandomiroelQ2Q1Q0 2 y Q2Q1Q0 [1] parece que todos los datos D0 ~ D7 están conectados a TU solo una vez. Sin embargo, para el Q2Q1Q0 [0] dos LUT6 están conectados para generar una salida y algunas entradas de datos están conectadas a dos LUT.

    
pregunta JaeHyuk Lee

1 respuesta

1

Sus if-else y case(1'b1) son codificadores de prioridad. Un codificador normal se vería como el siguiente:

always @*
  begin
    Q2Q1Q0 = 3'b000;
    case ({D7,D6,D5,D4,D3,D2,D1,D0})
      8'h01: Q2Q1Q0 = 3'b000;
      8'h02: Q2Q1Q0 = 3'b001;
      8'h04: Q2Q1Q0 = 3'b010;
      8'h08: Q2Q1Q0 = 3'b011;
      8'h10: Q2Q1Q0 = 3'b100;
      8'h20: Q2Q1Q0 = 3'b101;
      8'h40: Q2Q1Q0 = 3'b110;
      8'h80: Q2Q1Q0 = 3'b111;
    endcase
  end

Un codificador normal considera la expresión de entrada completa y solo un bit debe ser uno. Si hay más bits en uno, no se cumplen las condiciones (condición predeterminada y / o error dependiendo de su codificación).

Los codificadores de prioridad tienen prioridad a los bits si dos bits más son altos. Si la entrada es 8'h12 , se devolverá 1 o 5 (según el orden de prioridad). Un codificador normal devolverá 0 (y / o un error) porque la entrada no es de un solo calor. Vea la tabla verdadera a continuación.

$$ \ begin {array} {r | lcr | lcr | l} \ \ text {Normal} & & & \ text {Prioridad (LSB)} & & & \ text {Prioridad (MSB)} \\ 00000001 & 000 & & ??????? 1 & 000 & & 00000001 & 000 \\ 00000010 & 001 & & 10 & 001 & & 0000001? &erio; 001 \\ 00000100 & 010 & & 100 & 010 & & 000001 ?? &erio; 010 \\ 00001000 & 011 & & 1000 & 011 & & 00001 ??? &erio; 011 \\ 00010000 & 100 & & 10000 & 100 & & 0001 ???? &erio; 100 \\ 00100000 & 101 & & 100000 & 101 & & 001 ????? &erio; 101 \\ 01000000 & 110 & & ? 1000000 & 110 & & 01 ?????? &erio; 110 \\ 10000000 & 111 & & 10000000 & 111 & & 1 ??????? &erio; 111 \\ \ color {azul} {\ text {de lo contrario}} & - \ color {rojo} {\ texto {[error]}} & & 00000000 & - \ color {rojo} {\ texto {[error]}} & & 00000000 & - \ color {rojo} {\ texto {[error]}} \\ \ end {array} $$

La sintaxis case(1'b1) compara un valor con una lista de variables y ejecuta la primera coincidencia. Donde las declaraciones de casos típicos comparan una variable con una lista para los valores y ejecutan la primera coincidencia. Por defecto, case(1'b1) infiere un codificador de prioridad. Sin embargo, el sintetizador puede optar por utilizar un codificador normal si puede determinar que se garantiza que la entrada es de un solo uso y si cumple con los requisitos de tiempo y recursos. La mayoría de los sintetizadores tienen pragmas que permiten al usuario forzar el tipo. Los comandos de Pragma no son universales, por lo que deberá consultar el manual. Los pragmas de notas son para expertos, solo utilícelos cuando sea necesario.

    
respondido por el Greg

Lea otras preguntas en las etiquetas