![]() |
|
|
|
#1 |
|
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 |
|
|
|
|
#2 |
|
Posts: n/a
|
"Dan" <> wrote in message news:finlfc$6h0$... > > 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 KJ |
|
|
|
#3 |
|
Posts: n/a
|
On Fri, 30 Nov 2007 01:28:31 +0100, "Dan" <> 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 Brian Drummond |
|
|
|
#4 |
|
Posts: n/a
|
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 Andy |
|
|
|
#5 |
|
Posts: n/a
|
On Mon, 3 Dec 2007 06:40:33 -0800 (PST), Andy <>
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 Brian Drummond |
|
|
|
#6 |
|
Posts: n/a
|
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 Andy |
|
![]() |
| Thread Tools | Search this Thread |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Passing value with out using variable in query string in PHP! | Ali_ggl | General Help Related Topics | 0 | 11-29-2008 12:22 PM |
| synthesis error | sekhar_kollati | Hardware | 0 | 11-13-2007 04:48 AM |
| Must declare the scalar variable "@Product_ID". | iquad | Software | 0 | 11-10-2007 06:26 AM |
| Variable Scope in asp.Net | jansi_rk | Software | 1 | 09-18-2006 06:05 PM |
| Re: Open Range DVD Review @ GENRE ONLINE.NET! | Justin | DVD Video | 7 | 02-08-2004 06:50 AM |