生成循环中的变量泛型赋值

Variable generic assignment in generate loop

我想做的似乎不是特别复杂,但我想不出用 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 个具有不同索引的单独生成循环),如果是这样,我该怎么做?

正如 user1155120 在评论中提到的,for 循环的基本类型是通用整数。整数除法的小数部分将被截断。您可以使用这个事实来实现您的特定系统,如

  • 对于 0<=i<8,i/8=0
  • 对于 8<=i<15,i/8=1

因此代码可以是

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;

或者,对于更复杂的情况特别有用,您可以按照 Brian Drummond 的建议进行操作:编写一个函数

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;