Community
cancel
Showing results for
Did you mean:
Honored Contributor I
755 Views

## How to create a generic sum?

Hello folks,

I'm stuck at the idea how to optimize my code. Hope to get any help from you.

My code is to make a generic sum

y = a(1) + a(2) + a(3);

I would like to make it like:

n <= 3;

process(y)

begin

---for i in 1 to 3 loop

------y <= y + a(i);

---end loop;

end process;

Of course it will cause combinational loop :(

I dont know how to do that sum without rewrite the program.

I meant when I need to change the length of a.

Thanks
Tags (1)
7 Replies
Honored Contributor I
37 Views

--- Quote Start ---

Hello folks,

I'm stuck at the idea how to optimize my code. Hope to get any help from you.

My code is to make a generic sum

y = a(1) + a(2) + a(3);

I would like to make it like:

n <= 3;

process(y)

begin

---for i in 1 to 3 loop

------y <= y + a(i);

---end loop;

end process;

Of course it will cause combinational loop :(

I dont know how to do that sum without rewrite the program.

I meant when I need to change the length of a.

Thanks

--- Quote End ---

Assuming you mean (n) will vary as "generic" per compile then one way is to declare a a large adder to accommodate max (n) then wire up per compile.

e.g.

sum <= A(1) + A(2) +A(3) +A(4) +A(5) + A(6) + A(7); -- 7 is max n

then for a given compile with n set to 3:

for i in 1 to 3 loop

A(i) <= a(i);

end loop;

That way the compiler will optimise off inputs A(4) ~ A(7)
Honored Contributor I
37 Views

--- Quote Start ---

Assuming you mean (n) will vary as "generic" per compile then one way is to declare a a large adder to accommodate max (n) then wire up per compile.

e.g.

sum <= A(1) + A(2) +A(3) +A(4) +A(5) + A(6) + A(7); -- 7 is max n

then for a given compile with n set to 3:

for i in 1 to 3 loop

A(i) <= a(i);

end loop;

That way the compiler will optimise off inputs A(4) ~ A(7)

--- Quote End ---

Thanks a lot! :)
Honored Contributor I
37 Views

To work as expected, the loop must use a variable instead of a signal. Otherwise only the last iteration will be performed.

Honored Contributor I
37 Views

--- Quote Start ---

To work as expected, the loop must use a variable instead of a signal. Otherwise only the last iteration will be performed.

--- Quote End ---

Thanks. I realize that a very good way to do it is to use structural. Then, I just connect them together. It's also for obviously programming

I'll build a library for a adder.
Honored Contributor I
37 Views

--- Quote Start ---

Thanks. I realize that a very good way to do it is to use structural. Then, I just connect them together. It's also for obviously programming

I'll build a library for a adder.

--- Quote End ---

No need to create an adder entity and use a generic. Its a lot more cumbersome. THe for loop will work best.
Honored Contributor I
37 Views

--- Quote Start ---

No need to create an adder entity and use a generic. Its a lot more cumbersome. THe for loop will work best.

--- Quote End ---

Yeah, that's right. Thanks :D

P.S: I'm working on DSP applications, so in case of those sums are multipliers, it would be great for later optimization to use structural, isn't it?

Thanks again you 2
Honored Contributor I
37 Views

it really depends, mainly on your clock speed. normal VHDL:

a <= b*c;

will work perfectly well at infering multipliers at slower speeds (like up to 250MHz). But if you need to push the multiplier to the limits, you need to be using the megawizard multiplier as inference wont take into account all optimisations.

Also remember you should only do 1 mult per clock.