Decodificador

Última modificación: 6 de marzo del 2023

Problema

Queremos diseñar un circuito combinacional que tenga la siguiente funcion: recibir una entrada de n bitsy dar una salida (One Hot) de 2^n bits cuyo valor corresponda al índice del valor binario en la entrada, a este circuito se le conoce como decodificador, se clasifican por su número de entradas y salidas, por ejemplo el decodificador de la figura 1 es un decodificador 3 a 8 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 2^(n).

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 Decodificador 3 a 8 en AHDL.

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

BEGIN
    IF ena THEN
        CASE a[] IS
            WHEN 0 => z[] = b"00000001";
            WHEN 1 => z[] = b"00000010";
            WHEN 2 => z[] = b"00000100";
            WHEN 3 => z[] = b"00001000";
            WHEN 4 => z[] = b"00010000";
            WHEN 5 => z[] = b"00100000";
            WHEN 6 => z[] = b"01000000";
            WHEN 7 => z[] = b"10000000";
        END CASE;
    ELSE
        z[] = b"00000000";
    END IF;
END;

VHDL

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

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

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

Verilog

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

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

always @(a, ena)
    if (!ena)
        z = 0;
    else
        case(a)
            0 : z = 8'b00000001;
            1 : z = 8'b00000010;
            2 : z = 8'b00000100;
            3 : z = 8'b00001000;
            4 : z = 8'b00010000;
            5 : z = 8'b00100000;
            6 : z = 8'b01000000;
            7 : z = 8'b10000000;
        endcase
endmodule