For loop vhdl“;for loop";步长不等于1
我有一个简单的问题。是否可以为步长不等于1(例如16)的循环编写VHDL 循环应该是这样的 0-->16-->32-->48。。。。有价值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范围,并在其中展开循环以生成所需范围:
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;