Round Robin Arbiter will grant the request on circular basis. In this design code, there are four requests and four grant signals. This code will grant the request to first, second third and forth at the last. This code will grant the user request for four clock cycle and this time slice can be varied. This code can be modified for different time slices according to specification. Find Round Robin Arbiter with fixed time slice here.
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity round_robin1 is port ( clk : in std_logic; -- clock signal rst : in std_logic; -- reset signal req : in std_logic_vector(3 downto 0); -- request vector grant : out std_logic_vector(3 downto 0)); -- grant vector end round_robin1; architecture beh of round_robin1 is type state is (s_ideal,s0,s1,s2,s3); -- 4 states for 4 request users signal p_state : state := s_ideal; -- present state signal count : std_logic_vector(1 downto 0) := "00"; -- counter for time begin -- beh main: process (clk,rst,count) begin -- process main if rst='1' then count<="00"; p_state<=s_ideal; grant<="0000"; elsif rising_edge(clk) then case p_state is when s0 => if req(0)='1' then if count="11" then if req(1)='1' then count<="00"; p_state<=s1; elsif req(2)='1' then count<="00"; p_state<=s2; elsif req(3)='1' then count<="00"; p_state<=s3; else count<="00"; p_state<=s0; end if; else count<=count+'1'; grant<="0001"; p_state<=s0; end if; elsif req(1)='1' then p_state<=s1; count<="00"; elsif req(2)='1' then p_state<=s2; count<="00"; elsif req(3)='1' then p_state<=s3; count<="00"; else p_state<=s_ideal; end if; when s1 => if req(1)='1' then if count="11" then if req(2)='1' then count<="00"; p_state<=s2; elsif req(3)='1' then count<="00"; p_state<=s3; elsif req(0)='1' then count<="00"; p_state<=s0; else count<="00"; p_state<=s1; end if; else count<=count+'1'; grant<="0010"; p_state<=s1; end if; elsif req(2)='1' then p_state<=s2; count<="00"; elsif req(3)='1' then p_state<=s3; count<="00"; elsif req(0)='1' then p_state<=s0; count<="00"; else p_state<=s_ideal; end if; when s2 => if req(2)='1' then if count="11" then if req(3)='1' then count<="00"; p_state<=s3; elsif req(0)='1' then count<="00"; p_state<=s0; elsif req(1)='1' then count<="00"; p_state<=s1; else count<="00"; p_state<=s2; end if; else count<=count+'1'; grant<="0100"; p_state<=s2; end if; elsif req(3)='1' then p_state<=s3; count<="00"; elsif req(0)='1' then p_state<=s0; count<="00"; elsif req(1)='1' then p_state<=s1; count<="00"; else p_state<=s_ideal; end if; when s3 => if req(3)='1' then if count="11" then if req(0)='1' then count<="00"; p_state<=s0; elsif req(1)='1' then count<="00"; p_state<=s1; elsif req(2)='1' then count<="00"; p_state<=s2; else count<="00"; p_state<=s3; end if; else count<=count+'1'; grant<="1000"; p_state<=s3; end if; elsif req(0)='1' then p_state<=s0; count<="00"; elsif req(1)='1' then p_state<=s1; count<="00"; elsif req(2)='1' then p_state<=s2; count<="00"; else p_state<=s_ideal; end if; when others => if req(0)='1' then p_state<=s0; count<="00"; elsif req(1)='1' then p_state<=s1; count<="00"; elsif req(2)='1' then p_state<=s2; count<="00"; elsif req(3)='1' then p_state<=s3; count<="00"; else p_state<=s_ideal; count<="00"; grant<="0000"; end if; end case; end if; end process main; end beh;
Can you provide VHDL code for fcfs arbiter?
ReplyDelete