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