OpenCores
URL https://opencores.org/ocsvn/ahb_system_generator/ahb_system_generator/trunk

Subversion Repositories ahb_system_generator

[/] [ahb_system_generator/] [trunk/] [src/] [ahb_funct.vhd] - Diff between revs 2 and 3

Only display areas with differences | Details | Blame | View Log

Rev 2 Rev 3
library ieee;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_arith.all;
 
 
package ahb_funct is
package ahb_funct is
 
 
function nb_bits (A : std_logic_vector) return NATURAL;
function nb_bits (A : std_logic_vector) return NATURAL;
function nb_bits (A : INTEGER) return NATURAL;
function nb_bits (A : INTEGER) return NATURAL;
 
 
procedure fixed_priority(
procedure fixed_priority(
t_turn: out integer;
t_turn: out integer;
t_grant: out integer;
t_grant: out integer;
req: in std_logic_vector;
req: in std_logic_vector;
turn: in integer);
turn: in integer);
procedure round_robin(
procedure round_robin(
def_elem: in integer;
def_elem: in integer;
t_turn: out integer;
t_turn: out integer;
t_grant: out integer;
t_grant: out integer;
req: in std_logic_vector;
req: in std_logic_vector;
turn: in integer);
turn: in integer);
procedure random_priority(
procedure random_priority(
def_elem: in integer;
def_elem: in integer;
t_turn: out integer;
t_turn: out integer;
t_grant: out integer;
t_grant: out integer;
random: in integer;
random: in integer;
req: in std_logic_vector;
req: in std_logic_vector;
turn: in integer);
turn: in integer);
 
 
end ahb_funct;
end ahb_funct;
 
 
package body ahb_funct is
package body ahb_funct is
 
 
  function nb_bits (A : std_logic_vector) return NATURAL is
  function nb_bits (A : std_logic_vector) return NATURAL is
    variable logres : NATURAL ;
    variable logres : NATURAL ;
    begin
    begin
     logres := 1;
     logres := 1;
     for i in A'length-1 downto 0 loop
     for i in A'length-1 downto 0 loop
      if A(i) = '1' then
      if A(i) = '1' then
        logres := i;
        logres := i;
        exit;
        exit;
      end if;
      end if;
     end loop;
     end loop;
     return logres;
     return logres;
   end nb_bits;
   end nb_bits;
 
 
   function nb_bits (A : INTEGER) return NATURAL is
   function nb_bits (A : INTEGER) return NATURAL is
    variable logres : NATURAL ;
    variable logres : NATURAL ;
    begin
    begin
     logres := 1;
     logres := 1;
     for i in 0 to 30 loop
     for i in 0 to 30 loop
      if 2**i <= A then
      if 2**i <= A then
        logres := i+1;
        logres := i+1;
      end if;
      end if;
     end loop;
     end loop;
     return logres;
     return logres;
   end nb_bits;
   end nb_bits;
 
 
procedure fixed_priority(
procedure fixed_priority(
t_turn: out integer;-- range 0 to num_elem-1; 
t_turn: out integer;-- range 0 to num_elem-1; 
t_grant: out integer;
t_grant: out integer;
req: in std_logic_vector;
req: in std_logic_vector;
turn: in integer-- range 0 to num_elem-1 
turn: in integer-- range 0 to num_elem-1 
) is
) is
begin
begin
  t_grant := 0;
  t_grant := 0;
  t_turn := 0;
  t_turn := 0;
  req_for:for i in req'length-1 downto 0 loop
  req_for:for i in req'length-1 downto 0 loop
    if req(i) = '1' then
    if req(i) = '1' then
      t_grant := i;
      t_grant := i;
    end if;
    end if;
  end loop;
  end loop;
