Search code examples
for-loopvhdl

How to build for loops in VHDL with higher increment rates?


I would like to transform a C for loop into a for..generate statement in VHDL.

Here is the monster:

for (j = J; j+d < (2 << g); j += 2*d)

My steps so far:

  1. rename j to k to avoid trouble with J
    for (k = J; k+d < (2 << g); k += 2*d)
  2. 2 << g is replaced by 1 << (g+1)
    for (k = J; k+d < (1 << (g+1)); k += 2*d)
  3. 1 << (g+1) is replaced by 2**(g+1)
    for (k = J; k+d < (2**(g+1)); k += 2*d)
  4. make upper bound inclusive: j+d <= (2**g)-1
    for (k = J; k+d <= (2**(g+1))-1; k += 2*d)
  5. iterationen stops at j <= (2**(g+1))-d-1
    for (k = J; k <= (2**(g+1))-d-1; k += 2*d)

VHDL Code so far:

-- outer loops
genK : for k in J to (2**(g+1))-d-1 generate
begin
  -- more generate loops ...
end generate;

How can I transform k += 2*d?

The complete odd-even mergesort algorithm can be found at that SO question.

My next steps:

  1. move the loop range to be zero-based
    for (k = 0; k <= (2**(g+1))-J-d-1; k += 2*d)
  2. increment by is 2*d, but the generate loop has 1. So it must be normalized to 1, by dividing. k must be renamed to kk:
    for (kk = 0; kk <= ((2**(g+1))-J-d-1) / (2*d); kk++)
  3. now k can be restored in the loop:
    k = kk * 2*d + J

VHDL Code so far:

-- outer loops
genK : for kk in 0 to ((2**(g+1))-J-d-1) / (2*d) generate
  constant k  : NATURAL := (kk * 2 * d) + J;
begin
  -- more generate loops ...
end generate;

Solution

  • How about something like:

    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;