如何在VHDL-AMS中编写C for循环?

如何在VHDL-AMS中编写C for循环?,vhdl,Vhdl,我正在尝试用VHDL-AMS为C中的loop for编写代码 for (i=0; i<m; i*=k) for(VHDLfor中的i=0;i循环的行为与C中的稍有不同。与C不同,C中的数学是在循环变量上进行的(i),在VHDL中,afor在范围内的每个值上循环步数。通常,VHDL中的循环变量将是一个整数,因此可以在整数范围内的每个值上循环步数。但必须在每个值上循环步数-不能错过它们 那么,如何解决您的问题呢?一种方法是按照建议使用while循环;另一种方法是使用for循环,但在整数范围内

我正在尝试用VHDL-AMS为C中的loop for编写代码

for (i=0; i<m; i*=k)

for(VHDL
for
中的i=0;i循环的行为与C中的稍有不同。与C不同,C中的数学是在循环变量上进行的(
i
),在VHDL中,a
for
范围内的每个值上循环步数
。通常,VHDL中的循环变量将是一个
整数
,因此可以在整数范围内的每个值上循环步数。但必须在每个值上循环步数-不能错过它们

那么,如何解决您的问题呢?一种方法是按照建议使用
while
循环;另一种方法是使用
for
循环,但在整数范围内循环,并对循环变量进行一些计算。因此,在VHDL中,您可以执行以下操作:

for some_other_variable in some_minimum to some_maximum loop
  i :=  -- some function of your some_other_variable
  -- the rest of your code within the loop
end loop;

VHDL-AMS是VHDL-93的超集,因此有理由假设
for
循环的行为方式相同。

在VHDL
for
中,循环的行为方式与C中的稍有不同。与C不同,C中的数学是在循环变量上进行的(
i
),在VHDL中,a
for
范围内的每个值上循环步数
。通常,VHDL中的循环变量将是一个
整数
,因此可以在整数范围内的每个值上循环步数。但必须在每个值上循环步数-不能错过它们

那么,如何解决您的问题呢?一种方法是按照建议使用
while
循环;另一种方法是使用
for
循环,但在整数范围内循环,并对循环变量进行一些计算。因此,在VHDL中,您可以执行以下操作:

for some_other_variable in some_minimum to some_maximum loop
  i :=  -- some function of your some_other_variable
  -- the rest of your code within the loop
end loop;

VHDL-AMS是VHDL-93的超集,因此可以合理地假设
for
循环的行为方式相同。

如果
m
k
的倍数,则可以使用for循环执行此操作。例如:

for i in 0 to (m/k)-1 loop
  -- j = 0, k, 2k, ...
  j := i*k;
  ...
  -- Do something with j
  ...
end loop;
现在,即使
m
不是
k
的倍数,您也可以使用以下方法解决此问题:

for i in 0 to integer(ceil(real(m)/real(k)))-1 loop
  -- j = 0, k, 2k, ...
  j := i*k;
  ...
  -- Do something with j
  ...
end loop;

当然,这假设
m
k
具有静态范围(即非信号)。

如果
m
k
的倍数,则可以使用for循环来实现这一点。例如:

for i in 0 to (m/k)-1 loop
  -- j = 0, k, 2k, ...
  j := i*k;
  ...
  -- Do something with j
  ...
end loop;
现在,即使
m
不是
k
的倍数,您也可以使用以下方法解决此问题:

for i in 0 to integer(ceil(real(m)/real(k)))-1 loop
  -- j = 0, k, 2k, ...
  j := i*k;
  ...
  -- Do something with j
  ...
end loop;

当然,这假设
m
k
具有静态范围(即非信号).

我认为您需要使用
while
来代替。考虑到乘零的特性,这应该得到很好的优化,VHDL等价物是
循环…结束循环;
除非循环修改m,在这种情况下
而m>0循环…结束循环;
我认为您需要使用
while
来代替乘法0的次数,这应该得到很好的优化,VHDL等价物是
循环…结束循环;
除非循环修改m,在这种情况下
而m>0循环…结束循环;
这实际上并没有实现相同的循环(i*k到某个幂),可以简化为一个简单的加法
i:=i+k;
@BrianDrummond你说得对-这是不一样的,是吗?考虑到
i=0
的开头,OP中的示例将永远循环!这实际上并没有实现相同的循环(i*k到某个幂),可以简化为一个简单的加法。
i:=i+k;
@BrianDrummond你说得对,不是吗?考虑到
i=0
的开头,OP中的示例将永远循环!谢谢你的帮助。谢谢你的帮助。