生成循环中的变量泛型赋值
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;
我想做的似乎不是特别复杂,但我想不出用 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;