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:
Its 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?
Some times 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. Check it out here.
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.
1)If possible choose a higher graded fpga device:
Its 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?
Some times 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. Check it out here.
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.