Community
cancel
Showing results for 
Search instead for 
Did you mean: 
Altera_Forum
Honored Contributor I
754 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. 

Need your help, 

Thanks
0 Kudos
7 Replies
Altera_Forum
Honored Contributor I
36 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. 

Need your help, 

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)
Altera_Forum
Honored Contributor I
36 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! :)
Altera_Forum
Honored Contributor I
36 Views

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

Altera_Forum
Honored Contributor I
36 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.
Altera_Forum
Honored Contributor I
36 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.
Altera_Forum
Honored Contributor I
36 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
Altera_Forum
Honored Contributor I
36 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.
Reply