end fixed_priority;
end fixed_priority;
 
 
procedure round_robin(
procedure round_robin(
def_elem: in integer;
def_elem: in integer;
t_turn: out integer;-- range 0 to num_elem-1; 
t_turn: out integer;-- range 0 to num_elem-1; 
t_grant: out integer;-- range 0 to num_elem-1; 
t_grant: out integer;-- range 0 to num_elem-1; 
req: in std_logic_vector;
req: in std_logic_vector;
turn: in integer-- range 0 to num_elem-1 
turn: in integer-- range 0 to num_elem-1 
) is
) is
constant req_size: integer:= req'length;
constant req_size: integer:= req'length;
variable v_req: std_logic_vector(req_size*2-1 downto 0);
variable v_req: std_logic_vector(req_size*2-1 downto 0);
type turn_array  is array (req_size-1 downto 0) of std_logic_vector(req_size-1 downto 0);
type turn_array  is array (req_size-1 downto 0) of std_logic_vector(req_size-1 downto 0);
variable v_turn: turn_array;
variable v_turn: turn_array;
begin
begin
  t_grant := def_elem;
  t_grant := def_elem;
  t_turn := turn;
  t_turn := turn;
  v_req := req&req;--concatenation
  v_req := req&req;--concatenation
  for i in 0 to req_size-1 loop
  for i in 0 to req_size-1 loop
    v_turn(i) := v_req(i+req_size-1 downto i);
    v_turn(i) := v_req(i+req_size-1 downto i);
  end loop;
  end loop;
  for j in 0 to req_size-1 loop
  for j in 0 to req_size-1 loop
    if j=turn then
    if j=turn then
      for jj in 0 to req_size-1 loop
      for jj in 0 to req_size-1 loop
        if v_turn(j)(jj)='1' then
        if v_turn(j)(jj)='1' then
          if turn+jj >=req'length then
          if turn+jj >=req'length then
            t_turn := turn+jj-req_size;
            t_turn := turn+jj-req_size;
            t_grant := turn+jj-req_size;
            t_grant := turn+jj-req_size;
          else
          else
            t_turn := turn+jj;
            t_turn := turn+jj;
            t_grant := turn+jj;
            t_grant := turn+jj;
          end if;
          end if;
        end if;
        end if;
      end loop;  -- jj
      end loop;  -- jj
    end if;
    end if;
  end loop;  -- j    
  end loop;  -- j    
end round_robin;
end round_robin;
 
 
 
 
procedure random_priority(
procedure random_priority(
def_elem: in integer;
def_elem: in integer;
t_turn: out integer;-- range 0 to num_elem-1; 
t_turn: out integer;-- range 0 to num_elem-1; 
t_grant: out integer;-- range 0 to num_elem-1; 
t_grant: out integer;-- range 0 to num_elem-1; 
random: in integer;-- range 0 to 2**(nb_bits(num_elem));
random: in integer;-- range 0 to 2**(nb_bits(num_elem));
req: in std_logic_vector;
req: in std_logic_vector;
turn: in integer-- range 0 to num_elem-1
turn: in integer-- range 0 to num_elem-1
) is
) is
constant req_size: integer:= req'length;
constant req_size: integer:= req'length;
variable j, v_turn, upper_limit: integer;
variable j, v_turn, upper_limit: integer;
begin
begin
  t_grant := def_elem;
  t_grant := def_elem;
  upper_limit := 2**(nb_bits(req_size))-1;
  upper_limit := 2**(nb_bits(req_size))-1;
  v_turn := turn;
  v_turn := turn;
  req_for:for i in upper_limit downto 0 loop
  req_for:for i in upper_limit downto 0 loop
    if ((i >= random) and (i <= random+upper_limit)) then
    if ((i >= random) and (i <= random+upper_limit)) then
      j := i mod req_size;
      j := i mod req_size;
      if req(j) = '1' then
      if req(j) = '1' then
        t_grant := j;
        t_grant := j;
        if turn=req_size-1 then
        if turn=req_size-1 then
          v_turn := 0;
          v_turn := 0;
        else
        else
          v_turn := turn+1;
          v_turn := turn+1;
        end if;
        end if;
      end if;
      end if;
        t_turn := v_turn;
        t_turn := v_turn;
    --synopsys translate_off
    --synopsys translate_off
        assert (v_turn>=0 and v_turn<req_size) report "####ERROR: WRONG ARBITRATION!!!" severity failure;
        assert (v_turn>=0 and v_turn<req_size) report "####ERROR: WRONG ARBITRATION!!!" severity failure;
    --synopsys translate_on
    --synopsys translate_on
    end if;
    end if;
  end loop;
  end loop;
end random_priority;
end random_priority;
 
 
 
 
end ahb_funct;
end ahb_funct;
 
 
 
 
 
 
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.