paicore_behavioral/encoders/encoder_components.vhdl
2025-07-18 05:09:06 -05:00

91 lines
No EOL
2.5 KiB
VHDL

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
package encoder_components is
function get_encoder_size(din_size: in natural)
return natural;
function get_dout_size(din_size: in natural)
return natural;
function get_num_encoders(num_paths_in: in integer)
return integer;
component encoder_generic is
generic(
din_size : natural
);
port (
din : in STD_LOGIC_VECTOR(din_size-1 downto 0);
dout : out STD_LOGIC_VECTOR(get_dout_size(din_size)-1 downto 0);
valid : out STD_LOGIC -- '1' if any input is high, '0' if all zero
);
end component encoder_generic;
component encoder4to2 is
port (
din : in STD_LOGIC_VECTOR(3 downto 0);
dout : out STD_LOGIC_VECTOR(1 downto 0);
valid : out STD_LOGIC -- '1' if any input is high, '0' if all zero
);
end component encoder4to2;
component encoder8to3 is
port (
din : in STD_LOGIC_VECTOR(7 downto 0);
dout : out STD_LOGIC_VECTOR(2 downto 0);
valid : out STD_LOGIC -- '1' if any input is high, '0' if all zero
);
end component encoder8to3;
component encoder16to4 is
port (
din : in STD_LOGIC_VECTOR(15 downto 0);
dout : out STD_LOGIC_VECTOR(3 downto 0);
valid : out STD_LOGIC -- '1' if any input is high, '0' if all zero
);
end component encoder16to4;
component encoder32to5 is
port (
din : in STD_LOGIC_VECTOR(31 downto 0);
dout : out STD_LOGIC_VECTOR(4 downto 0);
valid : out STD_LOGIC -- '1' if any input is high, '0' if all zero
);
end component encoder32to5;
end package;
package body encoder_components is
function get_encoder_size(din_size: in natural)
return natural is
begin
if din_size >= 16 then
return 32;
elsif din_size >= 8 then
return 16;
else
return 8;
end if;
end function;
function get_dout_size(din_size: in natural)
return natural is
begin
if din_size = 32 then
return 5;
elsif din_size = 16 then
return 4;
elsif din_size = 8 then
return 3;
else
return 0;
end if;
end function;
function get_num_encoders(num_paths_in: integer)
return integer is
begin
return (num_paths_in+32-1)/32;
end function;
end package body;