For..loop with variable range

D

Dan

Guest
Hi,

I have this piece of code in my design:

function xxxxxx (...) is

[...]

for j in i to length - 1 loop
v(i) := '0';
end loop;

[...]

end xxxxxxx;

In this case 'i' is a variable, so I'm having problems syntesizing the
desing because the for..loop range is variable, not constant.

To make the context clear, the xxxxxx function converts a natural number to
a binary vector by making successive divisions. When the quotient is zero,
the for..loop fills the rest of the vector with 0's.

Any suggestion?

Thanks
 
"Dan" <nomail@noserver.com> wrote in message
news:finlfc$6h0$1@nsnmrro2-gest.nuria.telefonica-data.net...
Hi,

I have this piece of code in my design:

snip
To make the context clear, the xxxxxx function converts a natural number
to a binary vector by making successive divisions. When the quotient is
zero, the for..loop fills the rest of the vector with 0's.

Any suggestion?
Yes, don't reinvent the wheel, use the numeric_std package. Usage snippets
below.

use ieee.numeric_std.all;
.....
signal x: std_logic_vector(...);
signal y: natural range ...;
....
x <= std_logic_vector(to_unsigned(y, x'length));

KJ
 
On Fri, 30 Nov 2007 01:28:31 +0100, "Dan" <nomail@noserver.com> wrote:

Hi,

I have this piece of code in my design:

function xxxxxx (...) is
for j in i to length - 1 loop
v(i) := '0';
end loop;
end xxxxxxx;

In this case 'i' is a variable, so I'm having problems syntesizing the
desing because the for..loop range is variable, not constant.
You have to translate the algorithm into a synthesisable form; and that
means locally constant loop indices

for j in thing'low to thing'high loop
-- looping over all bits in "thing" whatever the range
or simply
for j in 0 to length - 1 loop
Now you have to exclude the bits you don't want using realisable
hardware;
fortunately a comparison operator is realisable
for j in 0 to length - 1 loop
if j >= i then
v(i) := '0';
end if;
It clearly performs the same operation.
Incidentally did you mean v(j) := 0?

- Brian
 
On Nov 30, 8:39 am, Brian Drummond <brian_drumm...@btconnect.com>
wrote:
On Fri, 30 Nov 2007 01:28:31 +0100, "Dan" <nom...@noserver.com> wrote:

Hi,

I have this piece of code in my design:

function xxxxxx (...) is
for j in i to length - 1 loop
v(i) := '0';
end loop;
end xxxxxxx;

In this case 'i' is a variable, so I'm having problems syntesizing the
desing because the for..loop range is variable, not constant.

You have to translate the algorithm into a synthesisable form; and that
means locally constant loop indices



for j in thing'low to thing'high loop
-- looping over all bits in "thing" whatever the range
or simply
for j in 0 to length - 1 loop

Now you have to exclude the bits you don't want using realisable
hardware;
fortunately a comparison operator is realisable

for j in 0 to length - 1 loop
if j >= i then
v(i) := '0';
end if;

It clearly performs the same operation.
Incidentally did you mean v(j) := 0?

- Brian
Another way to get "variable index limit" on a for-loop is with an
exit statement to terminate the loop early. Put the exit statement in
a conditional inside the loop.

Andy
 
On Mon, 3 Dec 2007 06:40:33 -0800 (PST), Andy <jonesandy@comcast.net>
wrote:

On Nov 30, 8:39 am, Brian Drummond <brian_drumm...@btconnect.com
wrote:
On Fri, 30 Nov 2007 01:28:31 +0100, "Dan" <nom...@noserver.com> wrote:

for j in 0 to length - 1 loop
if j >= i then
v(i) := '0';
end if;

Another way to get "variable index limit" on a for-loop is with an
exit statement to terminate the loop early. Put the exit statement in
a conditional inside the loop.
Good one, IF you can realise what you want by exiting early.

Does it synthesise as expected?

It's not so useful if you need a late entry to the loop, as the example
implies. In this case you can reverse the loop direction to get your
early exit, but if both ends were variables, it wouldn't work.

- Brian
 
On Dec 3, 4:07 pm, Brian Drummond <brian_drumm...@btconnect.com>
wrote:
On Mon, 3 Dec 2007 06:40:33 -0800 (PST), Andy <jonesa...@comcast.net
wrote:

On Nov 30, 8:39 am, Brian Drummond <brian_drumm...@btconnect.com
wrote:
On Fri, 30 Nov 2007 01:28:31 +0100, "Dan" <nom...@noserver.com> wrote:
for j in 0 to length - 1 loop
if j >= i then
v(i) := '0';
end if;
Another way to get "variable index limit" on a for-loop is with an
exit statement to terminate the loop early. Put the exit statement in
a conditional inside the loop.

Good one, IF you can realise what you want by exiting early.

Does it synthesise as expected?

It's not so useful if you need a late entry to the loop, as the example
implies. In this case you can reverse the loop direction to get your
early exit, but if both ends were variables, it wouldn't work.

- Brian
Since a for-loop is unrolled in synthesis (that's the reason the index
bounds have to be static), a for-loop with a conditional unrolls to a
series of if-then statements (not nested). Putting an exit statement
in the conditional turns it into an if-elsif-elsif... sequence, so it
jumps to the end when a condition is hit.

Andy
 

Welcome to EDABoard.com

Sponsor

Back
Top