我知道,变量只允许在进程中使用,但为什么不允许在生成循环中使用它们.合成这样的构建体没有问题,因为它们之前被评估过.
没有这个限制,代码可以更具可读性.
lbl1: for i in data_out'range generate
lbl2a: component comp_a
port map(
clk => clk,
out => out(0)(i)
in_a => data_in(i*w + offset to i*w + w + offset));
lbl2b: component comp_b
port map(
clk => clk,
out => out(1)(i)
in_b => data_in(i*w + offset to i*w + w + offset));
.
.
.
lbl2n: component comp_n
port map(
clk => clk,
out => out(n)(i)
in_n => data_in(i*w + offset to i*w + w + offset));
end generate lbl1;
Run Code Online (Sandbox Code Playgroud)
或者只是写
lbl1: for i in data_out'range generate
variable lower : integer := i*w + offset;
variable upper : integer := i*w + w + offset;
lbl2a: component comp_a
port map(
clk => clk,
out => out(0)(i)
in_a => data_in(lower to upper));
lbl2b: component comp_b
port map(
clk => clk,
out => out(1)(i)
in_b => data_in(lower to upper));
.
.
.
lbl2n: component comp_n
port map(
clk => clk,
out => out(n)(i)
in_n => data_in(lower to upper));
end generate lbl1;
Run Code Online (Sandbox Code Playgroud)
代码不是来自任何一个例子,它可能在任何时候失败,但我认为你明白我的意思.它更容易阅读和维护.生成的变量可能超出生成过程之外的范围.
那么有什么理由为什么这是不允许的,或者它只是以前的vhdl标准的历史人工制品?
如果您想声明某些内容,则需要在声明性区域中.一个generate说法是,它并不需要一个比较特殊begin; 你可以(你有)使用:
GenerateLoop : for i in data_out'range generate
-- Code here
end generate;
Run Code Online (Sandbox Code Playgroud)
如果您想将事物声明为循环的一部分,则必须具有声明性区域,使用generate语句,它将如下所示:
GenerateLoop : for i in data_out'range generate
-- Declarative region
begin
-- Code here
end generate;
Run Code Online (Sandbox Code Playgroud)
您应该能够在此声明区域中声明事物.请注意,您需要使用信号或常量(看起来像常量更合适)而不是变量.
| 归档时间: |
|
| 查看次数: |
871 次 |
| 最近记录: |