library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use ieee.math_real.all; entity AXI_Handshaking_Scheduler_8 is generic ( G_DataWidth : integer := 8; G_InBufferStages : integer := 1; G_OutBufferStages : integer := 1 ); port ( --@ Clock signal; (**Rising edge** triggered) I_CLK : in std_logic; --@ Clock enable signal (**Active high**) I_CE : in std_logic; --@ Synchronous reset signal (**Active high**) I_RST : in std_logic; --@ @virtualbus P0 @dir in P0 interface I_P0_Valid : in std_logic := '0'; O_P0_Ready : out std_logic := '0'; I_P0_Data : in std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); --@ @end --@ @virtualbus P1 @dir in P1 interface I_P1_Valid : in std_logic := '0'; O_P1_Ready : out std_logic := '0'; I_P1_Data : in std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); --@ @end --@ @virtualbus P2 @dir in P2 interface I_P2_Valid : in std_logic := '0'; O_P2_Ready : out std_logic := '0'; I_P2_Data : in std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); --@ @end --@ @virtualbus P3 @dir in P3 interface I_P3_Valid : in std_logic := '0'; O_P3_Ready : out std_logic := '0'; I_P3_Data : in std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); --@ @end --@ @virtualbus P4 @dir in P4 interface I_P4_Valid : in std_logic := '0'; O_P4_Ready : out std_logic := '0'; I_P4_Data : in std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); --@ @end --@ @virtualbus P5 @dir in P5 interface I_P5_Valid : in std_logic := '0'; O_P5_Ready : out std_logic := '0'; I_P5_Data : in std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); --@ @end --@ @virtualbus P6 @dir in P6 interface I_P6_Valid : in std_logic := '0'; O_P6_Ready : out std_logic := '0'; I_P6_Data : in std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); --@ @end --@ @virtualbus P7 @dir in P7 interface I_P7_Valid : in std_logic := '0'; O_P7_Ready : out std_logic := '0'; I_P7_Data : in std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); --@ @end --@ @virtualbus Out @dir out Output interface O_Out_Valid : out std_logic := '0'; I_Out_Ready : in std_logic := '0'; O_Out_Data : out std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); O_Out_Address : out std_logic_vector(2 downto 0) := (others => '0') --@ @end ); end entity AXI_Handshaking_Scheduler_8; architecture Rtl of AXI_Handshaking_Scheduler_8 is signal R_SelectRotator : unsigned(2 downto 0) := (others => '0'); signal R1_SelectRotator : unsigned(2 downto 0) := (others => '0'); signal C_Select : std_logic_vector(7 downto 0) := (others => '0'); signal C_Code : std_logic_vector(2 downto 0) := (others => '0'); signal R_Code : std_logic_vector(2 downto 0) := (others => '0'); signal C_CodeUnrotated : std_logic_vector(2 downto 0) := (others => '0'); signal S_P0_InBufferEnable : std_logic := '0'; signal S_P0_Ready : std_logic := '0'; signal S_P0_Valid : std_logic := '0'; signal S_P0_Data : std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); signal S_P1_InBufferEnable : std_logic := '0'; signal S_P1_Ready : std_logic := '0'; signal S_P1_Valid : std_logic := '0'; signal S_P1_Data : std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); signal S_P2_InBufferEnable : std_logic := '0'; signal S_P2_Ready : std_logic := '0'; signal S_P2_Valid : std_logic := '0'; signal S_P2_Data : std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); signal S_P3_InBufferEnable : std_logic := '0'; signal S_P3_Ready : std_logic := '0'; signal S_P3_Valid : std_logic := '0'; signal S_P3_Data : std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); signal S_P4_InBufferEnable : std_logic := '0'; signal S_P4_Ready : std_logic := '0'; signal S_P4_Valid : std_logic := '0'; signal S_P4_Data : std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); signal S_P5_InBufferEnable : std_logic := '0'; signal S_P5_Ready : std_logic := '0'; signal S_P5_Valid : std_logic := '0'; signal S_P5_Data : std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); signal S_P6_InBufferEnable : std_logic := '0'; signal S_P6_Ready : std_logic := '0'; signal S_P6_Valid : std_logic := '0'; signal S_P6_Data : std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); signal S_P7_InBufferEnable : std_logic := '0'; signal S_P7_Ready : std_logic := '0'; signal S_P7_Valid : std_logic := '0'; signal S_P7_Data : std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); signal S_OutBufferEnable : std_logic := '0'; signal S_Out_Ready : std_logic := '0'; signal S_Out_Valid : std_logic := '0'; signal S_Out_Data : std_logic_vector(G_DataWidth - 1 downto 0) := (others => '0'); signal S_Out_Address : std_logic_vector(2 downto 0) := (others => '0'); begin I_P0_InBufferCtrl : entity work.PipelineController generic map( G_PipelineStages => G_InBufferStages ) port map( I_CLK => I_CLK, I_CE => I_CE, I_RST => I_RST, O_Enable => S_P0_InBufferEnable, I_Valid => I_P0_Valid, O_Ready => O_P0_Ready, O_Valid => S_P0_Valid, I_Ready => S_P0_Ready ); I_P0_InBuffer : entity work.PipelineRegister generic map( G_PipelineStages => G_InBufferStages, G_Width => G_DataWidth, G_RegisterBalancing => "forward" ) port map( I_CLK => I_CLK, I_Enable => S_P0_InBufferEnable, I_Data => I_P0_Data, O_Data => S_P0_Data ); I_P1_InBufferCtrl : entity work.PipelineController generic map( G_PipelineStages => G_InBufferStages ) port map( I_CLK => I_CLK, I_CE => I_CE, I_RST => I_RST, O_Enable => S_P1_InBufferEnable, I_Valid => I_P1_Valid, O_Ready => O_P1_Ready, O_Valid => S_P1_Valid, I_Ready => S_P1_Ready ); I_P1_InBuffer : entity work.PipelineRegister generic map( G_PipelineStages => G_InBufferStages, G_Width => G_DataWidth, G_RegisterBalancing => "forward" ) port map( I_CLK => I_CLK, I_Enable => S_P1_InBufferEnable, I_Data => I_P1_Data, O_Data => S_P1_Data ); I_P2_InBufferCtrl : entity work.PipelineController generic map( G_PipelineStages => G_InBufferStages ) port map( I_CLK => I_CLK, I_CE => I_CE, I_RST => I_RST, O_Enable => S_P2_InBufferEnable, I_Valid => I_P2_Valid, O_Ready => O_P2_Ready, O_Valid => S_P2_Valid, I_Ready => S_P2_Ready ); I_P2_InBuffer : entity work.PipelineRegister generic map( G_PipelineStages => G_InBufferStages, G_Width => G_DataWidth, G_RegisterBalancing => "forward" ) port map( I_CLK => I_CLK, I_Enable => S_P2_InBufferEnable, I_Data => I_P2_Data, O_Data => S_P2_Data ); I_P3_InBufferCtrl : entity work.PipelineController generic map( G_PipelineStages => G_InBufferStages ) port map( I_CLK => I_CLK, I_CE => I_CE, I_RST => I_RST, O_Enable => S_P3_InBufferEnable, I_Valid => I_P3_Valid, O_Ready => O_P3_Ready, O_Valid => S_P3_Valid, I_Ready => S_P3_Ready ); I_P3_InBuffer : entity work.PipelineRegister generic map( G_PipelineStages => G_InBufferStages, G_Width => G_DataWidth, G_RegisterBalancing => "forward" ) port map( I_CLK => I_CLK, I_Enable => S_P3_InBufferEnable, I_Data => I_P3_Data, O_Data => S_P3_Data ); I_P4_InBufferCtrl : entity work.PipelineController generic map( G_PipelineStages => G_InBufferStages ) port map( I_CLK => I_CLK, I_CE => I_CE, I_RST => I_RST, O_Enable => S_P4_InBufferEnable, I_Valid => I_P4_Valid, O_Ready => O_P4_Ready, O_Valid => S_P4_Valid, I_Ready => S_P4_Ready ); I_P4_InBuffer : entity work.PipelineRegister generic map( G_PipelineStages => G_InBufferStages, G_Width => G_DataWidth, G_RegisterBalancing => "forward" ) port map( I_CLK => I_CLK, I_Enable => S_P4_InBufferEnable, I_Data => I_P4_Data, O_Data => S_P4_Data ); I_P5_InBufferCtrl : entity work.PipelineController generic map( G_PipelineStages => G_InBufferStages ) port map( I_CLK => I_CLK, I_CE => I_CE, I_RST => I_RST, O_Enable => S_P5_InBufferEnable, I_Valid => I_P5_Valid, O_Ready => O_P5_Ready, O_Valid => S_P5_Valid, I_Ready => S_P5_Ready ); I_P5_InBuffer : entity work.PipelineRegister generic map( G_PipelineStages => G_InBufferStages, G_Width => G_DataWidth, G_RegisterBalancing => "forward" ) port map( I_CLK => I_CLK, I_Enable => S_P5_InBufferEnable, I_Data => I_P5_Data, O_Data => S_P5_Data ); I_P6_InBufferCtrl : entity work.PipelineController generic map( G_PipelineStages => G_InBufferStages ) port map( I_CLK => I_CLK, I_CE => I_CE, I_RST => I_RST, O_Enable => S_P6_InBufferEnable, I_Valid => I_P6_Valid, O_Ready => O_P6_Ready, O_Valid => S_P6_Valid, I_Ready => S_P6_Ready ); I_P6_InBuffer : entity work.PipelineRegister generic map( G_PipelineStages => G_InBufferStages, G_Width => G_DataWidth, G_RegisterBalancing => "forward" ) port map( I_CLK => I_CLK, I_Enable => S_P6_InBufferEnable, I_Data => I_P6_Data, O_Data => S_P6_Data ); I_P7_InBufferCtrl : entity work.PipelineController generic map( G_PipelineStages => G_InBufferStages ) port map( I_CLK => I_CLK, I_CE => I_CE, I_RST => I_RST, O_Enable => S_P7_InBufferEnable, I_Valid => I_P7_Valid, O_Ready => O_P7_Ready, O_Valid => S_P7_Valid, I_Ready => S_P7_Ready ); I_P7_InBuffer : entity work.PipelineRegister generic map( G_PipelineStages => G_InBufferStages, G_Width => G_DataWidth, G_RegisterBalancing => "forward" ) port map( I_CLK => I_CLK, I_Enable => S_P7_InBufferEnable, I_Data => I_P7_Data, O_Data => S_P7_Data ); I_PriorityEncoder_8 : entity work.PriorityEncoder_8 port map( I_Select => C_Select, O_Code => C_Code ); P_SelectMux : process (R_SelectRotator, S_P0_Valid, S_P1_Valid, S_P2_Valid, S_P3_Valid, S_P4_Valid, S_P5_Valid, S_P6_Valid, S_P7_Valid) begin case R_SelectRotator is when "000" => C_Select <= S_P0_Valid & S_P1_Valid & S_P2_Valid & S_P3_Valid & S_P4_Valid & S_P5_Valid & S_P6_Valid & S_P7_Valid; when "001" => C_Select <= S_P1_Valid & S_P2_Valid & S_P3_Valid & S_P4_Valid & S_P5_Valid & S_P6_Valid & S_P7_Valid & S_P0_Valid; when "010" => C_Select <= S_P2_Valid & S_P3_Valid & S_P4_Valid & S_P5_Valid & S_P6_Valid & S_P7_Valid & S_P0_Valid & S_P1_Valid; when "011" => C_Select <= S_P3_Valid & S_P4_Valid & S_P5_Valid & S_P6_Valid & S_P7_Valid & S_P0_Valid & S_P1_Valid & S_P2_Valid; when "100" => C_Select <= S_P4_Valid & S_P5_Valid & S_P6_Valid & S_P7_Valid & S_P0_Valid & S_P1_Valid & S_P2_Valid & S_P3_Valid; when "101" => C_Select <= S_P5_Valid & S_P6_Valid & S_P7_Valid & S_P0_Valid & S_P1_Valid & S_P2_Valid & S_P3_Valid & S_P4_Valid; when "110" => C_Select <= S_P6_Valid & S_P7_Valid & S_P0_Valid & S_P1_Valid & S_P2_Valid & S_P3_Valid & S_P4_Valid & S_P5_Valid; when "111" => C_Select <= S_P7_Valid & S_P0_Valid & S_P1_Valid & S_P2_Valid & S_P3_Valid & S_P4_Valid & S_P5_Valid & S_P6_Valid; when others => C_Select <= (others => '-'); end case; end process; P_CodeUnrotating : process (R_Code, R1_SelectRotator) begin C_CodeUnrotated <= std_logic_vector(unsigned(R_Code) + R1_SelectRotator); end process; P_OutMux : process ( C_CodeUnrotated, S_P0_Data, S_P1_Data, S_P2_Data, S_P3_Data, S_P4_Data, S_P5_Data, S_P6_Data, S_P7_Data, S_P0_Valid, S_P1_Valid, S_P2_Valid, S_P3_Valid, S_P4_Valid, S_P5_Valid, S_P6_Valid, S_P7_Valid, S_Out_Ready) begin S_Out_Valid <= '0'; S_P0_Ready <= '0'; S_P1_Ready <= '0'; S_P2_Ready <= '0'; S_P3_Ready <= '0'; S_P4_Ready <= '0'; S_P5_Ready <= '0'; S_P6_Ready <= '0'; S_P7_Ready <= '0'; S_Out_Data <= (others => '-'); S_Out_Address <= C_CodeUnrotated; case C_CodeUnrotated is when "000" => S_Out_Valid <= S_P0_Valid; S_P0_Ready <= S_Out_Ready; S_Out_Data <= S_P0_Data; when "001" => S_Out_Valid <= S_P1_Valid; S_P1_Ready <= S_Out_Ready; S_Out_Data <= S_P1_Data; when "010" => S_Out_Valid <= S_P2_Valid; S_P2_Ready <= S_Out_Ready; S_Out_Data <= S_P2_Data; when "011" => S_Out_Valid <= S_P3_Valid; S_P3_Ready <= S_Out_Ready; S_Out_Data <= S_P3_Data; when "100" => S_Out_Valid <= S_P4_Valid; S_P4_Ready <= S_Out_Ready; S_Out_Data <= S_P4_Data; when "101" => S_Out_Valid <= S_P5_Valid; S_P5_Ready <= S_Out_Ready; S_Out_Data <= S_P5_Data; when "110" => S_Out_Valid <= S_P6_Valid; S_P6_Ready <= S_Out_Ready; S_Out_Data <= S_P6_Data; when "111" => S_Out_Valid <= S_P7_Valid; S_P7_Ready <= S_Out_Ready; S_Out_Data <= S_P7_Data; when others => S_Out_Address <= (others => '-'); end case; end process; P_SelectRotator : process (I_CLK) begin if rising_edge(I_CLK) then if I_CE = '1' then if I_RST = '1' then R_SelectRotator <= (others => '0'); R1_SelectRotator <= (others => '0'); R_Code <= (others => '0'); else R1_SelectRotator <= R_SelectRotator; R_Code <= C_Code; if I_Out_Ready = '1' then R_SelectRotator <= unsigned(C_CodeUnrotated) + 1; end if; end if; end if; end if; end process P_SelectRotator; I_OutBufferCtrl : entity work.PipelineController generic map( G_PipelineStages => G_OutBufferStages ) port map( I_CLK => I_CLK, I_CE => I_CE, I_RST => I_RST, O_Enable => S_OutBufferEnable, I_Valid => S_Out_Valid, O_Ready => S_Out_Ready, O_Valid => O_Out_Valid, I_Ready => I_Out_Ready ); I_OutDataBuffer : entity work.PipelineRegister generic map( G_PipelineStages => G_OutBufferStages, G_Width => G_DataWidth, G_RegisterBalancing => "backward" ) port map( I_CLK => I_CLK, I_Enable => S_OutBufferEnable, I_Data => S_Out_Data, O_Data => O_Out_Data ); I_OutAddressBuffer : entity work.PipelineRegister generic map( G_PipelineStages => G_OutBufferStages, G_Width => 3, G_RegisterBalancing => "backward" ) port map( I_CLK => I_CLK, I_Enable => S_OutBufferEnable, I_Data => S_Out_Address, O_Data => O_Out_Address ); end architecture;