Codificador con Prioridad

Última modificación: 6 de marzo del 2023

Problema

Queremos diseñar un circuito combinacional que tenga la siguiente funcion: recibir una entrada (One Hot) de 2^n bits y dar una salida de n bits cuyo valor binario corresponda al índice de la única línea encendida en la entrada, en el caso de que hayan más de 1 línea encendida a la vez se tomará la línea cuyo bit sea más significativo, a este circuito se le conoce como codificador con prioridad, se clasifican por su número de entradas y salidas, por ejemplo el codificador con prioridad de la figura 1 es un codificador con prioridad 8 a 3 donde el primer dígito representa el número de entradas y el segundo el número de salidas, el número de salidas siempre va a ser log_2(ENTRADAS).

Para crear este circuito podemos hacerlo mediante mapas de Karnaugh o tablas de verdad y de esa forma encontraríamos la ecuación lógica que lo describe, pero ya que sabemos que hoy en día podemos hacer uso de herramientas CAD para facilitar este proceso, procederé a mostrar directamente su implementación en los HDL's.

Descripción del Circuito

AHDL

Implementación de un Codificador con Prioridad 8 a 3 en AHDL.

SUBDESIGN PRIORITY_ENCODER(
    a[7..0] : INPUT;
    z[2..0] : OUTPUT;
)

BEGIN
    CASE a[] IS
        WHEN b"00000001" => z[] = 0;
        WHEN b"0000001X" => z[] = 1;
        WHEN b"000001XX" => z[] = 2;
        WHEN b"00001XXX" => z[] = 3;
        WHEN b"0001XXXX" => z[] = 4;
        WHEN b"001XXXXX" => z[] = 5;
        WHEN b"01XXXXXX" => z[] = 6;
        WHEN b"1XXXXXXX" => z[] = 7;
    END CASE;
END;

VHDL

Implementación de un Codificador con Prioridad 8 a 3 en VHDL.

ENTITY PRIORITY_ENCODER IS
    PORT(a : IN BIT_VECTOR(7 DOWNTO 0);
         z : OUT BIT_VECTOR(2 DOWNTO 0));
END PRIORITY_ENCODER;

ARCHITECTURE Behaviour OF PRIORITY_ENCODER IS
BEGIN
    z <= "111" WHEN a(7) = '1' ELSE
         "110" WHEN a(6) = '1' ELSE
         "101" WHEN a(5) = '1' ELSE
         "100" WHEN a(4) = '1' ELSE
         "011" WHEN a(3) = '1' ELSE
         "010" WHEN a(2) = '1' ELSE
         "001" WHEN a(1) = '1' ELSE
         "000";
END Behaviour;

Verilog

Implementación de un Codificador con Prioridad 8 a 3 en Verilog.

module PRIORITY_ENCODER(a, z);
input [7:0] a;
output reg [2:0] z;

always @(a)
begin
    casex(a)
        8'b00000001 : z = 3'b000;
        8'b0000001X : z = 3'b001;
        8'b000001XX : z = 3'b010;
        8'b00001XXX : z = 3'b011;
        8'b0001XXXX : z = 3'b100;
        8'b001XXXXX : z = 3'b101;
        8'b01XXXXXX : z = 3'b110;
        8'b1XXXXXXX : z = 3'b111;
        8'b00000000 : z = 3'b000;
    endcase
end
endmodule