For loop 在for循环中使用类似别名的变量

For loop 在for循环中使用类似别名的变量,for-loop,vhdl,alias,For Loop,Vhdl,Alias,是否可以创建别名变量/信号来提高VHDL进程中循环的可读性 例如,考虑下面的模块,该模块包含一个带有 > 循环的进程(代码是示例性的,我还没有测试过): 当然,这是行不通的。那么,有没有办法在VHDL中实现类似的功能,或者我们每次都必须指定完整的信号“路径” 我可以用一个过程来替换循环体,但是必须在文件的(很远的)不同位置声明过程代码会进一步降低可读性。我也可以用来。。。生成construct,但这将为每个迭代创建一个流程,并防止我在迭代中使用公共流程变量。如问题注释所示,这可以通过使用流程变量

是否可以创建别名变量/信号来提高VHDL进程中循环的可读性

例如,考虑下面的模块,该模块包含一个带有<代码> > 循环的进程(代码是示例性的,我还没有测试过):

当然,这是行不通的。那么,有没有办法在VHDL中实现类似的功能,或者我们每次都必须指定完整的信号“路径”


我可以用一个过程来替换循环体,但是必须在文件的(很远的)不同位置声明过程代码会进一步降低可读性。我也可以用
来。。。生成
construct,但这将为每个迭代创建一个流程,并防止我在迭代中使用公共流程变量。

如问题注释所示,这可以通过使用流程变量实现:

  process (clk)
    variable sample : std_logic_vector(9 downto 0);
    variable idx    : integer;
  begin  -- process
    if clk'event and clk = '1' then
      -- Set outData(N) to '1' if at least 1 of the last 10 values of inData(N) was '1'
      for d in data'RANGE loop
        for s in data(0).samples'RANGE loop
          -- Helpers
          sample := data(d).samples(s);
          idx := d * 4 + s;

          outData(idx) <= '0';
          for b in sample'RANGE loop
            if sample(b) = '1' then
              outData(idx) <= '1';
            end if;
          end loop;
          sample(9 downto 1) <= sample(8 downto 0);
          sample(0) <= inData(idx);

          -- Do not forget to apply changes
          data(d).samples(s) <= sample;
        end loop;
      end loop;
    end if;
  end process;
过程(clk)
变量样本:标准逻辑向量(9到0);
变量idx:整数;
开始——过程
如果clk'事件和clk='1',则
--如果inData(N)的最后10个值中至少有1个为“1”,则将数据(N)设置为“1”
对于数据范围循环中的d
对于数据(0)中的s。采样范围循环
--助手
样本:=数据(d)。样本(s);
idx:=d*4+s;

outData(idx)表达式
id*4+s
可以产生超出索引范围
inData
的值,提供无错误的压缩基础,从而可以演示解决方案。For循环语句不允许除循环参数之外的其他声明。注意
idx
sample
可能是包含for循环的声明性区域中的变量,并在for循环中使用参数
s
@user1155120指定,我已修复了该示例以匹配您的备注,谢谢。如果我使用流程变量来实现别名概念,我担心合成工具可能不会将迭代实现为并行路径,因为每次迭代都将取决于变量值,并且每次迭代都会更改该值。我知道值只会在每次迭代开始时改变,因此迭代之间没有依赖关系,但我不确定合成工具是否足够聪明,能够发现……通过展开循环,合成工具可以清楚地发现过程变量值在迭代之间不被重用。Vivado至少生产相同的网@用户1155120谢谢你的建议。如果你想用这个解决方案发布答案,我会接受的。
      -- Set outData(N) to '1' if at least 1 of the last 10 values of inData(N) was '1'
      for d in data'RANGE loop
        for s in data(0).samples'RANGE loop
          alias sample  : std_logic_vector(9 downto 0) is data(d).samples(s);
          constant idx  : integer := d * 4 + s;
        begin
          sample(9 downto 1) <= sample(8 downto 0);
          sample(0) <= inData(idx);
          outData(idx) <= '0';
          for b in sample'RANGE loop
            if sample(b) = '1' then
              outData(idx) <= '1';
            end if;
          end loop;
        end loop;
      end loop;
  process (clk)
    variable sample : std_logic_vector(9 downto 0);
    variable idx    : integer;
  begin  -- process
    if clk'event and clk = '1' then
      -- Set outData(N) to '1' if at least 1 of the last 10 values of inData(N) was '1'
      for d in data'RANGE loop
        for s in data(0).samples'RANGE loop
          -- Helpers
          sample := data(d).samples(s);
          idx := d * 4 + s;

          outData(idx) <= '0';
          for b in sample'RANGE loop
            if sample(b) = '1' then
              outData(idx) <= '1';
            end if;
          end loop;
          sample(9 downto 1) <= sample(8 downto 0);
          sample(0) <= inData(idx);

          -- Do not forget to apply changes
          data(d).samples(s) <= sample;
        end loop;
      end loop;
    end if;
  end process;