Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > VHDL > For..loop with variable range

Reply
Thread Tools

For..loop with variable range

 
 
Dan
Guest
Posts: n/a
 
      11-30-2007

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

 
Reply With Quote
 
 
 
 
KJ
Guest
Posts: n/a
 
      11-30-2007

"Dan" <(E-Mail Removed)> wrote in message
news:finlfc$6h0$(E-Mail Removed)-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


 
Reply With Quote
 
 
 
 
Brian Drummond
Guest
Posts: n/a
 
      11-30-2007
On Fri, 30 Nov 2007 01:28:31 +0100, "Dan" <(E-Mail Removed)> 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


 
Reply With Quote
 
Andy
Guest
Posts: n/a
 
      12-03-2007
On Nov 30, 8:39 am, Brian Drummond <(E-Mail Removed)>
wrote:
> On Fri, 30 Nov 2007 01:28:31 +0100, "Dan" <(E-Mail Removed)> 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
 
Reply With Quote
 
Brian Drummond
Guest
Posts: n/a
 
      12-03-2007
On Mon, 3 Dec 2007 06:40:33 -0800 (PST), Andy <(E-Mail Removed)>
wrote:

>On Nov 30, 8:39 am, Brian Drummond <(E-Mail Removed)>
>wrote:
>> On Fri, 30 Nov 2007 01:28:31 +0100, "Dan" <(E-Mail Removed)> 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
 
Reply With Quote
 
Andy
Guest
Posts: n/a
 
      12-04-2007
On Dec 3, 4:07 pm, Brian Drummond <(E-Mail Removed)>
wrote:
> On Mon, 3 Dec 2007 06:40:33 -0800 (PST), Andy <(E-Mail Removed)>
> wrote:
>
> >On Nov 30, 8:39 am, Brian Drummond <(E-Mail Removed)>
> >wrote:
> >> On Fri, 30 Nov 2007 01:28:31 +0100, "Dan" <(E-Mail Removed)> 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
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
How can I transform source range to destination range that is thesame as source? Lambda C++ 2 07-16-2008 05:18 PM
'ArgumentError: bad value for range' for range of Times David Bird Ruby 1 06-23-2008 12:12 PM
range() is not the best way to check range? Summercoolness@gmail.com Python 46 07-25-2006 08:10 PM
Scene range vs dynamic range Robert Feinman Digital Photography 2 07-04-2005 09:30 PM
Range does not take an Range object. Tomoyuki Kosimizu Ruby 3 11-27-2003 12:42 AM



Advertisments