For loop 如何以更高的增量率在VHDL中构建for循环?

For 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

我想用VHDL将C
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