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.
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;
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;
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