用于使用条件逻辑生成

for generate with conditional logic

我正在实施以下模块:

library ieee;
use ieee.std_logic_1164.all;

entity Grant_Logic is
    generic (
        N : positive := 4
    );
    Port (
        Priority_Logic0 :   in std_logic_vector(N-1 downto 0);
        Priority_Logic1 :   in std_logic_vector(N-1 downto 0);
        Priority_Logic2 :   in std_logic_vector(N-1 downto 0);
        Priority_Logic3 :   in std_logic_vector(N-1 downto 0);
        Gnt             :   out std_logic_vector (N-1 downto 0)
    );
end Grant_Logic;

architecture Behavioral of Grant_Logic is

begin

    gnt(0) <= Priority_Logic0(0) or Priority_Logic1(3) or Priority_Logic2(2) or Priority_Logic3(1);
    gnt(1) <= Priority_Logic0(1) or Priority_Logic1(0) or Priority_Logic2(3) or Priority_Logic3(2);
    gnt(2) <= Priority_Logic0(2) or Priority_Logic1(1) or Priority_Logic2(0) or Priority_Logic3(3);
    gnt(3) <= Priority_Logic0(3) or Priority_Logic1(2) or Priority_Logic2(1) or Priority_Logic3(0);

end Behavioral;

我想利用for ... generate在N改变时实现相同的电路。我正在使用 Xilinx,因此 Vivado (vhdl'93) 不支持 IP 生成中端口的自定义类型。 但是,对于架构,我想使用 for ... generate。问题是需要一些逻辑来生成 gnt 的每一位。我目前拥有的是:

gen_gnt_vertical: for y in 0 to N-1 generate 
    constant val, index : integer := 0;
    begin
    s_result <= '0';
    gen_gnt_horizontal: for x in 0 to N-1 generate
        begin
             LOGIC BASED ON val, x and y to obtain the index
             s_result <= s_result or s_Priority_Logic(x)(index);
    end generate;
    gnt(y) <= s_result;        
end generate;

计算 index 的逻辑是:

    if(x>0)
    {
        val = y - x;
        if (val < 0)
        {
            index = N + val;
        }
        else
            index = val;
    }
    else
    {
        index = y;
    }

我有一个基于 N 生成 vhdl 文件的脚本,但我想直接在 vhdl 上执行。这可能吗?

感谢您的帮助

编辑:正如@Tricky 回答的那样,一个函数可以解决问题。所以,我有以下内容:

function index( N, x,y : natural) return natural is
    variable val     : integer;
    variable index : integer := 0; 
    begin                   
        if(x>0) then
            val := y - x;
            if(val < 0) then
                index := N + val;
            else
                index := val;
            end if;    
        else
            index := y;
        end if;
    return index;
end function;

架构:

architecture Behavioral of Grant_Logic is
    signal s_Priority_Logic : t_Priority_logic;
    signal s_result : std_logic_vector(N-1 downto 0) := (others=>'0');
begin

    s_Priority_Logic(0) <= Priority_Logic0;
    s_Priority_Logic(1) <= Priority_Logic1;
    s_Priority_Logic(2) <= Priority_Logic2;
    s_Priority_Logic(3) <= Priority_Logic3;


    process(s_Priority_Logic)
        variable result : std_logic;
    begin
        for y in 0 to N-1 loop
            result := '0';
            for x in 0 to N-1 loop
                result := result or s_Priority_logic(x)(index(N, x, y));
            end loop;
            gnt_g(y) <= result;
        end loop;
    end process;   

end Behavioral;

@Tricky 使用函数是获取索引值的正确方法。 Alo for generate 不正确,但 for 循环。我编辑了我的问题以显示最终结果