Before I get spamed for this I have done a search and I see there are references to what I'm looking for on www.opencores.org but for some reason I'm unable to connect. What I'm looking for is a resource like, if it existed, Numerical Receipes in HDL (VHDL/Verilog). I have a need for the basic floating point functions like sin( a ) and x ** y. For floating point numbers that are only 12 to 18 bits I can use lookup tables but I was wondering if there was another way of calculating these values. Most of the books I have cover addition/subtraction, multiplication and division but nothing more advance or even hints at how to go about it.>From sin( a ) and x ** y I plan on deriving cos( a ), tan( a ), cot( a), and yth root of x. I'm looking for any helpful or constructive suggestions. Thanks, Derek
Looking for HDL code for sin( a ) and x ** y Functions
Started by ●October 2, 2006
Reply by ●October 2, 20062006-10-02
I had similar issues with opencores until now. It is working now. Derek Simmons wrote:> Before I get spamed for this I have done a search and I see there are > references to what I'm looking for on www.opencores.org but for some > reason I'm unable to connect. > > What I'm looking for is a resource like, if it existed, Numerical > Receipes in HDL (VHDL/Verilog). I have a need for the basic floating > point functions like sin( a ) and x ** y. For floating point numbers > that are only 12 to 18 bits I can use lookup tables but I was wondering > if there was another way of calculating these values. Most of the books > I have cover addition/subtraction, multiplication and division but > nothing more advance or even hints at how to go about it. > > >From sin( a ) and x ** y I plan on deriving cos( a ), tan( a ), cot( a > ), and yth root of x. > > I'm looking for any helpful or constructive suggestions. > > Thanks, > Derek
Reply by ●October 2, 20062006-10-02
for integer implementations the cordic algorithm covers most of the trigonometric functions you need (no multipliers, but some latency) Aurash Derek Simmons wrote:>Before I get spamed for this I have done a search and I see there are >references to what I'm looking for on www.opencores.org but for some >reason I'm unable to connect. > >What I'm looking for is a resource like, if it existed, Numerical >Receipes in HDL (VHDL/Verilog). I have a need for the basic floating >point functions like sin( a ) and x ** y. For floating point numbers >that are only 12 to 18 bits I can use lookup tables but I was wondering >if there was another way of calculating these values. Most of the books >I have cover addition/subtraction, multiplication and division but >nothing more advance or even hints at how to go about it. > >>From sin( a ) and x ** y I plan on deriving cos( a ), tan( a ), cot( a >), and yth root of x. > >I'm looking for any helpful or constructive suggestions. > >Thanks, >Derek > > >-- __ / /\/\ Aurelian Lazarut \ \ / System Verification Engineer / / \ Xilinx Ireland \_\/\/ phone: 353 01 4032639 fax: 353 01 4640324
Reply by ●October 2, 20062006-10-02
If www.opencores.org link does not work, try http://www.opencores.org:8080/ cbr_929rr wrote:> I had similar issues with opencores until now. It is working now. > > Derek Simmons wrote: > > Before I get spamed for this I have done a search and I see there are > > references to what I'm looking for on www.opencores.org but for some > > reason I'm unable to connect. > > > > What I'm looking for is a resource like, if it existed, Numerical > > Receipes in HDL (VHDL/Verilog). I have a need for the basic floating > > point functions like sin( a ) and x ** y. For floating point numbers > > that are only 12 to 18 bits I can use lookup tables but I was wondering > > if there was another way of calculating these values. Most of the books > > I have cover addition/subtraction, multiplication and division but > > nothing more advance or even hints at how to go about it. > > > > >From sin( a ) and x ** y I plan on deriving cos( a ), tan( a ), cot( a > > ), and yth root of x. > > > > I'm looking for any helpful or constructive suggestions. > > > > Thanks, > > Derek
Reply by ●October 2, 20062006-10-02
Hi Derek, Derek Simmons wrote:> I'm looking for any helpful or constructive suggestions.You might have a look at the cordic algorithms. Regards, Norbert Stuhrmann
Reply by ●October 2, 20062006-10-02
> >What I'm looking for is a resource like, if it existed, Numerical > >Receipes in HDL (VHDL/Verilog).Elementary Functions, Algorithms and Implementation by Jean-Michel Muller. No HDL code but the algorithms are there.
Reply by ●October 2, 20062006-10-02
Derek Simmons wrote:> >From sin( a ) and x ** y I plan on deriving cos( a ), tan( a ), cot( a > ), and yth root of x.Integer exponents are pretty straightforward. It is a similar algorithm to multiplication (multiply by 2 and optionally add), but with higher order operations (square and optionally multiply). Integer roots are probably best done by something like Newton-Raphson. Arbitrary powers probably require computing logarithms first. One issue with that is that you can't compute them for negative numbers. If you just want integer roots, computing arbitrary powers probably isn't the best way to do it.
Reply by ●October 2, 20062006-10-02
Derek Simmons wrote:> Before I get spamed for this I have done a search and I see there are > references to what I'm looking for on www.opencores.org but for some > reason I'm unable to connect. > > What I'm looking for is a resource like, if it existed, Numerical > Receipes in HDL (VHDL/Verilog). I have a need for the basic floating > point functions like sin( a ) and x ** y. For floating point numbers > that are only 12 to 18 bits I can use lookup tables but I was wondering > if there was another way of calculating these values. Most of the books > I have cover addition/subtraction, multiplication and division but > nothing more advance or even hints at how to go about it. > >>From sin( a ) and x ** y I plan on deriving cos( a ), tan( a ), cot( a > ), and yth root of x. > > I'm looking for any helpful or constructive suggestions. > > Thanks, > Derek >It really depends on your precision and accuracy requirements. For arbitrarily high precision, CORDIC is the way to go for sin provided you can live with the latency. The other end of the spectrum is a look-up table. There are intermediate solutions which are generally a combination of angular reductions and interpolation that will get you a reasonably high resolution without a huge look-up table. Linear interpolation perhaps the easiest, and can be done with relatively little hardware. A parabolic fit interpolation will get you considerably smaller errors between table entries allowing a finer resolution, and can be done with relatively low hardware complexity. For X**Y, it is easiest to work with normalized floating point as an input, and then using interpolated LUTs. Normalizing limits the range of the tables. For a general purpose trancendental function calculator, your best bet might be a CORDIC-like iterative engine, as CORDIC and CORDIC-like structures can handle trig, hyperbolic trig, logs and exponents, and multiply and divide. So the point is, that there are many ways to skin this cat, and the "best" way depends heavily upon your particular requirements.
Reply by ●October 2, 20062006-10-02
Ray Andraka wrote: By the way, I have a paper on CORDIC on my web site that many have found ot be quite useful. Http://www.andraka.com/papers see: A survey of CORDIC algorithms for FPGA based Computers. I also second the reference to Jean Muller's book elementary functions book for algorithms, although you may have difficulty translating it into hardware.
Reply by ●October 3, 20062006-10-03
Ray, In case your company uses Synopsys tools, there is a very simple solution available in their DesignWare library. They have both hardware as well as simulation models for both the above functions, which can be simply instantiated in the code. If you are not looking for any specific algorithm that implements the functions (and if you have access to the library) then this could be the right solution. -Sourabh Disclaimer: This is not push anyone's marketing agenda; just information about a solution for the given problem.






