ahb_funct.vhd

来自「vhdl实现的amba代码」· VHDL 代码 · 共 148 行

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

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?