Synthesised code is too big for the fpga device - What to
do?
After lot of hard work you completed your HDL project.
The simulation results verified that the code is functionally working. To check
how it performs in hardware you synthesis the design. To your bad luck you
realize that the code you just wrote is too big for the fpga. What can you do?
Don't panic. There are few ways you can tackle this problem.
1) If possible choose a higher graded fpga
device:
It’s a simple but the easiest thing you can do. Check if
the lab or a friend has a better fpga device which can afford your design. If
you really don't want to test the design in hardware, but just want to see the
synthesis results then simply select the largest device available in the list.
2) Is the fpga out of pins?
Sometimes the synthesis tool will give out an "Out
of resources" warning if the design has too many signals in its port list
that the device can't support. This happens when you try to input or output
large arrays or vectors.
In such cases use a multiplexed input or output system.
Rather than inputting everything in one go, do it step wise
3) Changing synthesis tool settings:
By default, the synthesis tool try to optimize your
design for both speed and resource usage. But you can change this setting so
that the tool will optimize for less resource usage. This may reduce the speed
a little, but may significantly reduce the resource usage.
4) Re-use of resources:
Analyze the design carefully and see if any parts of the
design can use time-sharing of resources. To do this you have to synchronize
the whole design with a clock.
Time sharing means using the same resource for similar
kind of operations like addition, multiplication etc. Suppose you want to do an
operation like,
y = a+b+c+d; which uses 3 adder circuits.
then split the above operation over 3 clock cycles like
this,
y= a + b; --in
first clock cycle.
y= y + c; --in
second clock cycle.
y= y + d; --in
third clock cycle.
This way only one adder will be used for the whole operation.
This will increase the time for generating output, but reduces logic usage.
5) Look for any mathematical simplifications:
Analyze the mathematical formula you are implementing and
look for any simplification. For instance take this operation,
y=x / 5;
In digital world, division circuit is bigger than
multiplication circuit. So make a small change in the formula like this,
y = x * (1/5) = x * 0.2;
6) Simplify design based on nature of inputs:
The code may be written for a generic use. But in real
cases, the range of inputs may be small and predictive in nature. In such cases
you can further simply the formula.
One good example is multiplication and division of
variables by a number which is power of 2. If the multiplicand or divisor is a
power of 2, then you can implement it using a left shift or right shift
operation respectively. This is an excellent optimization method in some cases.
No comments:
Post a Comment