For loop 如何以更高的增量率在VHDL中构建for循环?
我想用VHDL将CFor loop 如何以更高的增量率在VHDL中构建for循环?,for-loop,vhdl,For Loop,Vhdl,我想用VHDL将Cfor循环转换为for..generate语句 这是怪物: for (j = J; j+d < (2 << g); j += 2*d) 如何转换k+=2*d? 可以在那里找到完整的奇偶合并排序算法 我的下一步: 将循环范围移动到零基础 (k=0;k类似于: genK : for k in J to (2**(g+1))-d-1 generate begin gen2d : if ((k - J) mod (2 * d)) = 0 generate
for循环
转换为for..generate语句
这是怪物:
for (j = J; j+d < (2 << g); j += 2*d)
如何转换k+=2*d
?
可以在那里找到完整的奇偶合并排序算法
我的下一步:
(k=0;k类似于:
genK : for k in J to (2**(g+1))-d-1 generate
begin
gen2d : if ((k - J) mod (2 * d)) = 0 generate
-- stuff
end generate gen2d;
end generate;
您可以使用函数生成所需的值列表。在函数内部,您可以使用
while loop
,填充列表并使用exit
语句来中断循环。这样,您可以对循环实现有更多的控制
type integer_vector is array (natural range <>) of integer;
function generate_indexes(J : integer; <some parms> ) return integer_vector is
variable result : integer_vector( some range );
variable index : integer;
variable j : integer;
variable d : integer;
variable g : integer;
begin
while true loop
-- calculate the value for j, d and g
result(index) := j;
if <break condition> then
exit;
end if;
j := j + 2*d;
end loop;
return result;
end function;
type integer\u向量是整数的数组(自然范围);
函数generate_index(J:integer;)返回整数_向量为
变量结果:整数_向量(某些范围);
变量指标:整数;
变量j:整数;
变量d:整数;
变量g:整数;
开始
而真循环
--计算j、d和g的值
结果(指标):=j;
若然
出口
如果结束;
j:=j+2*d;
端环;
返回结果;
末端功能;
然后像这样使用它
genK : for j in generate_indexes(<some parms>) generate
-- code
end generate;
genK:generate_index()generate中的j
--代码
终端生成;
我想这更容易理解和测试代码。不使用for/generate语句,但我认为这应该涵盖大部分算法
while bBreak = false loop
temp1 := j + d; -- store j + d into variable
temp2 := (others => '0'); -- initial set compare value to 0
temp2(g+1) := '1'; -- set the MSB (2 << g)
if temp1 < temp2 then -- compare
bBreak <= true; -- set break variable
else
j <= j + 2*d; -- set j to the new value (j += 2*d)
end
end loop
而bBreak=false循环
temp1:=j+d;--将j+d存储到变量中
temp2:=(其他=>'0');--初始设置比较值为0
temp2(g+1):=“1”;--设置MSB(2)在将循环从C转换为VHDL之前,您能解释一下为什么要这样做吗?您是否使用VHDL实现了排序算法?我已经用VHDL实现了各种排序网络:奇偶排序、双音排序……奇偶合并排序比双音排序需要更少的竞争器,从而在FPGA上提供了更多的空间链接,所以问题有其他实现的链接。我们正在实现一个FPGA框架,我的排序网络是数据密集型工作负载的一个例子。好主意,但我认为不能在范围扩展的情况下使用整数向量。向量应该存储在常量中,每个元素都应该通过循环索引访问。generate语句是在生成的索引值处实例化实体所必需的。您的解决方案遗漏了几点:a)没有信号或变量声明,因为temp2不是整数;b)为什么bBreak
是一个信号而不是像temp1/2
那样的变量?你是对的。我跳过了信号/变量的类型。我假设所有信号/变量都是标准逻辑向量,其中temp1和temp2是变量,bBreak是一个信号。因为你的目标是FPGA,我假设这将在时钟进程中运行=>bBreak可以一个信号。这是我的问题,我无法在(时钟)进程中运行它。排序网络中的元素可能是可交换的。我是否理解了正确的算法,您事先知道要排序的元素数(即在编译时)?并且生成循环用于实例化交换元素(比如:如果in_agenK : for j in generate_indexes(<some parms>) generate
-- code
end generate;
while bBreak = false loop
temp1 := j + d; -- store j + d into variable
temp2 := (others => '0'); -- initial set compare value to 0
temp2(g+1) := '1'; -- set the MSB (2 << g)
if temp1 < temp2 then -- compare
bBreak <= true; -- set break variable
else
j <= j + 2*d; -- set j to the new value (j += 2*d)
end
end loop