Универсальное присваивание переменной в цикле генерации - PullRequest
0 голосов
/ 02 мая 2018

То, что я хочу сделать, не кажется особенно сложным, но я не могу придумать простой способ сделать это в VHDL.

У меня есть компонент с общим параметром, который называется FOO. Я хотел бы сгенерировать 16 из этих компонентов, и для первых 8 экземпляров я хочу, чтобы FOO было установлено на 0, а для других 8 экземпляров, которые я хочу, FOO должен быть установлен на 4096.

В идеале я мог бы сделать что-то вроде этого:

generate_loop: for I in 0 to 15 generate
begin
  comp_inst: my_component
  generic map
  (
    FOO => 0 when I < 8 else 4096
  )
  port map
  (
  ...
  );
end generate;

Это, конечно, недопустимый VHDL, но он отражает идею того, что я хотел бы сделать.

Итак, мой вопрос: есть ли способ реализовать это в одном цикле генерации (т.е. без необходимости иметь 2 отдельных цикла генерации с разными индексами), и если да, то как мне это сделать?

1 Ответ

0 голосов
/ 04 мая 2018

Как пользователь1155120 упоминает в комментариях, базовый тип цикла for является универсальным целым числом. Дробная часть целочисленного деления будет усечена. Вы можете использовать этот факт для реализации вашей конкретной системы, как

  • для 0 <= i <8, i / 8 = 0 </li>
  • для 8 <= i <15, i / 8 = 1 </li>

Таким образом, код может быть

generate_loop: for I in 0 to 15 generate
begin
    comp_inst: entity work.my_component
        generic map (FOO => 4096 * (I/8))
        port map (
            ...
            );
end generate;

В качестве альтернативы, особенно полезной для более сложных ситуаций, вы можете сделать то, что предложил Брайан Драммонд: написать функцию

architecture arch of ent is
    function gen_FOO(I : natural) return natural is begin
        if I<8 then
            return 0;
        else
            return 4096;
        end if;
    end function;
begin
    generate_loop: for I in 0 to 15 generate
    begin
        comp_inst: entity work.my_component
            generic map (FOO => gen_FOO(I))
            port map (
                ...
                );
    end generate;
...