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