VHDL - 为什么不允许在生成循环中使用变量

时间:2017-11-15 08:25:37

标签: vhdl

我知道,变量只允许在进程中使用,但为什么不允许在生成循环中使用它们。 合成这样的构建体没有问题,因为它们之前被评估过。

在没有此限制的情况下,代码可以更具可读性。

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;

或者只写

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;

代码不是来自任何一个例子,它可能在任何时候失败,但我认为你明白我的意思。它更容易阅读和维护。生成的变量可能超出生成过程之外的范围。

有没有什么理由为什么这是不允许的,或者它只是以前vhdl标准的历史人工制品?

1 个答案:

答案 0 :(得分:6)

如果您想声明某些内容,则需要位于声明性区域。 generate语句有点特殊,因为它不需要begin;你可以(如你所愿)使用:

GenerateLoop : for i in data_out'range generate
  -- Code here
end generate;

如果你想将事物声明为循环的一部分,你必须有一个声明区域,使用generate语句,它将如下所示:

GenerateLoop : for i in data_out'range generate
  -- Declarative region
begin
  -- Code here
end generate;

您应该能够在此声明区域中声明事物。请注意,您需要使用信号或常量(看起来像常量更合适)而不是变量。