Codificador

Última modificación: 5 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, a este circuito se le conoce como codificador, se clasifican por su número de entradas y salidas, por ejemplo el codificador de la figura 1 es un codificador 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 8 a 3 en AHDL.

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

BEGIN
    CASE a[] IS
        WHEN b"00000001" => (e, z[]) = (0,b"000");
        WHEN b"00000010" => (e, z[]) = (0,b"001");
        WHEN b"00000100" => (e, z[]) = (0,b"010");
        WHEN b"00001000" => (e, z[]) = (0,b"011");
        WHEN b"00010000" => (e, z[]) = (0,b"100");
        WHEN b"00100000" => (e, z[]) = (0,b"101");
        WHEN b"01000000" => (e, z[]) = (0,b"110");
        WHEN b"10000000" => (e, z[]) = (0,b"111");
        WHEN OTHERS      => (e, z[]) = (1,b"000");
    END CASE;
END;

VHDL

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

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

ARCHITECTURE Behaviour OF ENCODER IS
BEGIN
    PROCESS(a)
    BEGIN
        CASE a IS
            WHEN "00000001" => e <= '0';
                               z <= "000";
            WHEN "00000010" => e <= '0';
                               z <= "001";
            WHEN "00000100" => e <= '0';
                               z <= "010";
            WHEN "00001000" => e <= '0';
                               z <= "011";
            WHEN "00010000" => e <= '0';
                               z <= "100";
            WHEN "00100000" => e <= '0';
                               z <= "101";
            WHEN "01000000" => e <= '0';
                               z <= "110";
            WHEN "10000000" => e <= '0';
                               z <= "111";
            WHEN OTHERS => e <= '1';
                           z <= "000";
        END CASE;
    END PROCESS;
END;

Verilog

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

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

always @(a)
begin
    case(a)
        8'b00000001 : {e, z} = 4'b0000;
        8'b00000010 : {e, z} = 4'b0001;
        8'b00000100 : {e, z} = 4'b0010;
        8'b00001000 : {e, z} = 4'b0011;
        8'b00010000 : {e, z} = 4'b0100;
        8'b00100000 : {e, z} = 4'b0101;
        8'b01000000 : {e, z} = 4'b0110;
        8'b10000000 : {e, z} = 4'b0111;
        default     : {e, z} = 4'b1000;
    endcase
end
endmodule