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