For loop vhdl“;for loop";步长不等于1

For loop vhdl“;for loop";步长不等于1,for-loop,vhdl,low-level,For Loop,Vhdl,Low Level,我有一个简单的问题。是否可以为步长不等于1(例如16)的循环编写VHDL 循环应该是这样的 0-->16-->32-->48。。。。有价值 非常感谢任何即时帮助我的研究表明没有,但您可以声明第二个变量,作为循环中变量的倍数。一个可能的解决方案是使用所需范围的1/16范围,并在其中展开循环以生成所需范围: for i in 0 to 3 -- Actually 0 to 48 loop x(16*i) <= ... x((16*i)+1) <= ... (...

我有一个简单的问题。是否可以为步长不等于1(例如16)的循环编写VHDL

循环应该是这样的

0-->16-->32-->48。。。。有价值


非常感谢任何即时帮助

我的研究表明没有,但您可以声明第二个变量,作为循环中变量的倍数。

一个可能的解决方案是使用所需范围的1/16范围,并在其中展开循环以生成所需范围:

for i in 0 to 3 -- Actually 0 to 48
loop
    x(16*i) <= ...
    x((16*i)+1) <= ...
    (...)
    x((16*i)+15) <= ...
end loop;
最后,对于第2步或第3步,可以使用嵌套for


但不管怎样,你想完成什么?VHDL是一种低级硬件描述语言,您应该能够实现任何您想要实现的功能,而不必对循环抱有幻想。

VHDL在
for
循环中没有步长参数,因此
to
的步长始终为1 范围方向和-1表示
向下至
范围方向

因此,如果您需要具有起始值和步长值的循环,可以执行以下操作:

...
constant FOR_START : natural := 1;
constant FOR_STEP  : natural := 2;
variable idx_v     : natural;       -- Support index variable
...
for idx_pre in 0 to 3 loop
  idx_v := FOR_START + FOR_STEP * idx_pre;
  z_o(idx_v) <= a_i(idx_v);
end loop;

在整个范围内循环,然后使用“if”语句只对每16个值执行操作,怎么样

for i in start_thing to end_thing loop
  if i mod 16 = 0 then
    do things(i)
  end if;
end loop; -- i
或者交替使用下一步:

for i in start_thing to end_thing loop
  next when i mod 16 /= 0 ;
  do_things(i)
end loop; -- i
是的,可以使用步长不等于1的“for loop”

for i in range 1 downto 0 loop
    foo(i) <= bar(1-i);
end
loop;
用于范围为1到0的循环中的i

福(我)谢谢乔丹。我一直在做同样的事情,直到我得到一个回答说是的,我们可以做。我正在尝试填充一个256位的缓冲区,每个周期16位。使用与使用计数器相同的方法。我想把这个问题公诸于世,也许为了节省一些代码行,我会使用一个从0到16的代码行,并使用我上面写的展开将其转换为0到256。除了那几行额外的字外,我看不出有什么缺点。代码大小是一个主要问题吗?你不能一点一点地做吗?不行。代码大小不是一个大问题。为了我自己的方便,尽量使它紧凑。感谢您的帮助VHDL可能会让组织良好的程序员感到非常沮丧:)如果您满意,请接受答案。@rgcalsaverini,关于您的编辑,如果您使用变量赋值(
:=
)而不是信号赋值(

for i in start_thing to end_thing loop
  if i mod 16 = 0 then
    do things(i)
  end if;
end loop; -- i
for i in start_thing to end_thing loop
  next when i mod 16 /= 0 ;
  do_things(i)
end loop; -- i
for i in range 1 downto 0 loop
    foo(i) <= bar(1-i);
end
loop;